Ich mache ein winziges Spiel und möchte Highscores speichern. Ich habe oben in der Skizzendatei eine Highscore-Klasse erstellt, wie folgt:
class Highscore {
public:
String name;
int score;
String toString() {
return this->name + " - " + (String)score;
}
Highscore(String name, int score) {
this->name = name;
this->score = score;
}
};
setup() { // etc
Jetzt. Am unteren Rand der Skizze habe ich eine Funktion, die ich als Highscore-Objekt als Parameter verwenden möchte, aber der Compiler lässt mich nicht. Beispiel:
void writeHighscore(Highscore hs) {
File f = SD.open("high.txt", FILE_WRITE);
// Do stuff
Der Komplikationsfehler ist wie folgt:
skizze.ino: 19: 21: fehler: Variable oder feld 'writeHighscore' deklariert void
skizze.ino: 19: 21: fehler: 'highscore' wurde in diesem
bereich nicht deklariert skizze.ino: In der funktion 'void setup ()':
Skizze.ino: 64: 20: Fehler: 'writeHighscore' wurde in diesem Bereich nicht deklariert
Nachdem Sie den Parametertyp in String, int oder was auch immer geändert haben, verschwinden alle Fehler. Ich kann Highscore-Objekte INNERHALB der writeHighscore()
Funktion erstellen , aber wie kann ich Objekte an diese übergeben?
Bearbeiten 1 - Objekterstellung
Highscore hs = Highscore("John", 975);
Serial.println(hs.toString()); // Prints "John - 975" as expected
writeHighscore(hs); // Error
&hs
Ansatz vor dem Schreiben des Beitrags sowie das Übergeben des ZeigerswriteHighscore(&hs)
->void writeHighscore(Highscore *hs)
aber ohne Erfolg.Antworten:
Sie machen alles richtig, aber Sie müssen die Klasse aus Ihrer .ino-Datei verschieben, damit dies funktioniert.
Ich bin mir nicht sicher, warum die Arduino-IDE Sie dazu bringt(siehe Bearbeiten), aber es ist etwas, auf das ich vorher gestoßen bin.Ich habe dies gerade getestet, und wenn die Klassendeklaration außerhalb von ino in eine Header-Datei im Projektordner verschoben wird, wird sie korrekt kompiliert. Denken Sie daran, den von Ihnen erstellten Header in das Ino und
#include "Arduino.h"
in den Header aufzunehmen, um erneut auf "String" zuzugreifen.Technisch gesehen muss sich nur eine Vorwärtsdeklaration der Klasse in einer anderen Datei befinden.
Bearbeiten:
Ich bin mir ziemlich sicher, dass die IDE Vorwärtsdeklarationen für alle Ihre Funktionen generiert, nicht jedoch für die Klasse, die vor Ihrer Klassendefinition stehen. Dies bedeutet, dass das Unterbrechen des von der IDE verwendeten regulären Regex mit einem Dummy "throw ()" Ihr Problem behebt. zum Beispiel:
sollte gut funktionieren (es hat bei mir funktioniert)
quelle
Dies ist ein klassisches Beispiel für die IDE, die Ihnen "hilft", indem sie Funktionsprototypen generiert und dies nicht sehr gut macht. Zu reproduzierender Beispielcode:
Dies gibt den Fehler:
Wenn Sie sich die Ausgabe des IDE-Präprozessors ansehen (Sie können dies tun, indem Sie die ausführliche Kompilierung aktivieren und den Namen der Datei ermitteln, die tatsächlich kompiliert wird), sehen Sie Folgendes:
Der wichtige Teil ist, dass es sagte:
vor wo die Klasse deklariert wird.
Sie können den Fehler beheben, indem Sie einfach Ihren eigenen Funktionsprototyp wie folgt generieren:
Jetzt wird es fehlerfrei kompiliert. Es erkennt Ihren eigenen Funktionsprototyp und generiert daher keinen eigenen. Die ersten Zeilen der generierten Datei lauten jetzt:
Dieser beunruhigende Prototyp ist verschwunden.
quelle