Frage:
Enum kann nicht als Funktionsargument verwendet werden
Loreno
2016-08-07 21:55:09 UTC
view on stackexchange narkive permalink

Ich erklärte meine Aufzählung und nannte sie Dir. Ich wollte einen Wert dieses Typs in meiner Funktion Move () verwenden. Hier ist der Code:

  enum Dir {vorwärts = 1, rückwärts = 2, links = 3, rechts = 4}; void Move (Dir Richtung, int Entfernung) {Richtung = vorwärts;} void setup () {// Gib deinen Setup-Code hier ein, um ihn einmal auszuführen:} void loop () {// Gib deinen Hauptcode hier ein, um ihn wiederholt auszuführen:}  

Leider bekomme ich den Folgende Fehler:

  V2.ino: 23: 13: Fehler: Variable oder Feld 'Verschieben' deklariert voidV2.ino: 23: 13: Fehler: 'Dir' wurde in diesem BereichV2 nicht deklariert. ino: 23: 29: Fehler: erwarteter primärer Ausdruck vor 'int'  

Was ist los?

Bitte posten Sie ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve)
OK für mich kompiliert, als ich (leere) setup () und loop () Funktionen geliefert habe. Es gibt weniger als 23 Zeilen (die Zeilennummer der genannten Fehler). Ich gehe davon aus, dass wir einen Auszug sehen. Können Sie Ihren Code auf das Minimum reduzieren, das erforderlich ist, um das Problem zu demonstrieren und dies vollständig zu zeigen?
@JRobert Ich mochte dich auch genauso: Ich habe eine neue Skizze erstellt und den Code aus meinem Beitrag kopiert (ich habe nichts in setup () oder loop () eingefügt). Ich habe die gleichen Fehler. Warum bekomme ich sie?
Ich zweite JRobert: OK für mich kompiliert mit `void setup () {} void loop () {}`, abgesehen von ein paar Warnungen über die nicht verwendeten Funktionsparameter.
Ich verwende Arduino IDE 1.7.10. Ich werde diesen Code auf meinem zweiten PC überprüfen
Also habe ich versucht, den gleichen Code auf meinem Laptop (Arduino IDE 1.7.7) zu kompilieren, und das Ergebnis ist das gleiche. Ich habe buchstäblich: leere void setup (), leere void loop () und den Code aus meinem Beitrag oben (den ich über die Funktion setup () gesetzt habe). Eigentlich habe ich meinen Beitrag aktualisiert, um alles zu zeigen, was ich in meiner .ino-Datei habe.
Sie leiden darunter, dass der Präprozessor der IDE dick ist und etwas falsch macht.
Was kann ich dagegen tun?
Ich arbeite daran ... Ich warte nur darauf, dass 1.7.10 heruntergeladen wird.
OK danke. Gleiches passiert am 1.7.7
Vier antworten:
Edgar Bonet
2016-08-07 23:31:42 UTC
view on stackexchange narkive permalink

Das Problem ist nicht aufgetreten, da ich normalerweise ein Makefile anstelle der Arduino-IDE verwende. Ich habe es jetzt mit der IDE-Version 1.0.5 versucht und hatte das gleiche Problem wie Sie. Die Korrektur besteht darin, die Funktion explizit zu deklarieren, bevor sie definiert wird:

  void Move (Richtung, int Entfernung); void Move (Richtung, Richtung int) {direction = forward;}  
Majenko
2016-08-07 23:31:52 UTC
view on stackexchange narkive permalink

Die Arduino 1.7.x-Serie von Arduino.org verwendet das alte Build-System, das stark beschädigt ist, wenn Sie versuchen, etwas Komplexeres als einfache Typen auszuführen.

Sie fügt Ihren Funktionen oben Prototypen hinzu des Programms, damit Sie nicht die richtige Reihenfolge finden müssen, aber es bringt sie völlig an die falsche Stelle. Das Ergebnis ist eine C ++ - Datei, die folgendermaßen aussieht:

  #include <Arduino.h>void Move (Richtung, int Entfernung); void setup (); void loop (); enum Dir {forward = 1, rückwärts = 2, links = 3, rechts = 4}; void Move (Richtung, int Entfernung) {Richtung = vorwärts;} void setup () {// Gib deinen Setup-Code hier ein, um ihn einmal auszuführen:} void loop () {// Geben Sie hier Ihren Hauptcode ein, um ihn wiederholt auszuführen:}  

Wie Sie sehen können, wurde der Prototyp mit Dir vor der Definition von Dir , und so schlägt es kläglich fehl.

Es gibt einige Hacks, die Sie durchführen können, um die Prototypen nach Ihrer Definition zu platzieren, aber ich kann mich nicht erinnern, was sie sind

Die einfache Antwort besteht darin, Arduino 1.7.10 fallen zu lassen und stattdessen von Arduino.cc zu Arduino 1.6.10 zu wechseln. Dies verwendet das Arduino Builder-System, das die Dinge viel besser macht, einschließlich der Platzierung der Prototypen an der richtigen Stelle.

Trotz der Nummerierung ist 1.7.10 keine neuere Version als 1.6.10 - es ist eine ältere Version, die neu nummeriert wurde . Es ist alles Teil des Schismas zwischen den beiden Hälften von Arduino.

Noch besser ist es, die schreckliche Arduino-IDE vollständig loszuwerden und eine der vielen weitaus besseren IDEs zu verwenden, die es gibt.

Vielen Dank. Welche andere IDE empfehlen Sie? Um ehrlich zu sein, ich kann Arduino IDE nicht ausstehen, der Code ist wirklich schwer zu lesen, ich persönlich schreibe Programme in Visual Studio Code. Ich wünschte, es wäre möglich, von dort auf Arduino hochzuladen.
Nun, ich muss [UECIDE] (http://uecide.org) empfehlen, aber dann bin ich voreingenommen, seit ich es geschrieben habe;)
Ich werde das überprüfen
Ich würde Arduino überhaupt nicht empfehlen, stattdessen C / C ++ direkt verwenden. Es gibt eine Vielzahl von IDE für C / C ++. Wenn Sie einen echten Programmier-Pod erhalten, können Sie sogar Hardware-Register in einem Schritt überprüfen.
aastronaut
2016-08-07 23:46:05 UTC
view on stackexchange narkive permalink

Wie Majenko betont, scheint dies ein Problem beim Parsen des Präprozessors zu sein.

Sie haben zwei Möglichkeiten:

  • Verwenden Sie die Edgar Bonets-Lösung und deklarieren Sie die Funktion, bevor Sie sie definieren
  • Erstellen Sie eine separate Header-Datei für Ihre Aufzählung in einem neuen Tab und importieren Sie sie mit #include "[myEnumsHeaderFilename] .h"
  •   #include "myEnums.h". void Move (Richtung Richtung, int Entfernung) {Richtung = vorwärts; } void setup () {} void loop () {}  
    Oder verwenden Sie einfach eine andere IDE. Danke für deinen Beitrag
    Flanker
    2016-08-07 23:32:00 UTC
    view on stackexchange narkive permalink

    Sie müssen einen neuen Aufzählungstyp definieren:

      typedef enum {vorwärts = 1, rückwärts = 2, links = 3, rechts = 4} Dir; void Move (Dir Richtung, int distance) {direction = forward;}  

    ohne typedef Ihr Dir ist nur eine statische Aufzählungsvariable und kann nicht zum Definieren anderer Variablen verwendet werden.

    C ++ erstellt standardmäßig Typedefs aller Aufzählungen und Strukturen, ohne dass Sie dies manuell tun müssen.


    Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
    Loading...