Forum: Mikrocontroller und Digitale Elektronik Elm Chans Funktion "f_readdir" zurücksetzen (PIC)


von Simon B. (zmon)


Lesenswert?

Hallo Zusammen!

Ich habe eine Frage zu folgender Funktion:
1
FRESULT f_readdir (
2
  DIR* dp,      /* [IN] Directory object */
3
  FILINFO* fno  /* [OUT] File information structure */
4
);

In der Dokumentation (http://elm-chan.org/fsw/ff/en/readdir.html) steht:
"When a null pointer is given to the fno, the read index of the 
directory object is rewinded."

Genau das möchte ich machen, stehe da aber irgendwie voll auf der 
Leitung und bin mir nicht sicher ob ich das in meinem Code richtig 
verwende:
1
FRes = f_readdir(&dir, NULL);

Ist das so richtig bzw. im Sinne des Erfinders?

Die f_readdir Funktion selbst reagiert auf folgendes:
1
if (!fno) {
2
    res = dir_sdi(dp, 0);   /* Rewind the directory object */
3
    .
4
    .
5
    .
Der Ausdruck "!fno" verwirrt mich nun vollends. Was zur Hölle ist ein 
NICHT-Pointer und wie kann ich den an die Funktion übergeben? Wo ist 
mein Fehler?

Der Code im Detail siehe unten, das Programm funktioniert vorerst und 
macht was es soll. Sobald "page" aber den Wert 4 annimmt steht alles 
still.
1
unsigned int i, s, z, page = 0;
2
char disp [4][21];
3
.
4
.
5
.
6
FRes = f_readdir(&dir, NULL);       //Directorypointer Rückstellen
7
8
for (i = 0; i < page; i++) {        //Auf gewünschten Eintrag springen
9
    FRes = f_readdir(&dir, &fno);
10
}
11
        
12
for (z = 0; z < 4; z++) {           //Vier Einträge lesen
13
    FRes = f_readdir(&dir, &fno);
14
15
    for (s = 0; s < 20; s++) {
16
        disp[z][s] = fno.fname[s];
17
    }
18
}
19
20
write_line(1, disp[0]);             //Gelesene Einträge am Display ausgeben
21
write_line(2, disp[1]);
22
write_line(3, disp[2]);
23
write_line(4, disp[3]);

Ich verwende einen PIC24FJ128GA202 und die MPLAB X IDE (v3.50) mit dem 
XC16 Compiler (v1.30).

Vielen dank im Voraus für eure Bemühungen und schöne Grüße.

von Markus F. (mfro)


Lesenswert?

Simon B. schrieb:
> if (!fno) {
>     res = dir_sdi(dp, 0);   /* Rewind the directory object */
>     .
>     .
>     .
>
> Der Ausdruck "!fno" verwirrt mich nun vollends. Was zur Hölle ist ein
> NICHT-Pointer und wie kann ich den an die Funktion übergeben? Wo ist
> mein Fehler?

In C ist alles, was nicht 0 ist, true. Der Rest (0) false.

Du solltest Fres abprüfen. Nur bei FR_OK ist der Wert in fno nach dem 
Aufruf gültig.

: Bearbeitet durch User
von Simon B. (zmon)


Lesenswert?

Markus F. schrieb:
> Simon B. schrieb:
>> if (!fno) {
>>     res = dir_sdi(dp, 0);   /* Rewind the directory object */
>>     .
>>     .
>>     .
>>
>> Der Ausdruck "!fno" verwirrt mich nun vollends. Was zur Hölle ist ein
>> NICHT-Pointer und wie kann ich den an die Funktion übergeben? Wo ist
>> mein Fehler?
>
> In C ist alles, was nicht 0 ist, true. Der Rest (0) false.

Man könnte also sagen dass, wenn fno irgendeinen von 0 verschiedenen 
Wert hat, dann ist !fno==false und die If-Anweisung wird nicht 
abgearbeitet. Wenn aber fno den Wert 0 hat, dann ist !fno==true und die 
If-Anweisung wird abgearbeitet? Hab ich das richtig verstanden?
>
> Du solltest Fres abprüfen. Nur bei FR_OK ist der Wert in fno nach dem
> Aufruf gültig.

Danke für den Tip, habe ich gleich ausprobiert. ich bekomme immer FR_OK 
zurück, das Ding hängt sich trotzdem auf.

von Simon B. (zmon)


Lesenswert?

Hallo Markus und Mitleser!

Danke für die Hinweise. Ich habe den Fehler zwar nicht identifiziert, 
aber (leider unabsichtlich) beseitigt. Er hatte nichts mit meinem Aufruf 
von f_readdir zu tun (Das habe ich wohl richtig gemacht), sondern mit 
einem Dateinamen auf der Karte, der vermutlich meine write_line Funktion 
in eine Endlosschleife versetzt hat.

Da bin ich natürlich erst draufgekommen, als ich den Inhalt meiner Karte 
Probehalber mit anderen Dateien gefüllt habe. Welcher Dateiname nun den 
Absturz verursacht hat kann ich jetzt leider nicht mehr sagen, da sie ja 
von mir gelöscht wurden - Das soll aber jetzt wieder mein Problem sein.

Nochmals Danke und gute Nacht.

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.