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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.