Forum: Mikrocontroller und Digitale Elektronik C-Problem: Pointer & Co.


von Jürgen (Gast)


Angehängte Dateien:

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

von Klaus W. (mfgkw)


Lesenswert?

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.

von Sam P. (Gast)


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.

von Rolf Magnus (Gast)


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);

von Jürgen (Gast)


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

von Klaus W. (mfgkw)


Lesenswert?

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
Noch kein Account? Hier anmelden.