Salut, ça faisait bien longtemps que j'étais pas passé sur ce forum (nostalgie). Voici mon souci.
Je suis en train de programmer en C pour un microcontroleur de la famille PIC18 (avec le compilateur MCC18) et je n'avais plus fait de C depuis assez longtemps. Je suis beaucoup plus à l'aise avec java ou l'assembler directement. Et je me perd un peu avec les déclaration de variables static et extern ainsi que leur portée, suivant où elles sont déclarées. Je suis à l'aise avec les pointeurs, mais pas forcément avec les typedef union et struct.
Pour m'y retrouver, j'essaie de séparer mon code source en différents fichiers, de manière vaguement équivalente à ce que j'aurais fait sous java. Je me retrouve avec un .h et un .c par "objet" (si vous me permettez l'abus de langage). Et voici ce que je fais pour l'instant pour tenter d'avoir l'équivalent de variables public / private.
Code :
- // java
- public static int i; // attribut de classe
- // C
- // .h
- extern int i;
- // .c (au minimum dans un seul .c mais n'importe lequel qui utilisera la viariable j'ai l'impression, ce qui me perturbe)
- int i;
|
Code :
- //java
- private static int i; // attribut de classe
- // C
- // .c (uniquement dans "l'objet" qui l'utilise, c'est pas vraiment private mais la variable reste inaccessible pour le reste du programme)
- static int i;
|
Jusque là, la correspondance entre java et C est-elle correcte ? Je ne connaissais pas "extern". Quelle est la portée exacte de la variable ?
Ensuite, comment devrait-on faire pour les attributs non statiques ? Voici à quoi je pense
Code :
- // java
- public int a,b; // attributs public
- // C
- // .h
- typedef struct {
- int a;
- int b;
- } objet;
- // .c (n'importe lequel qui utilise l'objet, du moment que ob est passé comme argument de fonction)
- // pour un attribut private, le typedef serait aussi dans le .c, avec les mêmes remarque que précédemment
- objet ob;
- ...
- ob.a = 0;
- f(ob); // etc ...
|
Ici, ob est-il en fait un pointeur ?
Si j'ai
Code :
- objet obStack[10];
- objet ob;
- int i,j;
- ...
- ob = obStack[i];
- obStack[j] = ob;
|
Je n'ai pas de certitudes sur le fonctionnement des 2 dernières lignes. Si ob et obStack[i] sont des pointeurs (avec l'indice pour obStack), la dernière serait particulièrement dangereuse. Mes tests ont eu des comportements différents à plusieurs reprises et je n'ai pas encore regardé le détail du code une fois compilé car mes outils ne montrent pas facilement l'association entre variables et leur emplacement en RAM et comme le code gère de l'USB au timing délicat, un debugging en profondeur pour repérage n'ira pas jusque là. Il faut que je prépare un test plus simple pour regarder ça ...
Bref, les correspondances que j'ai décrit sont-elles correctes ? Dans ces cas, quelle est la portée des variables (c'est généralement ça qui me pose souci je crois) ? Bref, si quelqu'un pouvait m'aider à me remettre les idées en place, je lui offre toute ma gratitude (jeu-concours sans obligation d'achat).
Merci d'avance !