Go Down

Topic: woher Fehler: no matching function for call to 'fs::FS::openDir(fs::Dir&)' (Read 1 time) previous topic - next topic

snoobi

Hallo,

auf der Seite http://esp8266.github.io/Arduino/versions/2.0.0/doc/filesystem.html habe ich folgenden Code gefunden:

Code: [Select]
Dir dir = SPIFFS.openDir("/data");
while (dir.next()) {
    Serial.print(dir.fileName());
    File f = dir.openFile("r");
    Serial.println(f.size());
}


Wenn ich es in der Setup Funktion laufen lasse funktioniert alles. Nun wollte ich eine Funktion erstellen um nicht immer soviel schreiben zu müssen:

Code: [Select]
String spiffsShowDir(String directory) {
  String var;
  Dir dir = SPIFFS.openDir(dir);
  while (dir.next()) {
    Serial.print(dir.fileName());
    File f = dir.openFile("r");
    Serial.println(f.size());
    var += (String)dir.fileName();
    var += (String)f.size();
  }
  return var
}


Nun bekomme ich aber immer die Nachricht "no matching function for call to 'fs::FS::openDir(fs::Dir&)'".  Einen Prototypen habe ich direkt nach den globalen Variablen angelegt:
Code: [Select]

String spiffsShowDir(String directory);


Woran kann sowas noch liegen? Sonst konnte ich so ein Problem immer lösen indem ich den Prototypen deklariere.

combie

>  Dir dir = SPIFFS.openDir(dir);

Du darfst dir  erst nach der abgeschlossenen Definition als Parameter verwenden.
Nicht schon in der Definition.

Davon abgesehen, ist es wohl sowieso nicht das, was du willst.
Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

Tommy56

Dein Übergabestring heißt directory und nicht dir.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Serenifly

Gewöhne dir das ab:
Code: [Select]

String spiffsShowDir(String directory)


Korrekt:
Code: [Select]

String spiffsShowDir(String& directory)


Hat zwar keinen Einfluss darauf ob es geht oder nicht, aber die Kopie kann man sich sparen

ats3788


snoobi

Es lag an Bezeichnung "directory". Das hätte ich auch selbst sehen können naja. Vielen Dank.

Das mit dem String& verstehe ich noch nicht so ganz. Bisher habe ich um Pointer einen Bogen gemacht und das geht in die Richtung oder? Ich verstehe noch nicht, wann und wo man ein Ampersand oder ein Sternchen braucht.


Die folgenden beiden Sachen sind doch gleichbedeutend oder?
Code: [Select]

void swapInt(byte* a, byte* b) {
  int temp = *a;
  *a = *b;
  *b = temp;
}

swapInt(&x, &y);



Code: [Select]

// function definition to swap the values.
void swapInt(int &x, int &y) {
   int temp;
   temp = x; /* save the value at address x */
   x = y;    /* put y into x */
   y = temp; /* put x into y */
 
   return;
}

swap(a, b);



Naja wenn ich mir das Kapitel noch 20 mal durchlese kapier ich es vielleicht irgendwann =)

Falls jemand ein paar einfache Beispiele für den Umgang mit Pointern hat, die das Verständnis fördern, würde ich mich freuen.

combie

Quote
Ich verstehe noch nicht, wann und wo man ein Ampersand oder ein Sternchen braucht.
Stern:
1. Multiplikation Operator
2. Zeiger Operator

Ampersand:
1. Referenz Operator
2. Adress Operator
3. Binäres Und Operator


Und, man verwendet den Operator, mit dem man sein Zeil erreicht!


Quote
Falls jemand ein paar einfache Beispiele für den Umgang mit Pointern hat, die das Verständnis fördern, würde ich mich freuen
Da solltest du mal in die C Welt schauen, da sind Pointer weiter verbreitetet, als in unserer C++ Welt.
Wir haben zum Glück auch Referenzen, welche viele Pointer Probleme vermeiden.



Grundsätzlich: (etwas einfach formuliert)
1. Zeiger zeigen auf eine Speicheradresse.
2. Referenzen bieten einen zweiten Namen für einen Speicherbereich.
Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

Serenifly

Das mit dem String& verstehe ich noch nicht so ganz
Schau dir "call by value" und "call by reference" an. Eine Zahl die 2 oder 4 Byte belegt kann man als Kopie übergeben. Aber bei größeren Objekten sollte man das nicht tun.

Und wie gesagt handelt sich hierbei um eine Referenz. Nicht um einen Zeiger. Die sind um einiges einfacher, da Referenzen nicht NULL sein können und nicht veränderbar sind.

snoobi

Muss ich denn noch etwas ändern ausser der Zeile
 
Code: [Select]
String spiffsShowDir(String& directory)  ?

Ich bekomme dann die Meldung "invalid initialization of non-const reference of type 'String&' from an rvalue of type 'const char*'"

Die Funktion rufe ich mit
Code: [Select]
spiffsShowDir("/");

auf. Habs auch mit  spiffsShowDir(&"/"); versucht. Wenigstens gehts aber schonmal ohne das & =)


Serenifly

Dann mach ein const Referenz draus (const String& directory). Die Fehlermeldung sagt doch eindeutig was falsch ist

Go Up