Arduino vermasselt ein triviales Programm mit Enum


7

Seht diesen Wahnsinn:

enum WhatArduinoIs {
  Easy, But, Insane, Obsolete, And, Far, Worse, Than, mBed
};

void TellMe(WhatArduinoIs pls) { }

void setup() { }
void loop() { }

Ich bin ziemlich gut in C ++, also bin ich mir ziemlich sicher, dass das kompiliert werden sollte. Ich erhalte jedoch diesen Fehler:

sketch_jan21b.ino:3:13: error: variable or field 'TellMe' declared void
sketch_jan21b.ino:3:13: error: 'WhatArduinoIs' was not declared in this scope
Error compiling.

Ich bin schon einmal auf die Neigung der Arduino "IDE" gestoßen, verrückte und völlig unrobustische Änderungen an Programmen vorzunehmen. Insbesondere wenn Sie #includeBibliotheken verwenden, fügt Arduino die relevanten C ++ - Dateien nur dann magisch hinzu, wenn sich das #includein Ihrer Hauptskizze befindet. #include <LiquidCrystal.h>in einer anderen C ++ - Datei? Linkfehler.

Ich vermute in diesem Fall, dass Arduino auf magische Weise versucht, Funktionsdeklarationen am Anfang der Datei hinzuzufügen, damit ihre Reihenfolge keine Rolle spielt. Dh es verwandelt die Datei in Folgendes:

void TellMe(WhatArduinoIs pls);

enum WhatArduinoIs {
  Easy, But, Insane, Obsolete, And, Far, Worse, Than, mBed
};

void TellMe(WhatArduinoIs pls) { }

void setup() { }
void loop() { }

Das funktioniert offensichtlich nicht. Wie kann ich Arduino sagen, dass er mein verdammtes Programm in Ruhe lassen soll?

Antworten:


6

Sie können das Problem umgehen, indem Sie your enumund function in einen Namespace einfügen. Sie können sogar unbenannte C ++ - Namespaces nutzen, wenn Sie möchten:

namespace
{
  enum WhatArduinoIs {
    Easy, But, Insane, Obsolete, And, Far, Worse, Than, mBed
  };

  void TellMe(WhatArduinoIs pls) { }
}

void setup() { }
void loop() { }

Es ist ärgerlich (wie viele Dinge in der Arduino IDE), aber es scheint zu funktionieren.

Wenn Sie mehr Erfahrung mit der Programmierung haben, sollten Sie eine IDE eines Drittanbieters mit einem Arduino-Plugin wie Eclipse verwenden. Die Arduino IDE ist wirklich nur für Anfänger gedacht.


Oder sogar so etwas wie Geany mit (oder ohne) Ino.
Ignacio Vazquez-Abrams

Vielen Dank! Ich wollte sagen, das einzige, was schlimmer als Arduinos IDE ist, ist Eclipse, aber ich denke tatsächlich, dass sogar Eclipse besser sein könnte! Ich bevorzuge Qt Creator - ich benutze das für mBed. Möglicherweise muss ich endlich Arduino darin einrichten. Das Problem ist, dass viele Details des Build-Systems von Arduino verborgen sind, Arduino.exeso dass es schwierig ist, eine andere IDE einzurichten. Ich wusste nicht, dass Eclipse ein Arduino-Plugin hat.
Timmmm

Es gibt auch das kostenlose Atmel Studio Ide. Es unterstützt professionelle Programmierfunktionen wie mehrere Quelldateien, SVN und den AVR Dragon Debugger.
Kiwiron

Dies wird behoben. Probieren Sie die hier verlinkte IDE github.com/arduino/Arduino/pull/2729 aus . Die Skizze wird gut kompiliert.
Federico Fissore

Oder Sie können einfach ein einfaches Makefile verwenden. Es gibt ein paar generische Arduino-Makefiles, die fast alles tun, was die IDE tut, außer mit Ihrer Quelle herumzuspielen.
Edgar Bonet

4

Sie scheinen richtig zu sein, was die Arduino-IDE mit Ihrer Skizze macht.

Arduino verarbeitet keine .h- oder .cpp-Dateien vor, sodass Sie eine zweite Datei verwenden können. Sie können auch die Funktion der IDE zum Auffinden von Regex mit einer Dummy- throw()Anweisung wie der folgenden unterbrechen :

void TellMe(WhatArduinoIs pls) throw() { }

Der Dummy-Wurf ermöglicht es mir, am 1.5.8 für mich zu kompilieren


1

Alles was Sie brauchen ist ein Funktionsprototyp. Ich habe eine detaillierte Erklärung unter Klassen und Objekte: Wie viele und welche Dateitypen brauche ich tatsächlich, um sie zu verwenden?

Das kompiliert also:

enum WhatArduinoIs {
  Easy, But, Insane, Obsolete, And, Far, Worse, Than, mBed
};

void TellMe(WhatArduinoIs pls);  // prototype
void TellMe(WhatArduinoIs pls) 
  {
  }
void setup() { }
void loop() { }

Off-Site-Referenz: So vermeiden Sie die Macken der Vorverarbeitung der IDE-Skizzendatei

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.