Fråga:
Varför kan jag inte förklara en klass i en annan flik i Arduino IDE?
Peter Bloomfield
2014-02-13 21:03:21 UTC
view on stackexchange narkive permalink

Jag ville flytta ut en del av min kod till en andra flik i Arduino IDE, för att hålla saker bättre organiserade. Först försökte jag bara flytta en funktion, och det verkade fungera bra. Jag kunde ringa funktionen från setup () -funktionen på min huvudflik och det fanns inga problem att kompilera eller ladda upp.

Jag försökte dock sätta en hel klass i den andra och plötsligt fungerade det inte längre. Till exempel:

Tab 1:

  TestClass obj; void setup () {obj.init ();} void loop () { //...}

  class TestClass {public: void init () {//. ..}};  

När jag försökte kompilera detta gav det mig följande fel:

  tab1: 1: error: 'TestClass' does inte namnge typtab1.ino: I funktionen 'void setup ()': tab1: 5: error: 'obj' förklarades inte i detta omfång  

Varför känner den igen en funktion i en annan flik, men inte en klass? Finns det ett sätt att få det att fungera i Arduino IDE, eller behöver jag använda ett alternativ som Eclipse?

Är detta hela koden? Vilka är filnamnen? Finns det inga förprocessordirektiv som "# include"?
Ja, det är hela koden. Flikarna heter "tab1" respektive "tab2". Namnen ställdes in med IDE, så de underliggande filerna är båda '.ino'.
Jag börjar hata den jiggery-pokery som Arduino IDE gör. Vad det lägger till i användarvänlighet över AVR tar det bort när du bryter saker som detta.
Två svar:
#1
+14
asheeshr
2014-02-13 22:21:10 UTC
view on stackexchange narkive permalink

Det är inte möjligt att deklarera och använda klasser som deklarerats i en .pde -fil i en annan .pde -fil från Arduino IDE.

En lösning är att göra den andra filen till en C ++ källfil ( .cpp ) och sedan lägga till ett #include "<filename>" direktiv i början av den första filen.


Den här koden kompileras korrekt:

Flik 1:

  #include "test.cpp" TestClass obj; void setup () {obj .init ();} tomrumsslinga () {//...}

test.cpp:

  class TestClass {public: void init ( ) {// ...}};  
Tack för lösningen. Det fungerar för det grundläggande exemplet, men tyvärr fungerar det inte om jag lägger till några Arduino-specifika samtal i .cpp-filen. Till exempel, om `TestClass :: init ()` försöker anropa `pinMode ()`, klagar kompilatorn över att `pinMode 'inte deklareras i detta omfång. Finns det ett sätt att komma åt Arduino-funktionerna i min klass?
@PeterR.Bloomfield Lägg till en `#include ` till toppen av `.cpp`-filen.
Jag tycker att det inte är bra att lära andra att inkludera källfiler (`#include" test.cpp "`). Det fungerar, men kan bromsa förståelsen för länkningen. Endast rubrikfiler ska inkluderas.
Jag håller med @Mars - en bättre lösning är att placera klassdeklarationen i en .h-fil och definitionen (implementeringen) i en .cpp-fil. Så du har två extra filer i projektet. Detta är faktiskt det normala sättet att hantera klasser.
#2
+6
Jesse Laning
2014-02-13 22:21:35 UTC
view on stackexchange narkive permalink

Arduino IDE: s funktion är att den sammanställer din kod (koden du skriver i IDE) som "huvudkoden". Sedan hämtar kod från alla bibliotek du har importerat och sammanställer det tillsammans med huvudkoden. För att göra det du föreslår krävs att du skapar ett bibliotek för Arduino.

Här är lite mer information om Arduino-bibliotek:

http://arduino.cc/ sv / Guide / Bibliotek

Och här är några om hur du skapar ett bibliotek:

http://arduino.cc/en/Hacking/LibraryTutorial // den här är den lättaste att förstå imo
http://playground.arduino.cc/Code/Library
http: // www .divilabs.com / 2013/03 / skriv-ditt-eget-arduino-bibliotek.html #

Här är ett exempelbibliotek jag skrev https: // github.com/jamolnng/Arduino/tree/master/libraries/ShiftRegister som du kan se finns det inga problem med att ringa Arduino-funktioner från .cpp-filen (jag vet, jag har testat biblioteket)

Det är också möjligt att bara skapa '.h' och '. Cpp' filer i ditt huvudprojekt utan att behöva skapa ett separat bibliotek.


Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...