¿Arreglo de estructuras del compilador PIC XC8?

0

Tengo problemas para asignar variables a las estructuras, especialmente al hacer una matriz de estructuras, con el compilador XC8.

Código de ejemplo a continuación:

typedef struct p{
  int id;
  dateStamp start;
  dateStamp stop;
  int parent_id;
} period;

period p1 = {1, {0, 0, 0, 1, 1, 14}, {20, 0, 0, 1, 1, 14}, 1};
period p2 = {1, {21, 0, 0, 1, 1, 14}, {50, 0, 0, 1, 1, 14}, 1};
period p3 = {1, {51, 0, 0, 1, 1, 14}, {59, 0, 0, 1, 1, 14}, 1};

period periods[3] = {p1, p2, p3};

Y este es el registro de errores del compilador:

main.c:233: error: (188) constant expression required
main.c:233: error: (207) simple type required for "@"
main.c:233: error: (182) illegal conversion between types
struct p -> int
main.c:233: error: (181) non-scalar types can't be converted to other types
main.c:233: error: (188) constant expression required
main.c:233: error: (207) simple type required for "@"
main.c:233: error: (182) illegal conversion between types
struct p -> int
main.c:233: error: (181) non-scalar types can't be converted to other types
main.c:233: error: (188) constant expression required
main.c:233: error: (207) simple type required for "@"
main.c:233: error: (182) illegal conversion between types
struct p -> int
main.c:233: error: (181) non-scalar types can't be converted to other types
main.c:256: warning: (345) unreachable code
(908) exit status = 1
make[2]: *** [build/default/production/main.p1] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

Las sugerencias serían bienvenidas ....

    
pregunta SimonBarker

2 respuestas

3

Este es un problema de C.

period periods[3] = {p1, p2, p3};

no es válido en C, como p1 , p2 & p3 son variables de estructura y no constantes conocidas en tiempo de compilación, por lo tanto, no puede usarlas como inicializadores.

Puede usar macros para sustituir los mismos valores constantes en p1 , p2 , p3 y periods[3] para que no tenga que duplicar los valores:

#define P1 {1, {0, 0, 0, 1, 1, 14}, {20, 0, 0, 1, 1, 14}, 1}
#define P2 {1, {21, 0, 0, 1, 1, 14}, {50, 0, 0, 1, 1, 14}, 1}
#define P3 {1, {51, 0, 0, 1, 1, 14}, {59, 0, 0, 1, 1, 14}, 1}

period p1 = P1;
period p2 = P2;
period p3 = P3;

period periods[3] = { P1, P2, P3 };

O simplemente puedes evitar los inicializadores por completo, y usar declaraciones explícitas al principio de tu programa para inicializar estos arreglos.

    
respondido por el Laszlo Valko
0

Parece que cambia el código a:

period periods[3];

periods[0] = p1;
...
...

resuelve el problema: XC8 no debe poder manejar la taquigrafía.

    
respondido por el SimonBarker

Lea otras preguntas en las etiquetas