C-Problem: Pointer & Co.

Gast #2826632
Lesenswert?

Hallo,

ich verwende das Filesystem von Roland Riegel (siehe Anhang). Über die 
RS232 lasse ich mir die Position des Schreib-/Leseszeigers und die Größe 
der Datei ausgeben.

File *ATfile;

usart_write ("Pos:%8i Size:%8i\r\n",
             ATfile->pos,
             ATfile->dir_entry.file_size);

Für die Position bekomme ich den korrekten Wert. Für die Dateigröße 
immer 0.

Ausgabe: Pos:00000031 Size:00000000

Wahrscheinlich liegt es an der Verwendung von '->' und '.'.

Wo liegt mein Fehler?

mfg

Jürgen
Angehängte Dateien:
Gast #2826643
Lesenswert?

[Disclaimer: Ich kenne das Filesystem nicht. Diese Antwort ist allgemein 
auf C bezogen]

Dein Fehler liegt nicht im Verwechseln von . und ->, weil der Compiler 
mächtig böse wird, wenn man das tut (== es compiled gar nicht erst).

Gefahren lauern immer dort, wo du Pointer und Casts mischst. Da 
passieren die Sorte Fehler, die du hier zu unrecht befürchtest.

Du wirst leider nach einer anderen Ursache suchen müssen.
Gast #2826655
Lesenswert?

Klaus Wachtler schrieb:
> Wenn deine pos nicht int ist, sondern größer (wohl 32 Bit),

Die sind laut Header beide vom Typ uint32_t.

Jürgen schrieb:
> usart_write ("Pos:%8i Size:%8i\r\n",
>              ATfile->pos,
>              ATfile->dir_entry.file_size);

%i erwartet einen int und interpretiert das, was du übergibst, einfach 
als solchen, auch wenn es eigentlich was anderes ist. Nun hängt es von 
dem geheimgehaltenen Prozessor ab, ob int doert z.B. 16 oder 32 Bit 
breit ist. Sofern er 16 Bit breit sein sollte und diese Funktion 
usart_write() den Formatstring gleich auswertet wie printf(), wird das 
also nicht passen. Deine Beschreibung klingt, als würden die unteren 16 
Bit von pos bei "Pos:" angezeigt, die restlichen 16 Bit bei "Size:". Zur 
file_size kommt die Funktion dann gar nicht erst.

Es müßte heißen:
1
usart_write ("Pos:%"PRIu32" Size:%"PRIu32"\r\n",
2
              ATfile->pos,
3
              ATfile->dir_entry.file_size);
Gast #2826685
Lesenswert?

Der Prozessor ist ein ATMega644 und der Compiler ist der GNU-GCC aus 
WinAVR.

Wenn ich den 32-Bit Wert auf 16-Bit reduziere - geht es. Die 
UART-Routine verarbeitet - wie vermutet - nur 16-Bit Werte.

Vielen Dank für die Antworten und die Hilfe.

mfg

Jürgen

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren