mad_love_disease
Messages postés64Date d'inscriptionlundi 20 octobre 2003StatutMembreDernière intervention 1 juillet 20103 15 nov. 2007 à 08:16
Tu specifie la taille de ton tableau de charactere a 3, et tu l`initialise avec 4 elements, donc le compilateur te dit que l`initialisation de ta liste comporte trop d`elements:
donc soit tu modifie la taille de ton tableau a 4, soit tu enleve chaine 4 de ton initialisation.
fatenov
Messages postés16Date d'inscriptionlundi 8 octobre 2007StatutMembreDernière intervention23 novembre 2007 15 nov. 2007 à 16:30
oui c'est bien cela, en c on commence les indices à partir de zero.
Mais dans la déclaration des tableaux, on fait avec le nombre l'élements.
Essai ce que t'as proposé Mad.
mad_love_disease
Messages postés64Date d'inscriptionlundi 20 octobre 2003StatutMembreDernière intervention 1 juillet 20103 15 nov. 2007 à 16:56
Bonsoir a tous,
Effectivement, vous avez tous les deux raisons. jb212121 tu a bien 4 elements dans ton exemple donc tu declarera ton tableau ainsi: char * tab[4];
Les indices et la taille sont deux choses differentes, c pourquoi lorsque tu parcoures un tableau tu as:
for( n = 0 ; n < taille de ton tableau ; n++ )
et non pas n < ou =, dans ce cas la tu essayeras d`avoir l`element taille +1 de ton tableau. C`est exactement le meme probleme lors de l`initialisation (dans ton premier message)
@ +
Vous n’avez pas trouvé la réponse que vous recherchez ?
c'est quoi ça ? Dans ce genre de situation il faut que tu te représente ce que c'est. Ici tu à un tableau de pointeur char * on est bien daccord. Maintenant imagine, tu fait chemin[0] , il contient quoi ? nulle ne le sait, en fait la tes pointeur de chaine de caractère ne pointe sur rien. Il faut donc allouer de la mémoire. 2 possibilité s'offre à toi si tu n'aime pas ou est pas encore au point avec les alloc de mem :
char chemin[3][11]; voila la tu as un tableau qui peut contenir 3 chaines de caractère de 10 caractère max (oui n'oublie pas le 0 de fin de chaine).
La deuxième, et la meilleur dans ce cas, l'allocation dynamique :
fatenov
Messages postés16Date d'inscriptionlundi 8 octobre 2007StatutMembreDernière intervention23 novembre 2007 15 nov. 2007 à 20:42
Bravo deck_bsd, t'es le plus attentif ( j'ai pas fait atention pour le char*)
Mais je voulai juste ajouter à (jb21^3) que la méthode de malloc est intéressante car la taille de la chaîne peut être variable pour chaque chaîne en fonction de la longueur du mot que tu veux y mettre (le 11 dans notre cas qui pourra être le nom d'une variable dans ton prog) au contraire d'un tableau statique là où tout est fixé à la déclaration du tableau.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 15 nov. 2007 à 20:58
deck_bsd >> faire
char *chemin[3] = {"chaine1", "chaine2", "chaine3"};
fonctionne parfaitement.
chemin[0] pointe sur la première chaine entrée donc ici, "chemin1".
La solution a été apporté. Si chemin contien 4 chaines, alors chemin doit pouvoir contenir 4 pointeur.
char *chemin[4] = ...
ou alors
char *chemin[] = ...
fatenov
Messages postés16Date d'inscriptionlundi 8 octobre 2007StatutMembreDernière intervention23 novembre 2007 15 nov. 2007 à 21:10
char * c'est un pointeur sur char (UN caractère) non pas un pointeur sur string (chaîne de caractères). Donc si on fait ça : char *chemin[3] = {"chaine1", "chaine2", "chaine3"};
on aura chemin[0]=c
chemin[1]=h
chemin[2]=m
et ainsi de suite.
Si on veut accéder à "chaine1" et "chaine2"ce sera dans une autre variable
char* ch1[8], *ch2[8]; /* faire attention au mysrérieux 0 de fin de chaîne */
for(i=0;i<8;i++) {ch1[i]=chemin [i];
ch2[i] = chemin [8+i]; }
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 15 nov. 2007 à 21:20
Nope pas du tout.
char *chemin[] est un tableau de pointeurs
chemin[0] = premier pointeur du tableau. Ici, ce pointeur pointe sur "chaine1".
chemin[0][0] = premier caractere de la première chaine donc 'c'
Cela me retourne bien chaine1 et Dev cpp ne me signale aucun warning.
Donc on a bien des pointeurs sur chaines.
Merci [auteur/SAKINGDOM/617077.aspx SAKingdom] tu étais dans le vrai.
A préciser quand meme une chose que je ne comprend pas trop c'est que lorsque je fais sa char *chemin[2] = {"chaine1", "chaine2", "chaine3"};
Dev cpp me dit E:\Dev-Cpp\XXX [Warning] excess elements in array initializer
alors que logiquement je devrais obtenir
chemin[0] =chaine1
chemin[1] =chaine2
chemin[2] =chaine3
Si quelqu'un a une explication je me coucherais moins béte