Je fais un petit jeu et je veux enregistrer des scores élevés. J'ai créé une classe Highscore en haut du fichier d'esquisse, comme ceci:
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
Maintenant. Près du bas de l'esquisse, j'ai une fonction que je veux prendre un objet Highscore comme paramètre, mais le compilateur ne me le permet pas. Exemple:
void writeHighscore(Highscore hs) {
File f = SD.open("high.txt", FILE_WRITE);
// Do stuff
L'erreur de complation est la suivante:
sketch.ino: 19: 21: erreur: variable ou champ 'writeHighscore' déclaré nul
sketch.ino: 19: 21: erreur: 'Highscore' n'a pas été déclaré dans cette étendue
sketch.ino: Dans la fonction 'void setup ()':
sketch.ino: 64: 20: erreur: 'writeHighscore' n'a pas été déclaré dans cette étendue
Après avoir changé le type de paramètre en String, int ou autre, toutes les erreurs disparaissent. Je peux créer des objets Highscore à l'intérieur de la writeHighscore()
fonction, mais comment puis-je lui passer des objets?
Édition 1 - Création d'objets
Highscore hs = Highscore("John", 975);
Serial.println(hs.toString()); // Prints "John - 975" as expected
writeHighscore(hs); // Error
&hs
approche avant d'écrire le message, ainsi que de passer le pointeurwriteHighscore(&hs)
->void writeHighscore(Highscore *hs)
mais en vain.Réponses:
Vous faites tout correctement, mais vous devez déplacer la classe en dehors de votre fichier .ino pour que cela fonctionne.
Je ne sais pas pourquoi l'IDE Arduino vous fait faire ça(voir modifier), mais c'est quelque chose que j'ai rencontré auparavant.Je viens de tester cela, et le déplacement de la déclaration de classe en dehors de l'ino et dans un fichier d'en-tête dans le dossier du projet permet de la compiler correctement. N'oubliez pas d'inclure l'en-tête que vous créez dans l'ino et
#include "Arduino.h"
dans l'en-tête pour accéder à nouveau à "String".Techniquement, seule une déclaration directe de la classe doit être dans un fichier différent.
Éditer:
Je suis relativement sûr de ce qui se passe, c'est que l'EDI génère des déclarations avancées pour toutes vos fonctions, mais pas la classe, qui sont placées avant la définition de votre classe. Cela signifie que la rupture de l'expression rationnelle de fonction que l'EDI utilise avec un "throw ()" factice résout votre problème. par exemple:
devrait fonctionner très bien (cela a fonctionné pour moi)
la source
C'est un exemple classique de l'IDE qui "vous aide" en générant des prototypes de fonction, et en ne le faisant pas très bien. Exemple de code à reproduire:
Cela donne l'erreur:
Si vous regardez la sortie du préprocesseur IDE (vous pouvez le faire en activant la compilation détaillée et en trouvant le nom du fichier qu'il est en train de compiler), vous voyez ceci:
La partie importante est qu'elle met:
avant où la classe est déclarée.
Vous pouvez corriger l'erreur en générant simplement votre propre prototype de fonction comme ceci:
Maintenant, il compile sans erreur. Il détecte votre propre prototype de fonction et ne génère donc pas le sien. Les premières lignes du fichier généré sont maintenant:
Ce prototype troublant a disparu.
la source