Küsimus:
Miks ei saa ma Arduino IDE teises vahekaardil klassi deklareerida?
Peter Bloomfield
2014-02-13 21:03:21 UTC
view on stackexchange narkive permalink

Tahtsin asjad paremini korraldatud kujul Arduino IDE-s teisele vahelehele teisaldada. Alguses proovisin ainult funktsiooni teisaldada ja see näis töötavat hästi. Võisin funktsiooni kutsuda oma peamise vahekaardi funktsioonist setup () ja kompileerimisel või üleslaadimisel ei olnud probleeme.

Siiski proovisin panna terve klassi teise ja äkki see enam ei töötanud. Näiteks:

vaheleht 1:

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

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

Kui proovisin seda kompileerida, tekitas see mulle järgmisi vigu:

  tab1: 1: tõrge: 'TestClass' teeb ei nimeta typetab1.ino: Funktsioonis 'void setup ()': tab1: 5: viga: 'obj' ei kuulutatud selles ulatuses  

Miks see teises funktsioon ära tunneb vahekaart, kuid mitte klass? Kas seda saab Arduino IDE-s toimima panna või pean kasutama sellist alternatiivi nagu Eclipse?

Kas see on kogu kood? Mis on failinimed? Kas pole selliseid eeltöötleja direktiive nagu "# include"?
Jah, see on kogu kood. Vahekaartide nimed on vastavalt "tab1" ja "tab2". Nimed määrati IDE abil, nii et alusfailid on mõlemad `.ino`.
Ma hakkan vihkama arduino IDE-ga tehtud pokkerit. Mida see lisab AVR-i kasutamismugavuses, võtab see ära selliste asjade purustamisel.
Kaks vastused:
#1
+14
asheeshr
2014-02-13 22:21:10 UTC
view on stackexchange narkive permalink

Arduino IDE-s ei ole võimalik ühes .pde -dokumentides deklareeritud klasse deklareerida ja kasutada teises .pde -failis.

Üks lahendus on teha teine ​​fail C ++ lähtefailiks ( .cpp ) ja seejärel lisada esimese faili algusesse #include "<filename>" .


See kood kompileerub õigesti:

1. vahekaart:

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

test.cpp:

  klass TestClass {public: void init ( ) {// ...}};  
Täname lahenduse eest. See töötab põhinäite puhul, kuid kahjuks ei toimi see, kui lisan .cpp-faili Arduino-spetsiifilised kõned. Näiteks kui "TestClass :: init ()" üritab helistada nupule "pinMode ()", kurdab kompilaator, et "pinMode" ei olnud selles ulatuses deklareeritud. Kas minu klassis on võimalik Arduino funktsioonidele juurde pääseda?
@PeterR.Bloomfield Lisage faili ".cpp" ülaosasse "#include ".
Ma arvan, et pole hea õpetada teisi lisama algfaile ("#include" test.cpp ""). See töötab, kuid võib pidurdada arusaamist linkimisprotsessist. Lisada tuleks ainult päisefailid.
Nõustun @Mars-ga - parem lahendus on panna klassi deklaratsioon .h-faili ja definitsioon (juurutamine) .cpp-faili. Nii et teil on projektis kaks lisafaili. See on tegelikult tavaline viis klasside käsitlemiseks.
#2
+6
Jesse Laning
2014-02-13 22:21:35 UTC
view on stackexchange narkive permalink

Arduino IDE töötab nii, et see kompileerib teie koodi (koodi, mille kirjutate IDE-sse) peamise koodina. Seejärel tõmbab see koodi kõigist teie imporditud raamatukogudest ja kompileerib selle koos põhikoodiga. Soovitatud toimingu tegemiseks peate looma Arduinole teegi.

Siin on lisateavet Arduino teekide kohta:

http://arduino.cc/ et / Juhend / Raamatukogud

Ja siin on mõned teegi loomise kohta:

http://arduino.cc/en/Hacking/LibraryTutorial // seda on kõige lihtsam mõista imo
http://playground.arduino.cc/Code/Library
http: // www .divilabs.com / 2013/03 / write-your-own-arduino-library.html #

Siin on näite kogu, mille kirjutasin https: // github.com/jamolnng/Arduino/tree/master/libraries/ShiftRegister, nagu näete, Arduino funktsioonide helistamisega .cpp-failist pole probleeme (tean, et olen teeki testinud)

Samuti on oma põhiprojektis võimalik lihtsalt luua faile. .H ja .cpp, ilma et peaksite eraldi raamatukogu looma.


See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...