chaînes de caractères (char *) [c++] - Programmation
Marsh Posté le 27-06-2002 à 16:10:40
juju_le_barbare a écrit a écrit : char *a; ou char *a = new char[255]; ??? Quelle est la différence ? |
le premier c'est un pointeur non initialisé (tu peux pas l'utiliser tant que tu n'y as pas assigné quelque chose)
le second est un pointeur vers 255 octets, pouvant contenir une chaine de 254 caractères + un 0 par exemple.
Marsh Posté le 27-06-2002 à 16:15:34
des variables globales, C po terrible
si t'as po bcp de valeurs, tu peut faires des passages par references :
void toto(int in1, int in2, int &ou1, int &out2)
{
out1 = in1;
out2 = in2;
}
void pouet()
{
int var1=1;
int var2=2;
int var3=0;
int var4=0;
toto(var1, var2, var3, var4);
===> var3 vaut maintenant 1 et var4 vaut 2
Marsh Posté le 27-06-2002 à 16:18:26
el_gringo a écrit a écrit : ...et ça voulait faire un défragmenteur ! |
hi hi
encore une question, j'ai une chaîne de caractères sur plusieurs lignes ('\n', comment l'afficher
sous C++ Builder dans une ListBox par exemple ?
Marsh Posté le 27-06-2002 à 16:22:21
juju_le_barbare a écrit a écrit : hi hi encore une question, j'ai une chaîne de caractères sur plusieurs lignes ('\n', comment l'afficher sous C++ Builder dans une ListBox par exemple ? |
Comment ça !?
T'as bien déja fait ça, g vu le 2, 3 trucs que t'as déja programmé, t'as déja affiché du texte ds un champ de texte, non !?
ds une list box, sous C++ Builder, y doit falloir utiliser un TListBox (je sais pas, moi j'utilise VC++, ms bon, j'imagine que c ça.
Et comme membre de ta TListBox, tu dois avoir un AddString, ou qqeu comme ça !
Marsh Posté le 27-06-2002 à 16:26:33
juju_le_barbare a écrit a écrit : hi hi encore une question, j'ai une chaîne de caractères sur plusieurs lignes ('\n', comment l'afficher sous C++ Builder dans une ListBox par exemple ? |
Listbox1->Items->Text = chaine;
Items était un TStringList, la propriété Text utilise le retour de ligne comme délimiteur entre les chaînes.
Marsh Posté le 27-06-2002 à 16:27:19
Les réponses sont en bleu :
juju_le_barbare a écrit a écrit : salut les développeurs ! Dites pour une chaîne de caractères, vaut-il-mieux utiliser char *a; ou char *a = new char[255]; ??? <<< Quelle est la différence ? Je crois que lorsqu'on choisit la 2eme solution, on peut modifier la chaîne avec strcpy(); Un pointeur char* a pointe sur une zone mémoire. Si tu veux y stocker des caractères (ou autre) il faut réserver l'espace mémoire avec new. C'est ça ? Et je suis obligé de détruire avec delete [] a; ??? OUI Si je le fais pas la mémoire va rester occupée je me trompe ? C'est grave ? OUI Et pour passer une chaîne de caractères à une fonction, faut-il vraiment passer aussi le nombre d'éléments de ce tableau ? OUI Pour passer un tableau standard de int par exemples, on doit passer le nombre (avec 'sizeof(a)/sizeof(a[0])' car la fonction qui le récupère n'a pas de moyen de récupérer le nombre d'éléments du tableau, par contre dans le cas d'une chaine de caractères, le dernier élément du tableau est '\0' donc la fonction qui récupère la chaîne le sait très bien et lit la chaîne jusqu'à rencontrer '\0'. Par contre la fonction qui récupère la chaîne peut modifier que jusqu'au rang du '\0', pas plus, c'est ça ? T'as une fonction qui s'appelle strlen qui rend la taille d'une chaine jusqu'au '\0' Et aussi si j'ai besoin de stocker plusieurs chaînes de cractères j'utilise char **a; ? OUI Mais comment j'utilise l'opérateur new ici ? Ensuite chaque chaîne c'est a[0], a[1], a[2], ... ??? char** tableauDeChaine = NULL; tableauDeChaine = new char*[nbDeChaine]; // reserve le tableau de pointeurs tableauDeChaine[0] = new char[tailleDeChaine]; // reserve une chaine La syntaxe du C++ est orthogonal, tu peux faire des tableaux de tableaux de tableaux etc... sur le même principe Encore une question, j'ai des fonctions qui doivent renvoyer plusieurs résultats. Comme ce n'est pas possible, j'ai dans ce cas créé plusieurs variables globales, que les fonctions modifient au nécéssaire. C'est une bonne méthode ou ya mieux ? LES VARIABLES GLOBALES : C'EST MAL/INTERDIT/SALE/INDEBUGGABLE juju |
Marsh Posté le 27-06-2002 à 16:28:06
el_gringo a écrit a écrit : Comment ça !? T'as bien déja fait ça, g vu le 2, 3 trucs que t'as déja programmé, t'as déja affiché du texte ds un champ de texte, non !? ds une list box, sous C++ Builder, y doit falloir utiliser un TListBox (je sais pas, moi j'utilise VC++, ms bon, j'imagine que c ça. Et comme membre de ta TListBox, tu dois avoir un AddString, ou qqeu comme ça ! |
OK mais c'est de type AnsiString, et dans ce cas le '\n' ne représente rien d'autre qu'un caractère du style '|' en gras, mais pas un saut de ligne !
Mais je peux me débrouiller, je voulais juste savoir si il existe pas une solution propre !
Marsh Posté le 27-06-2002 à 16:30:12
juju_le_barbare a écrit a écrit : OK mais c'est de type AnsiString, et dans ce cas le '\n' ne représente rien d'autre qu'un caractère du style '|' en gras, mais pas un saut de ligne ! Mais je peux me débrouiller, je voulais juste savoir si il existe pas une solution propre ! |
C'est juste à l'affichage que ça foire.
Et encore, ça dépend dans quoi tu l'affiches (genre TEdit qui supporte pas les retour de ligne)
Rien à voir avec le fait que ce soit une AnsiString.
cf la méthode que j'ai donné plus haut.
Marsh Posté le 27-06-2002 à 16:46:23
juju_le_barbare a écrit a écrit : OK mais c'est de type AnsiString, et dans ce cas le '\n' ne représente rien d'autre qu'un caractère du style '|' en gras, mais pas un saut de ligne ! Mais je peux me débrouiller, je voulais juste savoir si il existe pas une solution propre ! |
Et au passage, sous windows, le retour à la ligne, c'est pas \n, mais \r\n
Marsh Posté le 27-06-2002 à 16:53:44
juju_le_barbare a écrit a écrit : Encore une question, j'ai des fonctions qui doivent renvoyer plusieurs résultats. Comme ce n'est pas possible, j'ai dans ce cas créé plusieurs variables globales, que les fonctions modifient au nécéssaire. C'est une bonne méthode ou ya mieux ? |
Ce que je fais, c'est passer les variables par adresse (ie: pointeur) si les types de données sont complexes (tableau, structure, etc...) ou si les variables doivent être modifiées par la procédure appelée.
Sinon, j'utilise un passage par valeur.
PS: Et je confirme, les variables globales, c'est bad
Marsh Posté le 27-06-2002 à 16:55:42
kizkoool a écrit a écrit : Ce que je fais, c'est passer les variables par adresse (ie: pointeur) si les types de données sont complexes (tableau, structure, etc...) ou si les variables doivent être modifiées par la procédure appelée. Sinon, j'utilise un passage par valeur. |
merci à vous tous. Par contre '\n' marche très bien pas besoin du retour chariot '\r' ...
@++
Marsh Posté le 27-06-2002 à 17:06:30
juju_le_barbare a écrit a écrit : merci à vous tous. Par contre '\n' marche très bien pas besoin du retour chariot '\r' ... @++ |
...ça dépend des contrôles que t'utilises.
ça coute rien et c plus sur de le mettre !
Marsh Posté le 27-06-2002 à 18:20:07
el_gringo a écrit a écrit : ...ça dépend des contrôles que t'utilises. ça coute rien et c plus sur de le mettre ! |
Marsh Posté le 27-06-2002 à 16:08:43
salut les développeurs !
Dites pour une chaîne de caractères, vaut-il-mieux utiliser
char *a;
ou
char *a = new char[255]; ???
Quelle est la différence ?
Je crois que lorsqu'on choisit la 2eme solution, on peut modifier la chaîne avec strcpy(); ou bien manuellement avec
a[5] = 'a';, sachant qu'on ne doit pas dépasser 255 caractères, alors que si on n'ititialise pas avec new, a est un pointeur
vers un tableau de 0 éléments, et donc à la moindre tentative d'écriture dans ce tableau on écrase des zones mémoires ...
Ce qui provoque une erreur lors de l'utilisation de strcpy(); par exemple...
C'est ça ?
Et je suis obligé de détruire avec delete [] a; ???
Si je le fais pas la mémoire va rester occupée je me trompe ? C'est grave ?
Et pour passer une chaîne de caractères à une fonction, faut-il vraiment passer aussi le nombre d'éléments de ce tableau ?
Pour passer un tableau standard de int par exemples, on doit passer le nombre (avec 'sizeof(a)/sizeof(a[0])' car la fonction
qui le récupère n'a pas de moyen de récupérer le nombre d'éléments du tableau, par contre dans le cas d'une chaine de
caractères, le dernier élément du tableau est '\0' donc la fonction qui récupère la chaîne le sait très bien et lit la chaîne
jusqu'à rencontrer '\0'. Par contre la fonction qui récupère la chaîne peut modifier que jusqu'au rang du '\0', pas plus, c'est ça ?
Et aussi si j'ai besoin de stocker plusieurs chaînes de cractères j'utilise char **a; ?
Mais comment j'utilise l'opérateur new ici ?
Ensuite chaque chaîne c'est a[0], a[1], a[2], ... ???
Encore une question, j'ai des fonctions qui doivent renvoyer plusieurs résultats. Comme ce n'est pas possible, j'ai dans ce cas
créé plusieurs variables globales, que les fonctions modifient au nécéssaire. C'est une bonne méthode ou ya mieux ?
Merci de votre aide
juju
---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com