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.