Bonjour,
Je code au sein d'un projet où l'on doit utiliser du C ansi. Les règles assez contraignantes nous imposent entre autres d'abuser du const dans les prototypes de fonctions pour bien signifier ce qui peut changer ou ne pas changer.
Si j'ai bien compris la philosophie des const :
Là où ça se complique, c'est dans le cas des tableaux statiques et des multi-pointeurs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void toto(const int arg1, /* la valeur de arg1 ne sera pas modifiée */ int * arg2, /* arg2 peut-être modifié, *arg2 aussi */ const int * arg3, /* la valeur de *arg3 ne sera pas modifiée, celle de arg3 le pourrait */ int * const arg4, /* la valeur de arg4 peut être modifiée, celle de *arg4 non (valeur classique de sortie) */ const int * const arg5) /* ni arg5, ni *arg5 n'est modifié */ { [...] }
Là, j'aurais outre les message d'erreur du prototype de toto les messages suivants :
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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 typedef int vectint[3]; typedef int matint[3][3]; void toto(const matint matrice_entree, const vectint vecteur_entree, matint const matrice_sortie, /* ne fonctionne pas */ vectint const vecteur_sortie) /* ne fonctionne pas */ { [...] } void toto2(char *** tableau) { [...] } int main(void) { matint matrice1, matrice2; vectint vecteur1, vecteur2; char *** tableaux_de_noms; int i, j; toto(matrice1, vecteur1, matrice2, vecteur2); [...] strcpy(tableaux_de_noms[i][j], "MON NOM"); [...] toto2(tableaux_de_noms); return 0; }
+ matrice1 : warning, prototypes incompatibles
+ matrice2, vecteur2 : erreurs, prototypes incompatibles.
Bref, mes questions :
+ comment signifier la totale constance en entrée d'une matrice ou de manière générale d'un tableau statique multi-dimensionnel ?
+ comment signifier la constance d'un double pointeur, de ce qu'il pointe et de ce que pointent ce qui est pointé ? Même question pour un triple...
+ comment signifier, pour renseigner un tableau de sortie (statique défini par typedef ou dynamique multidimensionnel) que seul le contenu au bout des pointeurs peut être changé ?
+ comment signifier, pour toto2, que tout mon tableau est constant ?
+ comment, au contraire, signifier que cette fonction va remplir mon tableau, mais ne va pas modifier les pointeurs intermédiaires ?
Question subsidiaire : est-ce bien utile ?
Merci d'avance pour vos avis.
Partager