J'utilise le code suivant.
const int X_Origin = 1233086;
const int Y_Origin = -4728071;
const int Z_Origin = 4085704;
const int xyzOrigin[NUM_DIMENSIONS] = {X_Origin, Y_Origin, Z_Origin};
Lorsque je le compile, GCC me donne l'erreur suivante.
Transformations.h: 16: 1: erreur: l'élément d'initialisation n'est pas constant
Qu'est-ce que ça veut dire? Comment puis-je réparer mon code?
Vous ne pouvez pas faire cela au niveau global en C, mais uniquement au niveau local, c’est-à-dire au sein d’une fonction:
#define NUM_DIMENSIONS 3
const int X_Origin = 1233086;
const int Y_Origin = -4728071;
const int Z_Origin = 4085704;
const int xyzOrigin[NUM_DIMENSIONS] = {X_Origin, Y_Origin, Z_Origin}; // FAIL
void foo(void)
{
const int xyzOrigin[NUM_DIMENSIONS] = {X_Origin, Y_Origin, Z_Origin}; // OK
}
Sinon, vous pouvez compiler le code en C++ plutôt qu'en C.
Souvent, les gens sont induits en erreur par la dénomination du mot clé const
, ce qui implique quelque chose de valeur constante qui ne peut pas être modifié. En C au moins, cela signifie en lecture seule . Les objets qualifiés const
à la portée du fichier ne possèdent pas la constance appropriée pour servir d'initialiseurs de tableau.
Comme exemple pour une constance non constante, il est parfaitement correct de déclarer
const volatile unsigned int milliseconds_since_boot;
étant une valeur qui est mise à jour en dehors du contrôle du compilateur (pensez registre HW) et que vous n'êtes pas autorisé à affecter, c'est-à-dire qu'elle est en lecture seule.
Je ne suis pas un bon programmeur;) mais je ferais ceci:
#define X_Origin (1233086)
#define Y_Origin (-4728071)
#define Z_Origin (4085704)
const int xyzOrigin[NUM_DIMENSIONS] = {X_Origin, Y_Origin, Z_Origin};
De cette façon, c'est juste une substitution de texte. Si le compilateur crache toujours le mannequin, au moins, vous êtes sur le point de savoir où est le problème.
En guise d'alternative, cela fonctionnerait également dans ce cas:
enum { X_Origin = 1233086,
Y_Origin = -4728071,
Z_Origin = 4085704 };
const int xyzOrigin[] = { X_Origin, Y_Origin, Z_Origin };
int main()
{
return 0;
}
En langage C, les objets à durée de stockage statique doivent être initialisés avec des expressions constantes ou des initialiseurs agrégés contenant des expressions constantes. - Réponse de AndreyT
Après la lecture, vous devez savoir que NUM_DIMENSIONS
, s'il possède la qualification const
-, n'est pas une constante! Ensuite, vous ne pouvez pas initialiser votre tableau de cette façon.
Pour utiliser ce code:
const int xyzOrigin[NUM_DIMENSIONS] = {X_Origin, Y_Origin, Z_Origin};
Vous devriez utiliser: #define NUM_DIMENSIONS 3
ou vous pouvez simplement déclarer sans aucune variable entre crochets const int xyzOrigin[] = {X_Origin, Y_Origin, Z_Origin};
Comme le dit le triclosan:
main()
{
const int X_Origin = 1233086;
const int Y_Origin = -4728071;
const int Z_Origin = 4085704;
const int xyzOrigin[] = {X_Origin, Y_Origin, Z_Origin};
}
cela fonctionne bien ...
ou, si vous connaissez les dimensions à l'avance, ceci:
#define DIM 3
main()
{
const int X_Origin = 1233086;
const int Y_Origin = -4728071;
const int Z_Origin = 4085704;
const int xyzOrigin[DIM] = {X_Origin, Y_Origin, Z_Origin};
}