Neden Arduino IDE'deki başka bir sekmede bir sınıf beyan edemiyorum?


20

Bazı şeyleri daha düzenli tutmak için kodumun bir kısmını Arduino IDE'deki ikinci bir sekmeye taşımak istedim. İlk başta, sadece bir işlevi hareket ettirmeye çalıştım ve iyi çalışıyor gibi görünüyordu. setup()Fonksiyonu ana sekmemdeki fonksiyondan çağırabilirim ve derleme veya yükleme ile ilgili herhangi bir sorun yoktu.

Ancak, tüm sekmeyi ikinci sekmeye koymaya çalıştım ve aniden artık işe yaramadı. Örneğin:

Sekme 1:

TestClass obj;

void setup()
{
    obj.init();
}

void loop()
{
    //...
}

Sekme 2:

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

Bunu derlemeye çalıştığımda bana şu hataları verdi:

tab1:1: error: 'TestClass' does not name a type
tab1.ino: In function 'void setup()':
tab1:5: error: 'obj' was not declared in this scope

Neden başka bir sekmedeki bir işlevi tanıyor, bir sınıfı tanımıyor? Arduino IDE'de çalışmasını sağlamanın bir yolu var mı yoksa Eclipse gibi bir alternatif mi kullanmam gerekiyor?


Bu kodun tamamı mı? Dosya adları nelerdir? Önişlemci gibi yönergeler yok #includemu?
asheeshr

Evet, kodun tamamı bu. Sekmeler sırasıyla tab1ve olarak adlandırılır tab2. Adlar IDE kullanılarak ayarlandı, bu nedenle temel dosyaların ikisi de .ino.
Peter Bloomfield

Arduino IDE'nin yaptığı jiggery pokery'den nefret etmeye başlıyorum. AVR üzerinden kullanım kolaylığı eklediğinde, bunun gibi şeyleri kırmak ortadan kalkar.
Cybergibbons

Yanıtlar:


13

Arduino IDE içinden bir .pdedosyada bildirilen sınıfları başka bir dosyada bildirmek ve kullanmak mümkün değildir .pde.

Geçici bir çözüm, ikinci dosyayı C ++ kaynak dosyasına ( .cpp) dönüştürmek ve ardından #include "<filename>"ilk dosyanın başına bir yönerge eklemektir .


Bu kod doğru bir şekilde derlenir:

Sekme 1:

#include "test.cpp"

TestClass obj;

void setup()
{
    obj.init();
}

void loop()
{
    //...
}

test.cpp:

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

Geçici çözüm için teşekkürler. Temel örnek için çalışır, ancak .cpp dosyasına Arduino'ya özgü çağrılar eklersem maalesef işe yaramaz. Örneğin, TestClass::init()çağırmaya çalışırsa pinMode(), derleyici pinModebu kapsamda bildirilmeyen şikayetçi olur . Sınıfımdaki Arduino fonksiyonlarına erişmenin bir yolu var mı?
Peter Bloomfield

6
@ PeterR.Bloomfield Dosyanın #include <Arduino.h>en üstüne bir ekleyin .cpp.
asheeshr

1
Başkalarına kaynak dosyaları ( #include "test.cpp") eklemeyi öğretmenin iyi olmadığını düşünüyorum . Çalışır, ancak bağlantı sürecinin anlaşılmasını engelleyebilir. Yalnızca başlık dosyaları dahil edilmelidir.
Mars

1
@Mars ile katılıyorum - daha iyi bir çözüm, sınıf bildirimini bir .h dosyasına ve tanımı (uygulama) bir .cpp dosyasına koymaktır. Yani projede iki ekstra dosya var. Aslında bu, sınıfları ele almanın normal yoludur.
Nick Gammon

6

Arduino IDE'nin çalışma şekli, kodunuzu (IDE'ye yazdığınız kod) "ana" kod olarak derlemesidir. Ardından, içe aktardığınız tüm kitaplıklardan kodu alır ve bunu ana kodla birlikte derler. Önerdiğiniz şeyi yapmak için Arduino için bir kütüphane oluşturmanızı gerektirir.

İşte Arduino kütüphaneleri hakkında daha fazla bilgi:

http://arduino.cc/en/Guide/Libraries

İşte kitaplığın nasıl oluşturulacağıyla ilgili bazı bilgiler:

http://arduino.cc/en/Hacking/LibraryTutorial // imo anlamak için en kolay olanı
http://playground.arduino.cc/Code/Library
http://www.divilabs.com/2013/03/ yazma-your-kendi-arduino-library.html #

İşte yazdığım bir örnek kütüphanesidir https://github.com/jamolnng/Arduino/tree/master/libraries/ShiftRegister sen (Ben ettik, biliyorum .Cpp dosyasından Arduino işlevlerine çağrı ile sorun yoktur görebileceğiniz gibi kütüphaneyi test etti)


3
Ayrı bir kütüphane oluşturmak zorunda kalmadan ana projenizde sadece dosya .hve .cppdosyalar oluşturmak da mümkündür .
microtherion
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.