[C] strcpy et tableau 2D alloué dynamiquement
Posté le 03/09/2012 03:50
J'aimerais faire un tableau de string en C, étant donné qu'un string est un tableau de char, je doit faire un tableau 2D, sachant que je connais la longueur du string (33 en comptant le /0) mais que je ne connais pas le nombre de string.
J'ai donc essayer cela, mais ca me donne un resultat un peu bizzard..
char **MenuArray = NULL;
Bdisp_AllClr_DDVRAM();
MenuArray = malloc(3);
//boucle 1
MenuArray[0]=malloc(33);
strcpy(&MenuArray[0],(unsigned char*)"0abcd");
locate(1,1);Print((unsigned char*)&MenuArray[0]);
//boucle 2
MenuArray[1]=malloc(33);
strcpy(&MenuArray[1],(unsigned char*)"1abcd");
locate(1,2);Print((unsigned char*)&MenuArray[1]);
//boucle 3
MenuArray[2]=malloc(33);
strcpy(&MenuArray[2],(unsigned char*)"2abcd");
locate(1,3);Print((unsigned char*)&MenuArray[2]);
//fin de boucle
locate(1,5);Print((unsigned char*)&MenuArray[0]);
locate(1,6);Print((unsigned char*)&MenuArray[1]);
locate(1,7);Print((unsigned char*)&MenuArray[2]);
Le résultat est en fichier joint, donc on peu voir que les print qui sont fait juste après donnent le résultat attendu. Mais pour ceux qui sont en bas, on se rend compte que quand par exemple que quand le strcpy de la deuxieme boucle est utilisé, il fonctionne bien sur la deuxieme case du tableau mais sur la premiere (alors qu'il ne devrait rien lui faire) il supprime la 4eme lettre (et les suivante s'il y a) et se met a la place alors que je lui ai rien demandé
Bref j'ai des supposition sur comment c'est possible(une histoire de chevauchement des chaîne) mais je sais pas comment ca arrive et comment régler le problème...
Fichier joint
Citer : Posté le 03/09/2012 08:45 | #
Si MenuArray est un char**, alors MenuArray[0] est un char*. Alors pourquoi tu mets des & devant ?
Mais tu peux faire bien plus simple, si les chaines sont de longueur fixes, alloue un tableau 1D de 33*nombreDeChaines, ce sera bien plus pratique (en définissant le 33 comme constante parce que tu t'en servira à plusieurs endroits)
Citer : Posté le 03/09/2012 13:04 | #
Si MenuArray est un char**, alors MenuArray[0] est un char*. Alors pourquoi tu mets des & devant ?
O_o Hier quand je les enlevais j'avais une erreur systeme (ca compilais mais au moment de l'instruction ca plantait). Et la je les enlève et ca marche comme par magie.. Alors que j'avais deja essayer ca hier j'en suis sur
Merci beaucoup en tout cas
Parce que sinon j'ai des
Mais tu peux faire bien plus simple, si les chaines sont de longueur fixes, alloue un tableau 1D de 33*nombreDeChaines, ce sera bien plus pratique (en définissant le 33 comme constante parce que tu t'en servira à plusieurs endroits)
Ah oui en effet c'est beaucoup plus simple Par contre la je suis obligé de mettre les & ? (sinon j'ai erreur systeme)
Merci encore
int nbrCaracteres=33;
int nbrEntrees=3;
Bdisp_AllClr_DDVRAM();
MenuArray = malloc(nbrEntrees * nbrCaracteres * sizeof(char));
//boucle 1
strcpy(&MenuArray[nbrCaracteres*0],(unsigned char*)"0abcd");
locate(1,1);Print((unsigned char*)&MenuArray[0]);
//boucle 2
strcpy(&MenuArray[nbrCaracteres*1],(unsigned char*)"1abcd");
locate(1,2);Print((unsigned char*)&MenuArray[33]);
//boucle 3
strcpy(&MenuArray[nbrCaracteres*2],(unsigned char*)"2abcd");
locate(1,3);Print((unsigned char*)&MenuArray[66]);
//fin de boucle
locate(1,5);Print((unsigned char*)&MenuArray[0]);
locate(1,6);Print((unsigned char*)&MenuArray[33]);
locate(1,7);Print((unsigned char*)&MenuArray[66]);