Pracuję z osadzonym kompilatorem C (układ ARM cortex-m3) i wydaje się, że inicjuje on niewłaściwą wartość do struktury. Dlaczego to się dzieje? Jeśli jest to problem wyrównania, czy kompilator nie powinien wiedzieć, czy dopasować int32u do granicy 4-bajtowej?Dlaczego kompilator inicjuje tę zmienną na niewłaściwą wartość? Czy to jest problem z wyrównaniem?
Uwaga: printf jedynie wyrzuca bajty z portu szeregowego. W tym układzie nie ma implementacji stdio.h.
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);
}
wyjściowa: przygotowanej! Cycle Start: 631237200 Cycle Start: 315618000
Uwaga:: to nie jest kwestia printf. Debugger weryfikuje również wartość w pamięci jako 631237200.
'"% d "' wymaga argumentu 'int'.Prawdopodobnie zadziała, jeśli 'int' będzie 32-bitowe, ale po prostu spróbuj zmienić format z' "% d" 'na' "% lu" 'i jawnie rzucając argument na' unsigned long'. –
Czy twój kompilator dokumentuje 'void main() 'jako poprawną definicję' main'? Czy masz '#include'? –
@KeithThompson: Chociaż całkowicie zgadzam się, że '% d' jest błędne, wątpię, aby chodziło o specyfikatory konwersji (lub nawet o wielkości całkowite), ponieważ wydaje się, że działają one dla drugiego' printf() '. – alk