Erreur C: l’expression doit avoir une valeur constante

J’écris du code incorporé pour faire l’interface avec un périphérique externe via SPI. Le dispositif a plusieurs registres de longueur variable et pour aider à garder les choses droites, j’ai défini la structure suivante

typedef struct { uint16_t Signed :1; // Register is signed or unsigned uint16_t CommLengthBytes :3; // The width of the register in bytes uint16_t Address :12; // Register address }ts_register; 

J’ai ensuite défini chaque registre dans mes sources comme suit

 static const ts_register SAGCYC = {0, 1, 0x000}; static const ts_register DISNOLOAD = {0, 1, 0x001}; static const ts_register LCYCMODE = {0, 1, 0x004}; static const ts_register IRMSA = {0, 4, 0x31A}; static const ts_register IRMSB = {0, 4, 0x31B}; static const ts_register VRMS = {0, 4, 0x31C}; 

etc.

J’ai une fonction qui prend un pointeur sur un tableau de ts_registers et met en queue les transferts SPI requirejs pour lire tous les registres du tableau et appeler une fonction de rappel pour gérer la réponse.

Mon problème survient lorsque j’essaie de faire le tableau de ts_registers que je veux lire comme suit:

 ts_register regs_to_read[3] = {VRMS, IRMSA, IRMSB}; 

Cela génère l’erreur: “expression doit avoir une valeur constante” 3 fois (une fois par élément de tableau).

Depuis qu’elles sont définies comme des constantes, qu’ai-je oublié?

Depuis qu’elles sont définies comme des constantes, qu’ai-je oublié?

En C, les objects déclarés avec le modificateur const ne sont pas des constantes vraies . Un meilleur nom pour const serait probablement en readonly – ce que cela signifie vraiment, c’est que le compilateur ne vous laissera pas le changer. Et vous avez besoin de constantes vraies pour initialiser des objects avec un stockage statique (je soupçonne que regs_to_read est global).

Vous pouvez essayer d’affecter regs_to_read dans une fonction appelée avant qu’autre chose n’utilise ce tableau.

const ne les rend pas constantes au moment de la compilation. Faites-leur #defines et le compilateur sera heureux.

Je pense que cela peut être un problème de compilateur, et il serait utile de connaître votre plate-forme et comment vous construisez ce code. Je viens de prendre la majeure partie de votre code, de le trafiquer pour le comstackr, et de le comstackr sous Linux en utilisant gcc. Il n’y avait pas d’avertissement.

 #include #include #include typedef struct { uint16_t Signed :1; // Register is signed or unsigned uint16_t CommLengthBytes :3; // The width of the register in bytes uint16_t Address :12; // Register address }ts_register; int main(int argc, char **argv) { static const ts_register SAGCYC = {0, 1, 0x000}; static const ts_register DISNOLOAD = {0, 1, 0x001}; static const ts_register LCYCMODE = {0, 1, 0x004}; static const ts_register IRMSA = {0, 4, 0x31A}; static const ts_register IRMSB = {0, 4, 0x31B}; static const ts_register VRMS = {0, 4, 0x31C}; ts_register regs_to_read[3] = {VRMS, IRMSA, IRMSB}; return(0); } 

Avez-vous essayé d’incarner les valeurs? Ce n’est pas toujours la meilleure chose à faire, mais cela vous évitera l’erreur.

Avez-vous envisagé de créer des entrées #define?

Aussi, s’il vous plaît soyez conscient que les constants prennent un peu de temps pour s’habituer à C. Ils ne se comportent pas toujours comme prévu.