[C++ Builder] Les != types de chaînes (string, AnsiString, char, etc..

Les != types de chaînes (string, AnsiString, char, etc.. [C++ Builder] - Programmation

Marsh Posté le 25-02-2002 à 16:29:36    

Bonjour, j'ai fais un topic hier qui ressemble à celui-ci, mais j'en refais un autre un peu différend. Là j'azimerais que vous me donniez votre avis :
 
Quel est le type de chaîne de cara (mail ... non pas drôle :-() qu'il vaut mieux utiliser, j'aimerais rester le plus possible dans du vrai C++. Il me semble que AnsiString est propre à Borland, je suis donc obligé de l'utiliser pour récupérer le contenu d'un Edit par ex (Edit1->Text), mais sinon le type string est-il plus portable(je pense notamment à nunux). Quelle est la différence avec AnsiString.
 
Aussi pour les API, souvent sont demandées des pointeur vers du type char. Comment utiliser au mieux ce type SVP ???
 
Voilà c'était tout, merci de vos réponses...
En attendant je vais faire une recherche sur le forum pour essayer de grapiller des réponses, mais ça va être dur ! :hello:


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 25-02-2002 à 16:29:36   

Reply

Marsh Posté le 25-02-2002 à 16:41:37    

je vois pas pourquoi tu devais refaire un autre topic  :non:  
http://forum.hardware.fr/forum2.ph [...] p=1&trash=
 
sinon si tu veux absolument un truc multiplateformes c'est soit les char *, soit la classe string de la STL
 
mais si tu utilises des fonctions de Borland ou les objets de la VCL, autant aussi utiliser les AnsiString.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 25-02-2002 à 16:59:09    

Salut,
 
Donc si j'éai bien compris, la VCL c'est du pur Borland, donc somme toute peut portable (oui je sais ya kylix, mais bon ...), et AnsiString fait partie de cette VCL, alors que la STL est plus portable, string en fait partie, c'est ça ???
 
Que veut dire STL ? Comment différencier les fonctions de la STL et celles de la VCL ? Ya la STL sous nunux ? :jap:


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 25-02-2002 à 17:17:20    

STL c'est à 100% la norme C++
seul probleme parfois les implantations sont
incompatibles d'un vendeur a l'autre
et certaines ne respectent pas a 100%
la norme.
Parfois le format de chaine est
suggere par le type de librairie que tu
utilises. Si tu utilises VCL
pour gerer l'affichage il est probable
que tu seras tente d'utiliser le type
chaine de Borland, sachant
que le passage de l'une a l'autre n'est
pas forcement immediat.
 
Si tu veux faire du vrai C++, laisse
tomber l'affichage graphique
(tout ce qui est affichage est soit
platform-dependant soit vendor-dependant)
 
A+
LEGREG

Reply

Marsh Posté le 25-02-2002 à 17:29:13    

Salut legreg,
 
non en fait je sais je suis pas clair mais je m'explique :  
 
Je veux faire en effet du vrai C++, mais ça me dérange pas de faire aussi du visuel, à condition de bien séparer les 2 aspects de la programmation. Quand j'utilise une fonction, etc... qui n'est pas du vrai C++, que je le sache !
Faire bien la distinction entre le C++ et le visuel, donc !
Comme ça lorsque je veux faire des applis consoles, ou bien sous nunux non-graphique, je suis pas perdu (pas de réactions du style : "merde le type AnsiString marche pas !!!!" ).
 
Voilà mais à notre époque c'est de plus en plus dur.
 
Tu sais je suis juste en terminale, je suis un gamin d'à peine 18 ans ! à l'école on commence à apprendre le VB !!! Tu vois un peu l'horreur, je préfère commencer par apprendre moi -même à programmer avec un vrai langage (Pascal, C++), puis ensuite faire du visuel, en faisant bien la distinction. C'est ce que j'essaye de faire, j'ai achté par ex un livre sur le C++, et non le C++ Builder... Malheureusement à notre époque j'ai l'impression qu'on mélange tout, comme si le visuel était de la progra  :cry:  :cry:  :cry:  
 
Je sais pas si t'as compris car mon esprit est un peu tordu %-)
 
@+


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 25-02-2002 à 17:59:15    

c'est très bien :jap:
STL c'est du vrai C++, tu retrouves ça un peu partout, sur toutes les plateformes normalement...
AnsiString c'est un truc de Borland, tout comme VCL/CLX
CString c'est un truc de Microsoft, tout comme MFC
j'ai l'impression de me répéter là, mais que dire de plus :??:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 26-02-2002 à 12:19:58    

merci c'est bon je pense avoir totalement assimilé tout ça ...
 
encore une question :
 
Bonjour,
 
Quel est l'intérêt d'utiliser un pointeur pour créer une chaîne de caractères ?
A part pour les API ...
Et donc quelle sont les différences entre ces 5 méthodes ?
Celle qui m'intrigue (mais pourquoi ça marche ???) est la 3 eme, puisque chaine3[] est de type char, qui ne peut contenir que un chiffre ('c', par ex), or je met un mot entre guillemets et ça marche !!!
La 4 aussi d'ailleurs, j'ai lu qu'il n'y a pas de type chaîne en C++. Donc à part avec l'utilisation de string.h et de son strcpy(); , je comprends pas pourquoi le fait de mettre un mot en entier entre guillemets marche !
Oui je sais je suis chiant depuis 2 jours avec ce style de question sur les chaînes en C++, mais ça me trotte vraiment, j'utilise sans connaître à fond et ça m'énerve !!! :cry:  :cry:  :cry:  :cry:  
 
 
//méthode1
char chaine1[] = {'c', 'a', 'l', 'c', '\0'};
              //OK là je comprends bien c'est évident
 
//méthode2
char chaine2[5];
strcpy(chaine2, "calc" );
              //OK là je comprends bien c'est évident
 
//méthode3
char chaine3[] = "calc";
              // Mmmmhhh !!!! Mystérieux !
 
//méthode4
char *chaine4 = "calc";
              // Mmmmhhh !!!! Mystérieux !
 
//méthode5
char *chaine5;
chaine5 = "calc";
              // Oui je sais c'est comme la 4, on est d'accord !
 
 
 
//On s'amuse comme on peut...
ShellExecute(Handle, NULL, chaine1, NULL, NULL, SW_SHOW);
ShellExecute(Handle, NULL, chaine2, NULL, NULL, SW_SHOW);
ShellExecute(Handle, NULL, chaine3, NULL, NULL, SW_SHOW);
ShellExecute(Handle, NULL, chaine4, NULL, NULL, SW_SHOW);
ShellExecute(Handle, NULL, chaine5, NULL, NULL, SW_SHOW);
 
 
 
J'ai pas trouvé non plus comment mettre une pause dans le programme... :hello:


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 26-02-2002 à 13:43:29    

Citation :

//méthode1
char chaine1[] = {'c', 'a', 'l', 'c', '\0'};
       //OK là je comprends bien c'est évident


un tableau de caractères initialisé, terminé par un \0, ce qui fait une chaîne C
 

Citation :

//méthode2
char chaine2[5];
strcpy(chaine2, "calc" );
       //OK là je comprends bien c'est évident


tableau de 5 caractères dans lequel on copie une chaine
 

Citation :

//méthode3
char chaine3[] = "calc";
       // Mmmmhhh !!!! Mystérieux !


un tableau de caractères initialisé, donc idem que 1 sauf que le fait d'utiliser des " " rajoute un \0 à la fin
 

Citation :

//méthode4
char *chaine4 = "calc";
       // Mmmmhhh !!!! Mystérieux !


idem que cas ci-dessus. Un tableau est un pointeur
 

Citation :


//méthode5
char *chaine5;
chaine5 = "calc";
       // Oui je sais c'est comme la 4, on est d'accord !


non c'est pas comme le 4
je pense pas que le compilateur l'accepte.
chaine5 est un pointeur ne pointant vers rien : pas d'espace mémoire prévu
et je ne sais plus si le C accepte d'assigner une chaine, mais je ne pense pas...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-02-2002 à 08:22:12    

Salut,
 
si bien sûr j'ai testé, et la méthode 5 marche ! J'ai créé le pointeur, puis je l'ai initialsé juste après !!! (n'oublie pas c'est du C++, pas du C !)  ce qui m'intriguait surtout c'était la 3. Donc tu dis que le fait de mettre un mot complet entre guillemet sert à mettre un '\0' automatiquement à la fin...OK
Quelle est la != entre
 
char chaine3[] = "calc";  
 
et
 
char chaine3[];
chaine3 = "calc"; //marche pas ! pq ?
 
@++


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 27-02-2002 à 09:21:52    

bhen char chaine3[]; il ne connait pas la taille du tableau
 
et tu dis que tu peux l'initialiser juste après, moi ça me paraît quand même bizarre et risqué :/

 

[jfdsdjhfuetppo]--Message édité par antp--[/jfdsdjhfuetppo]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-02-2002 à 09:21:52   

Reply

Marsh Posté le 27-02-2002 à 09:34:08    

antp a écrit a écrit :

[quote]
...




 
juste une note sur les cas 4 et 5 qui devraient au minimum generer un warning !
 
dans les autres cas on initialise un tableau, c'est a dire qu'on copie des donnees
 
dans les cas 4 et 5 on initialise des pointeurs, c'est dire qu'on copie une adresse...
 
ce qui veut dire que si on utilise les cas 4 ou 5 dans une fonction puis qu'on modifie la chaine, un appel suivant de la fonction et le pointeur sera initialise avec la meme chaine, celle-la meme qui a ete modifiee...
 
le compilateur devrait donc vous signaler que une chaine entre "" n'est pas assimilable a char *, mais plutot a const char* de maniere a ce que cette chaine ne puisse etre modifiee...
 
C'est en general un warining ou une erreur (future) donc non bloquante, mais utile a signaler...

Reply

Marsh Posté le 27-02-2002 à 09:51:38    

juste, j'avais oublié ça  :jap:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed