Et serait-il possible d'avoir le code complet et compilable sur MPLab ?
Version imprimable
Et serait-il possible d'avoir le code complet et compilable sur MPLab ?
ok une minute!
voici le projet!
Non, ca veut simplement dire que tu passes un pointeur de structure et pas la structure entière:
Ta fonction passe ainsi en paramètre uniquement un pointeur au lieu de ta structure entière (qui peut être très lourde parfois et ralentir ton exécution.Code:void Affichage_structure_chaine_CGRAM_DDRAM ( LISTE* structure , unsigned char adr_ecran)
De plus les paramètres passés par copie sont détruits à la fin de l'appel de ta fonction.
Pour revenir à ton problème, je ne penses pas que ça vienne de la déclaration de la structure. Je ne connait pas MPLab, mais LISTE ne serait pas un mot clé ?
A+.
Un truc qui n'a rien à voir, et je suppose que tu fais ta vie comme tu l'entends, mais quand je vois :
Je suppose que le trou en dessous de « Consulter les blocs » est dû au fait que cela correspond à une ligne vide sur ton afficheur, mais du coup, ça fait une entrée manquante dans ton tableau, et ça décale les index.Code:
1
2
3
4
5
6
7
8 extern const char Sous_MENU_LISTE[][21] = { "Adresser les blocs ", "Reprise adressage ", "des blocs ", "Consulter les blocs ", "Remplacer les blocs ", "en défaut ",
Tu arrives à t'y retrouver ?
j'ai reglé le pb momentanément, vu que ma structure Liste ne contient qu'un seul élément jusqu'à mtn, je déclare uniquement un tableau de char au lieu d'une structure de tableau de char, et ça marche!! merci bcp pr vos suggestions;) si qlq1 arrive qd meme à voir d'où provenait l'erreur qu'il me prévienne svp!
ps: le "LISTE" n'est pas un mot clé pr MPLAB, à ma connaissance..
non ça ne correspond pas à une ligne vide sur l'afficheur, c'est uniquement une lisibilité pr moi qd je vois mon programme (pour differencier les 4 lignes par 4). je ne savais pas que ça pouvait etre interpreté par le compilo en tant que ligne vide sur l'écran, puisque niveau syntaxe de ce code il n'y a pas de "guillemets" contenant une ligne vide..
ok ça me rassure!!
Evite d'utiliser les "extern" comme ça, c'est sensé donné une information au linker, apparement ici tu n'en as pas besoin.
Comme dit plus haut, tu passes un pointeur sur la structure, ça évite de devoir la pusher sur la stack lorsque tu call la fonction. Si ta structure fait 600B, c'est à chaque fois 600B à pusher sur la stack contre 4B (sur un ia32) pour un pointeur.
J'aimerais que tu me dises les différences qu'il y a entre :
Code:
1
2
3
4 typedef struct Liste { char ss_Liste[4][21]; } Liste;
Code:
1
2
3
4 typedef struct Liste { char ss_Liste[4][21]; } LISTE;
Code:
1
2
3
4 typedef struct Liste { char ss_Liste[4][21]; };
Code:
1
2
3
4 struct Liste { char ss_Liste[4][21]; };
Quand est-ce qu'on utilise le keyword "struct" ?
Une fois que tu as répondu à ça, dis-moi quelle différence y'a entre
Code:
1
2 void Affichage_structure_chaine_CGRAM_DDRAM ( LISTE structure , unsigned char adr_ecran)
Code:
1
2 void Affichage_structure_chaine_CGRAM_DDRAM (liste structure , unsigned char adr_ecran)
Code:void Affichage_structure_chaine_CGRAM_DDRAM ( LISTE * structure , unsigned char adr_ecran)
Lequel est juste, lequel est faux ? pourquoi ?Code:void Affichage_structure_chaine_CGRAM_DDRAM (liste * structure , unsigned char adr_ecran)
Je pense que si tu fais ça, tu devrais être capable de trouver par toi toute seule ce qui va pas.
+
Trop gros. Poste une version compilable réduite au minimum qui montre le problème. (technique bien connue de résolution de bug)
Je rappelle que si tu utilises une structure quelque part, elle doit avoir été définie avant.
Si dans un header, il y a :
il faut que T soit défini avant.Code:void f (T *p);
Code:
1
2
3
4
5
6
7
8 typedef struct { ... } T; void f (T *p);
Dans essai_variables.h tu déclares
Code:
1
2
3 struct Liste { char ss_Liste[4][21]; } LISTE;
et tu enlèves:
Code:extern struct LISTE * pointeur_ss_menu
Dans lcd.c en début de fichier, après les inclusions, tu ajoutes :
Code:extern LISTE * pointeur_ss_menu
Dans MENU.c, tu enlèves :
Code:
1
2
3 struct Liste { char ss_Liste[4][21]; };
ça devrait résoudre un peu le problème.
faux
juste
en fait, dans les 2 cas, on définit "Liste" de type structure, sauf que dans le 2ème cas on déclare une variable "LISTE" de type "Liste" qui est de type structure, alors que ds le 1er on déclare "Liste" ce qui est faux car ça ne correspond pas à la variable.
juste , on ne déclare pas de variable ici
juste aussi, mais je ne sais pas ce que ça change en omettant "typedef", pcq pr moi rien ke le fait de créer une structure et de lui donner un nom, ben ça voudrait dire qu'on a défini un type "structure"..
c'est pas plutôt le mot clé "typedef" dont tu parles?
faux, car "LISTE" est la variable et non pas le type. (mais pourtant dans mon programme j'ai qd meme fait ça au début pour tester car qd je mettais "Liste" ça ne marchait pas!)
juste, car "liste" est le type et on passe un paramètre de type "liste" qui est elle même une structure
faux, pour la même raison puisque "LISTE" est la variable
juste, pour la meme raison aussi
pas la peine de tester ca.
la seule solution est de lire un cours sur les structures et les types !
C'est pas pareil.
Je suis dsl si la phrase a une consonance seche mais tes posts sont trop petits pour etre correctement interprete et ton projet est trop volumineux.
Et pis faut arreter le pifometre tu ne fais que perdre du temps.
bon rapide aide memoire :
si :
sinonCode:
1
2
3
4
5
6
7
8 typedef struct Liste_s { /* ce que tu veux comme membre */ } Liste; /* la declaration de ta var */ Liste ma_belle_liste; /* sans extern de preference c est sale */
tu vois la difference ?Code:
1
2
3
4
5
6
7
8 typedef struct Liste { /* ce que tu veux comme membre */ } LISTE; /* la declaration d une autre varible */ struct Liste ma_belle_liste; /* sans extern toujours de preference c est sale */
au fait j'ai une autre question à poser, si je veux une fonction qui retourne un pointeur vers un tableau de char, qu'elle est la syntaxe??pcq j'ai testé qlq possibilités mais ça n'a pas l'air d'être ça..la dernière que j'ai testée c'est:
Code:char * Attrib_Liste_Sous_MENU (int cnt_pos_ss_menu, unsigned int direction)[4][21]
Code:
1
2 char ** Attrib_Liste_Sous_MENU (int cnt_pos_ss_menu, unsigned int direction)[4][21] )