Sto lavorando con un compilatore C incorporato (chip ARM cortex-m3) e sembra inizializzare il valore sbagliato su una struttura. Perché succede? Se si tratta di un problema di allineamento, il compilatore non dovrebbe sapere di allineare un int32u a un limite di 4 byte?Perché il compilatore inizia questa variabile al valore errato? È un problema di allineamento?
Nota: il printf emette semplicemente byte dalla porta seriale. Non esiste alcuna implementazione stdio.h su questo chip.
typedef struct
{
int32u startTime;
int16u length;
int32u offTime;
} Cycle;
Cycle cycle =
{
315618000,
1200,
0
};
void init()
{
printf("\r\nInitialized! Cycle Start: %d", cycle.startTime);
cycle.startTime = 315618000;
cycle.length = 1200;
printf(" Cycle Start: %d", cycle.startTime);
}
uscita: inizializzato! Cycle Start: 631237200 Cycle Start: 315618000
Nota:: Questo non è un problema printf. Il debugger verifica anche il valore in memoria come 631237200.
'"% d "' richiede un argomento 'int'.Probabilmente funziona se 'int' è a 32 bit, ma per sicurezza prova a cambiare il formato da' "% d" 'a' "% lu" 'e lancia esplicitamente l'argomento a' unsigned long'. –
Il tuo documento del compilatore 'void main()' come definizione corretta per 'main'? Hai '#include'? –
@KeithThompson: Anche se sono completamente d'accordo sul fatto che '% d' è sbagliato, dubito che questo riguardi gli specificatori di conversione (o anche le dimensioni integer), poiché sembra funzionare per il secondo' printf() '. – alk