Elm Chans Funktion "f_readdir" zurücksetzen (PIC)

OP #4972113
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.
#4972121
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.
OP #4972163
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.
OP #4972212
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.

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