Vraag:
Hoe kan ik een object als parameter aan een functie doorgeven?
krystah
2014-11-13 00:53:59 UTC
view on stackexchange narkive permalink

Ik ben een klein spelletje aan het maken en wil hoge scores opslaan. Ik heb een Highscore-class gemaakt in de top van het schetsbestand, zoals deze:

  class Highscore {public: String name; int score; String toString () {return this->name + "-" + (String) score; } Highscore (String naam, int score) {this->name = naam; this->score = score; }}; setup () {// etc  

Nu. Onderaan de sketch heb ik een functie die ik een Highscore-object als parameter wil nemen, maar de compiler laat me dat niet. Voorbeeld:

  void writeHighscore (Highscore hs) {File f = SD.open ("high.txt", FILE_WRITE); // Dingen doen  

De complatiefout is als volgt:

sketch.ino: 19: 21: error: variabele of veld 'writeHighscore' ongeldig verklaard
sketch.ino: 19: 21: fout: 'Highscore' is niet gedeclareerd in dit bereik
sketch.ino: In functie 'void setup ()':
sketch.ino: 64: 20: fout : 'writeHighscore' is niet gedeclareerd in dit bereik

Na het wijzigen van het parametertype naar String, int of wat dan ook, verdwijnen alle fouten. Ik kan Highscore-objecten maken BINNEN de writeHighscore () -functie, maar hoe kan ik er objecten aan doorgeven?

Bewerken 1 - Objecten maken

  Highscore hs = Highscore ("John", 975); Serial.println (hs.toString ()); // Drukt "John - 975" af zoals verwacht schrijfHighscore (hs); // Fout  
kun je de code plaatsen waar je een Highscore-object maakt?
Inclusief de code voor het maken van objecten.
Ik denk dat het probleem een ​​ontbrekende beugel is of zo. Omdat er geen volledige code is, kan ik raden en zien: 1) * setup () * zou * void setup () * moeten zijn. Maar het zou C ++ waarschuwing / fout moeten genereren. 2) Door een klasseparameter door te geven, wordt het kopiëren van het object geforceerd wanneer de procedure wordt aangeroepen. gcc zou ook een waarschuwing moeten genereren als de kopieerconstructor ontbreekt. Gebruik: * void writeHighscore (Highscore & hs) * of * void writeHighscore (Highscore \ * hs) * Kopieer het compileerbare fragment in je bericht.
Zoals vermeld in de oorspronkelijke vraag, door de Highscore-parameter te veranderen door bijvoorbeeld een String of een int, verdwijnen de fouten, er ontbreken geen haakjes. Ik heb ook de `& hs`-benadering geprobeerd voordat ik het bericht schreef, evenals de aanwijzer` writeHighscore (& hs) `->` void writeHighscore (Highscore * hs) `maar het mocht niet baten.
Plaats de volledige broncode, anders zijn de regelnummers in compilatiefouten zinloos.
Twee antwoorden:
BrettAM
2014-11-13 02:35:40 UTC
view on stackexchange narkive permalink

Je doet alles goed, maar je moet de klas buiten je .ino-bestand verplaatsen om dit te laten werken. Ik weet niet zeker waarom de arduino IDE je dit laat doen (zie bewerken), maar het is iets dat ik eerder ben tegengekomen.

Ik heb dit net getest, en ik ben verhuisd de klassendeclaratie buiten de ino en in een header-bestand in de projectmap zorgt ervoor dat het correct compileert. Vergeet niet om de header die u maakt in de ino op te nemen en #include "Arduino.h" in de header om weer toegang te krijgen tot "String".

Technisch gezien is alleen een forward declaratie van de klasse moet in een ander bestand staan.

Bewerken:

Ik ben er vrij zeker van dat wat er gebeurt, de IDE voorwaarts genereert declaraties voor al uw functies, maar niet voor de klasse, die voor uw klassendefinitie worden geplaatst. Dit betekent dat het doorbreken van de functie regex die de IDE gebruikt met een dummy "throw ()" uw probleem oplost. bijvoorbeeld:

  void writeHighscore (Highscore hs) throw () {...  

zou prima moeten werken (het werkte voor mij)

Nick Gammon
2015-07-07 03:14:17 UTC
view on stackexchange narkive permalink

Dit is een klassiek voorbeeld van de IDE die u "helpt" door functieprototypes te genereren, en het niet erg goed doet. Voorbeeldcode om te reproduceren:

  class Highscore {public: String name; int score; String toString () {retourneer this->name + "-" + (String) score; } Highscore (String naam, int score) {this->name = naam; this->score = score; }}; void setup () {} void loop () {} void writeHighscore (Highscore hs) {// do stuff}  

Dit geeft de foutmelding:

  sketch_jul06b: 4: error: variabele of veld 'writeHighscore' gedeclareerd voidsketch_jul06b: 4: error: 'Highscore' is niet gedeclareerd in dit bereik  

Als je naar de uitvoer van de IDE-preprocessor kijkt (je kunt dit doen door uitgebreide compilatie aan te zetten en de naam te achterhalen van het bestand dat het eigenlijk aan het compileren is), dan zie je dit:

  #line 1 "sketch_jul06b.ino" #include "Arduino.h" void setup (); void loop (); void writeHighscore (Highscore hs); # line 1class Highscore { public: String naam; int score; String toString () {retourneer this->name + "-" + (String) score; } Highscore (String naam, int score) {this->name = naam; this->score = score; }}; void setup () {} void loop () {} void writeHighscore (Highscore hs) {// do stuff}  

Het belangrijkste is dat het plaatst:

  void writeHighscore (Highscore hs);  

vóór waar de klasse wordt gedeclareerd.


Je kunt de fout herstellen door simpelweg je eigen functie-prototype als volgt te genereren:

  void writeHighscore (Highscore hs); // function prototypevoid writeHighscore (Highscore hs) {// do stuff}  

Nu compileert het zonder fouten. Het detecteert uw eigen functie-prototype en genereert daarom geen eigen prototype. De eerste paar regels van het gegenereerde bestand zijn nu:

  #line 1 "sketch_jul06b.ino" #include "Arduino.h" void setup () ; void loop (); # line 1  

Dat verontrustende prototype is verdwenen.



Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...