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
Wenn deine pos nicht int ist, sondern größer (wohl 32 Bit), dann ist %i nicht angemessen, weder was die Länge angeht, noch den Typ. %lu wäre sinnvoller, oder noch besser statt des lu einen passendes Makro aus inttypes.h.
[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.
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); |
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
Jürgen schrieb: > Wenn ich den 32-Bit Wert auf 16-Bit reduziere - geht es. ok, aber geschickter wäre es, auch 32 Bit verarbeiten zu können - oder was machst du, wenn die 16 Bit mal nicht mehr reichen? So wie bisher kommst du auf max. 16 kB, wenn du die Sache mit signed/unsigned mal richtig machen würdest, wäre bei 32 kB Schluß.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.