Arduino IDE의 다른 탭에서 클래스를 선언 할 수없는 이유는 무엇입니까?


20

일을 더 잘 정리하기 위해 코드 일부를 Arduino IDE의 두 번째 탭으로 옮기고 싶었습니다. 처음에는 함수 이동 만 시도했지만 정상적으로 작동하는 것 같습니다. setup()기본 탭 의 함수에서 함수를 호출 할 수 있으며 컴파일하거나 업로드하는 데 아무런 문제가 없었습니다.

그러나 전체 수업을 두 번째 탭에 넣으려고했지만 갑자기 더 이상 작동하지 않았습니다. 예를 들면 다음과 같습니다.

탭 1 :

TestClass obj;

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

void loop()
{
    //...
}

탭 2 :

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

이것을 컴파일하려고 할 때 다음과 같은 오류가 발생했습니다.

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

클래스가 아닌 다른 탭에서 함수를 인식하는 이유는 무엇입니까? Arduino IDE에서 작동시키는 방법이 있습니까, 아니면 Eclipse와 같은 대안을 사용해야합니까?


이것이 코드 전체입니까? 파일 이름은 무엇입니까? #include? 와 같은 전 처리기 지시문이 없습니까?
asheeshr

예, 그것은 코드의 전체입니다. 탭의 이름은 tab1하고 tab2각각. 이름은 IDE를 사용하여 설정되었으므로 기본 파일은 모두 .ino입니다.
Peter Bloomfield

나는 Arduino IDE 가하는 불안한 포커를 싫어하기 시작했습니다. AVR에 비해 사용 편의성이 높아진 것은 이와 같은 것들을 깨뜨리는 데 도움이됩니다.
Cybergibbons

답변:


13

Arduino IDE 내 .pde에서 다른 .pde파일의 한 파일에 선언 된 클래스를 선언하고 사용할 수 없습니다 .

한 가지 해결 방법은 두 번째 파일을 C ++ 소스 파일 ( .cpp)로 만든 다음 #include "<filename>"첫 번째 파일의 시작 부분에 지시문 을 추가하는 것 입니다.


이 코드는 올바르게 컴파일됩니다 :

탭 1 :

#include "test.cpp"

TestClass obj;

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

void loop()
{
    //...
}

test.cpp :

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

해결 방법에 감사드립니다. 기본 예제에서는 작동하지만 불행히도 .cpp 파일에 Arduino 관련 호출을 추가하면 작동하지 않습니다. 예를 TestClass::init()들어을 호출하려고 pinMode()하면 컴파일러 pinMode는이 범위에서 선언되지 않은 내용을 불평합니다 . 내 수업에서 Arduino 함수에 액세스하는 방법이 있습니까?
피터 블룸필드

6
@ PeterR.Bloomfield 파일 #include <Arduino.h>맨 위에 a 를 추가 .cpp하십시오.
asheeshr

1
다른 사람들에게 소스 파일 ( #include "test.cpp") 을 포함 시키도록 가르치는 것은 좋지 않다고 생각합니다 . 작동하지만 연결 프로세스의 이해를 방해 할 수 있습니다. 헤더 파일 만 포함해야합니다.
화성

1
@Mars에 동의합니다. 더 나은 해결책은 클래스 선언을 .h 파일에 넣고 정의 (구현)를 .cpp 파일에 넣는 것입니다. 따라서 프로젝트에 두 개의 추가 파일이 있습니다. 이것은 실제로 클래스를 처리하는 일반적인 방법입니다.
Nick Gammon

6

Arduino IDE가 작동하는 방식은 코드 (IDE에서 작성한 코드)를 "메인"코드로 컴파일하는 것입니다. 그런 다음 가져온 모든 라이브러리에서 코드를 가져와 기본 코드와 함께 컴파일합니다. 제안한 작업을 수행하려면 Arduino 용 라이브러리를 만들어야합니다.

Arduino 라이브러리에 대한 추가 정보는 다음과 같습니다.

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

다음은 라이브러리를 만드는 방법에 대한 것입니다.

http://arduino.cc/en/Hacking/LibraryTutorial // 이것은 imo를 이해하는 가장 쉬운 방법입니다
http://playground.arduino.cc/Code/Library
http://www.divilabs.com/2013/03/ write-your-own-arduino-library.html #

다음은 .cpp 파일에서 Arduino 함수를 호출하는 데 아무런 문제가 없음을 알 수 있으므로 https://github.com/jamolnng/Arduino/tree/master/libraries/ShiftRegister 를 작성한 예제 라이브러리입니다. 라이브러리를 테스트)


3
방금 생성에 또한 가능 .h하고 .cpp별도의 라이브러리를 만들 필요없이, 주요 프로젝트의 파일을.
microtherion
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.