Spørgsmål:
Hvordan kan jeg videregive et objekt som en parameter til en funktion?
krystah
2014-11-13 00:53:59 UTC
view on stackexchange narkive permalink

Jeg laver et lille spil og vil gemme high-scores. Jeg lavede en Highscore-klasse øverst i skitsefilen, sådan her:

  klasse Highscore {public: String name; int score; String toString () {return this->name + "-" + (String) score; } Highscore (String name, int score) {this->name = name; denne->score = score; }}; opsætning () {// etc  

Nu. Nær bunden af ​​skitsen har jeg en funktion, som jeg vil tage et Highscore-objekt som parameter, men compileren vil ikke lade mig. Eksempel:

  ugyldig writeHighscore (Highscore hs) {File f = SD.open ("high.txt", FILE_WRITE); // Gør ting  

Komplikationsfejlen er som følger:

sketch.ino: 19: 21: error: variabel eller felt 'writeHighscore' erklæret ugyldig
sketch.ino: 19: 21: fejl: 'Highscore' blev ikke erklæret i dette omfang
sketch.ino: I funktion 'void setup ()':
sketch.ino: 64: 20: error : 'writeHighscore' blev ikke erklæret i dette omfang

Efter ændring af parametertype til String, int eller hvad som helst, forsvinder alle fejlene. Jeg er i stand til at oprette Highscore-objekter INDE I writeHighscore () -funktionen, men hvordan kan jeg sende objekter til den?

Rediger 1 - Oprettelse af objekt

  Highscore hs = Highscore ("John", 975); Serial.println (hs.toString ()); // Udskriver "John - 975" som forventetwriteHighscore (hs); // Fejl  
kan du venligst sende koden, hvor du opretter Highscore-objekt?
Inkluderet objekt oprettelse kode.
Jeg tror, ​​problemet er en eller anden manglende beslag. Fordi der ikke er nogen fuld kode, kan jeg gætte og se: 1) * opsætning () * skal være * ugyldig opsætning () *. Men det skal generere C ++ advarsel / fejl. 2) Passering af klasseparameter tvinger objektkopiering, når proceduren kaldes. gcc skal også generere en advarsel, hvis der mangler kopibygger. Brug: * void writeHighscore (Highscore & hs) * eller * void writeHighscore (Highscore \ * hs) * Kopier kompilerbar snipet i dit indlæg.
Som angivet i det originale spørgsmål, ved at ændre Highscore-parameteren ved f.eks. En streng eller en int, forsvinder fejlene, der mangler parenteser. Jeg har også prøvet tilgangen `& hs` før jeg skrev indlægget, samt at sende markøren` writeHighscore (& hs) `->` ugyldig writeHighscore (Highscore * hs) `men til ingen nytte.
Venligst post den fulde kildekode, ellers er linjenumrene i kompileringsfejl meningsløse.
To svar:
BrettAM
2014-11-13 02:35:40 UTC
view on stackexchange narkive permalink

Du gør alt rigtigt, men du skal flytte klassen uden for din .ino-fil for at dette skal fungere. Jeg er ikke sikker på, hvorfor arduino IDE får dig til at gøre dette (se redigering), men det er noget, jeg har stødt på før.

Jeg har lige testet dette og bevæger mig klassedeklarationen uden for ino og i en header-fil i projektmappen gør det korrekt. Husk bare at inkludere overskriften, du laver i ino, og at #include "Arduino.h" i headeren for at få adgang til "String" igen.

Teknisk set er kun videresendedeklaration for klassen skal være i en anden fil.

Rediger:

Jeg er relativt sikker på, hvad der sker, er at IDE genererer fremad erklæringer for alle dine funktioner, men ikke klassen, som placeres før din klassedefinition. Dette betyder, at det at løse den funktion, regex, IDE bruger, med en dummy "throw ()" løser dit problem. for eksempel:

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

skal fungere fint (det fungerede for mig)

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

Dette er et klassisk eksempel på, at IDE "hjælper" dig ved at generere funktionsprototyper og ikke gøre det særlig godt. Eksempel på kode, der skal reproduceres:

  klasse Highscore {public: String name; int score; String toString () {return this->name + "-" + (String) score; } Highscore (String name, int score) {this->name = name; denne->score = score; ugyldig opsætning () {} ugyldig sløjfe () {} ugyldig skriveHøjscore (Highscore hs) {// gør ting}  

Dette giver fejlen:

sketch_jul06b: 4: error: variabel eller felt 'writeHighscore' erklæret voidsketch_jul06b: 4: error: 'Highscore' blev ikke erklæret i dette omfang

Hvis du ser på output fra IDE preprocessoren (du kan gøre dette ved at aktivere den detaljerede kompilering og finde ud af navnet på den fil, den faktisk kompilerer) ser du dette:

  #line 1 "sketch_jul06b.ino" #include "Arduino.h" void setup (); void loop (); void writeHighscore (Highscore hs); # line 1class Highscore { offentlig: Strenge navn; int score; String toString () {return this->name + "-" + (String) score; } Highscore (String name, int score) {this->name = name; denne->score = score; ugyldig opsætning () {} ugyldig sløjfe () {} ugyldig skriveHøjscore (Highscore hs) {// gør ting}  

Den vigtige del er, at den sætter:

  ugyldig writeHighscore (Highscore hs);  

før hvor klassen er erklæret.


Du kan rette fejlen ved blot at generere din egen funktionsprototype som denne:

  void writeHighscore (Highscore hs); // funktion prototypevoid writeHighscore (Highscore hs) {// gør ting}  

Nu kompileres den uden fejl. Det registrerer din egen funktionsprototype og genererer derfor ikke sin egen. De første par linjer i den genererede fil er nu:

  #line 1 "sketch_jul06b.ino" #include "Arduino.h" ugyldig opsætning () ; void loop (); # line 1  

Den foruroligende prototype er væk.



Denne spørgsmål og svar blev automatisk oversat fra det engelske sprog.Det originale indhold er tilgængeligt på stackexchange, som vi takker for den cc by-sa 3.0-licens, den distribueres under.
Loading...