Zut, j'avais écrit un gros message qui a été perdu on dirait :cry:
Je le redis, utilise G_N_ELEMENTS. Il y a des problèmes dans ta déclaration de macro.
Version imprimable
Zut, j'avais écrit un gros message qui a été perdu on dirait :cry:
Je le redis, utilise G_N_ELEMENTS. Il y a des problèmes dans ta déclaration de macro.
Pour la virgule après la dernière valeur du tableau, c'est intentionnel. Cela évite d'avoir à modifier l'avant dernière ligne pour rajouter une virgule quand on rajoute un nouvel élément. Cela diminue les différences entre 2 versions de fichiers, ce qui est très utile quand tu dois comparer différentes versions du même fichier. C'est aussi pour cette raison que toutes les valeurs sont chacunes sur une ligne.
Cela fonctionne pour les tableaux alloués statiquement en C. Pas pour de l'allocation dynamique avec new ou malloc. Un tableau et un buffer alloué par malloc se manipulent de la même manière en C, mais ce n'est pas du tout la même chose. Tu ne peux pas faire un sizeof d'un tableau alloué via malloc en espérant avoir la taille du tableau, tu n'auras que la taille du pointeur qui pointe vers le buffer. Par exemple:
T'affichera (on compte le caractère nul final):Code:
1
2
3 char chaine = "toto"; printf ("%d", sizeof(chaine1));
En revanche,Code:5
T'affichera la taille du pointeur (4 octets en 32 bits, 8 en 64 bits):Code:
1
2
3 char *chaine = "toto"; printf ("%d", sizeof(chaine1));
Mais si tu dois faire de l'allocation dynamique, alors ne t'embête pas à gérer tout cela manuellement, utiliser les tableaux dynamiques de la GLib.
En revanche, ton autre exemple semble bizarre. Cela devrait fonctionner pour une définition de ce type:
G_N_ELEMENTS (nom_sphere) devrait renvoyer 3.Code:
1
2
3
4
5
6 char * nom_sphere[] = { "toto", "tata", "titi", };
La place de la virgule
Je préfère placer la virgule après les blancs et juste avant le nouveau mot, et donc aussi au début de la ligne et non à la fin.
Ceci résout automatiquement le problème de la virgule en trop et de plus favorise ma dernière manie: l'alignement vertical.
Un example:
Les commandes Emacs qui permettent d'agir sur un rectangle (C-x r k, C-x r t, etc) sont bien pratique pour manipuler ce code.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 typedef enum { FFT_NORM_NONE = 0 ,FFT_NORM_SYMMETRIC ,FFT_NORM_FORWARD ,FFT_NORM_BACKWARD } FFT_norm; void gg_fourier_update (void) { if (fourier_win != NULL) { FFTParams p; if (fourier_params_get (&p) == RETURN_SUCCESS) { gg_set_int (but_inverse , p.invflag); gg_set_int (but_dumpDC , p.dcdump); gg_set_dble (but_padding , p.oversampling); gg_set_int (but_round2n , p.round2n); gg_set_int (but_filter , p.filter); gg_set_dble (but_padding , p.padding); gg_set_int (but_outsegmt , p.outsegmt); gg_set_int (but_out_fft , p.output); } } }
Je trouver un problème de cette macro ! Celui qui me génait déjà avant !
En fait, si j'utilise une variable globale* définie dans un autre fichier ça plante :(
J'ai des tableaux qui doivent rester constant que j'appelle dans plein de fonctions. C'est eux qui me gènent :(