Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » [C] strcpy et tableau 2D alloué dynamiquement
Ziqumu Hors ligne Membre d'honneur Points: 3055 Défis: 9 Message

[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


Pierrotll Hors ligne Ancien administrateur Points: 5488 Défis: 41 Message

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)
Ziqumu Hors ligne Membre d'honneur Points: 3055 Défis: 9 Message

Citer : Posté le 03/09/2012 13:04 | #


Pierrotll a écrit :

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

Pierrotll a écrit :

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


Voila le code si ca interesse quelqu'un un jour
Cliquer pour enrouler
        char *MenuArray = NULL;
        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]);

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 245 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd