C error: la expresión debe tener un valor constante

Estoy escribiendo algún código incrustado para interactuar con un dispositivo externo a través de SPI. El dispositivo tiene varios registros de longitud variable y para ayudar a mantener las cosas en orden, he definido la siguiente estructura

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; 

Luego he definido cada registro en mis fonts de la siguiente manera

 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.

Tengo una función que llevará un puntero a una matriz de ts_registers y pondrá en cola las transferencias SPI necesarias para leer todos los registros de la matriz y llamar a una función de callback para manejar la respuesta

Mi problema viene cuando bash hacer la matriz de ts_registers que quiero leer de la siguiente manera:

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

Esto genera el error: “la expresión debe tener un valor constante” 3 veces (una vez por elemento de matriz).

Ya que están definidas como constantes, ¿qué he pasado por alto?

Ya que están definidas como constantes, ¿qué he pasado por alto?

En C, los objetos declarados con el modificador const no son constantes verdaderas . Un nombre mejor para const probablemente sería de readonly , lo que realmente significa es que el comstackdor no te permitirá cambiarlo. Y necesita constantes verdaderas para inicializar objetos con almacenamiento estático (sospecho que regs_to_read es global).

Puede intentar asignar regs_to_read en una función llamada antes de que cualquier otra cosa use esa matriz.

const no las hace constantes en tiempo de comstackción. Hazlos #defines y el comstackdor estará feliz.

Creo que esto puede ser un problema del comstackdor, y sería útil conocer su plataforma y cómo está construyendo este código. Simplemente tomé la mayor parte de su código, lo preparé para comstackrlo y lo compilé en Linux usando gcc. No hubo advertencias.

 #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); } 

¿Has intentado lanzar los valores? No siempre es lo mejor que se puede hacer, pero le ayudará a evitar el error.

¿Has considerado crear #definar entradas?

Además, tenga en cuenta que las constantes requieren un poco de tiempo para acostumbrarse a C. No siempre se comportan de la manera que usted podría esperar.