Probleme de chaine

Signaler
Messages postés
76
Date d'inscription
mardi 6 avril 2004
Statut
Membre
Dernière intervention
22 décembre 2012
-
Messages postés
76
Date d'inscription
mardi 6 avril 2004
Statut
Membre
Dernière intervention
22 décembre 2012
-
Bonjour à tous,

Je suis en train de faire un petit programme en c et je souhaiterai utilisé un pointeur de caractere mais dev cpp me sort cette erreur :

 E:\Dev-Cpp\*****[Warning] excess elements in array initializer

Voici ce que j'utilise :

char *chemin[3] = {"chaine1", "chaine2", "chaine3", "chaine4"};

Ce qui est bizzard c'est qu'au debut sa marché tres bien et d'un coups sa marche plus.

Merci

13 réponses

Messages postés
64
Date d'inscription
lundi 20 octobre 2003
Statut
Membre
Dernière intervention
1 juillet 2010
2
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.

char *chemin[4] = {"chaine1", "chaine2", "chaine3", "chaine4"};

char *chemin[3] = {"chaine1", "chaine2", "chaine3"};
Mad Love Disease
Messages postés
76
Date d'inscription
mardi 6 avril 2004
Statut
Membre
Dernière intervention
22 décembre 2012

Je croyais qu'on devait compter le 0
donc:
chemin[0]
chemin[1]
chemin[2]
chemin[3]

Cela fais bien 4 éléments je me trompe?
Messages postés
16
Date d'inscription
lundi 8 octobre 2007
Statut
Membre
Dernière intervention
23 novembre 2007

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.
Messages postés
64
Date d'inscription
lundi 20 octobre 2003
Statut
Membre
Dernière intervention
1 juillet 2010
2
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)

@ +
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
Yop,

aie aie aie

char *chemin[3] = {"chaine1", "chaine2", "chaine3", "chaine4"};

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 :

for(i=0;i<3;++i)
{
   chemin[i] = (char *) malloc(sizeof(char)*11);
}

par exemple.

Voila tu as tt les atous en main.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
Messages postés
16
Date d'inscription
lundi 8 octobre 2007
Statut
Membre
Dernière intervention
23 novembre 2007

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.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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[] = ...

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Oups, la première chaine entré n'est pas "chemin1" mais "chaine1"

C++ (@++)<!--
Messages postés
16
Date d'inscription
lundi 8 octobre 2007
Statut
Membre
Dernière intervention
23 novembre 2007

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]; }
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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'

C++ (@++)<!--
Messages postés
76
Date d'inscription
mardi 6 avril 2004
Statut
Membre
Dernière intervention
22 décembre 2012

Merci a tous de vos reponses

Je vois que cela n'est pas vraiment claire j'ai donc fait un test.

char *chemin[3] = {"chaine1", "chaine2", "chaine3"};
printf ("%s", chemin[0]);

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
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Ben, même erreur que précédemment.
Ton tableau ne peut contenir que 2 pointeurs mais tu lui en donne 3. Logiquement, ça ne passe pas.

C++ (@++)<!--
Messages postés
76
Date d'inscription
mardi 6 avril 2004
Statut
Membre
Dernière intervention
22 décembre 2012

En effet je suis saut defois merci [auteur/SAKINGDOM/617077.aspx SAKingdom]