Salut,

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 sais que ce n'est pas très habituel de vouloir se rapprocher de la POO avec un langage non OO mais ça m'aide à structurer l'ensemble). 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, static ou non.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
// 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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
//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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// java
public int a,b; // attributs de classe
 
// 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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
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 après avoir regardé le résultat de la compilation en assembleur + utilisation de la RAM, j'ai parfois vu une duplication en 3 exemplaires (3 zones mémoires) pour une seule et même variable "static" qui aurait dû être sur une seule et même zone mémoire (l'utilisation de "extern" comme dans le premier exemple a résolu le problème dans ce cas). Je vois ça comme un problème lié à la manière de déclarer les variables.

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 serais très reconnaissant.

Merci d'avance !