правильный способ включить файлы .cpp и .h в скетч Arduino

Во-первых, проблема:

Основной файл эскиза:

char foo;            // required to clean up some other problems
#include <Arduino.h> // tried it in desperation, no help
#include "a.h"
void setup(){
Serial.begin(9600);
Serial.println("\nTest begins");
for (int num = -1; num < 1; num++){
Serial.print(num);
if (isNegative(num)){
Serial.println(" is negative");
} else {
Serial.println(" is NOT negative");
}
}
}

void loop(){}

// a.h

#ifndef H_A
#define H_A

boolean isNegative(int x);                  // Err#1
int anotherOdity();

#endif // H_A

// a.cpp

#include "a.h"
int isNegative(int x){
Serial.println("I can't print this from inside my INCLUDE FILE"); //Err#2
if (x<0) return true;
return false;
}

int anotherOdity(){
char ch[5];
memcpy(ch,"1",1);  //doesn't work, memcpy not declared      // Err#3
}

Выше, как есть, не компилируется, и вот ошибки, которые я получаю:

In file included from a.cpp:1:
a.h:4: error: 'boolean' does not name a type
a.cpp: In function 'int isNegative(int)':
a.cpp:4: error: 'Serial' was not declared in this scope
a.cpp: In function 'int anotherOdity()':
a.cpp:11: error: 'memcpy' was not declared in this scope

Первая проблема — это логический тип, который, похоже, страдает от некоторого искажения имени, которое делает среда Arduino, но это обычно исправляется char foo; в основном файле. И в определенных ситуациях это так. Но использовать этот тип в .cpp Файл генерирует эту ошибку.

Я вижу, что ошибки 2 и 3 связаны, но как мне получить их в области видимости? Я понимаю, что частью проблемы, вероятно, является #include сам (может быть) потому что Serial а также memcpy еще не определены / не объявлены? Я пытался в том числе Arduino.h библиотека, но это не помогло. На самом деле, это помогло решить булеву проблему, но только в том случае, если все .h файл (как я буду обсуждать ниже), это не поможет приведенному выше примеру.

Если я соберу три файла вместе и у меня все будет в основном наброске (.ino), работает как надо. Но идея здесь в том, что я хочу выделить некоторый код и сделать мой набросок более читабельным.

Ближайшее решение, которое я нашел, было найдено здесь: http://liudr.wordpress.com/2011/02/16/using-tabs-in-arduino-ide/ где после выполнения моих собственных тестов я определил, что если я положу ВСЕ в .h файл, это работает!

Например, оставить основной файл эскиза без изменений, если я удалю a.cpp и создать просто a.h (следующим образом) это работает!

#ifndef H_A
#define H_A

boolean isNegative(int x){
Serial.println("I can't print this from inside my INCLUDE FILE");
if (x<0) return true;
return false;
}

int anotherOdity(){
char ch[5];
memcpy(ch,"1",1);  //doesn't work, memcpy not declared
}

#endif // H_A

Это исправляет булеву проблему (ну …. мне все еще нужно Arduino.h или же char foo;), и это исправляет проблемы с областью применения.

Но это просто неправильно.

Речь идет не о создании библиотеки стандартных функций, которые я мог бы использовать для различных набросков, а о том, чтобы разбить мой код на более мелкие (читаемые) фрагменты и сохранить их все вместе в папке проекта. Я хочу сделать это как можно более правильно, просто кажется, что я ограничен IDE. Я уверен, что у меня есть подходящее понимание того, как поставить заголовок и связанный .cpp подать вместе (надеюсь, что я не правильно понял эту часть).

Я полностью самоучка со всем C / C ++ и совсем недавно начала заниматься программированием.

Я исследовал это в глубине Google и просто постоянно терплю неудачу.

Не прибегая к hacks и для простых людей, таких как я, как мне лучше собрать приведенные выше примеры, чтобы Arduino IDE / gcc скомпилировал их?

изменить: я думал, что я бы включил только некоторые из вкладок, которые я открыл здесь, чтобы показать, что я действительно провел некоторые исследования по этому вопросу!

http://arduino.cc/en/Reference/Include

http://arduino.cc/en/Hacking/LibraryTutorial

http://forum.arduino.cc/index.php/topic,124904.msg938861.html#msg938861

http://forum.arduino.cc/index.php?topic=84412.0 (это где я нашел char foo; решение)

http://liudr.wordpress.com/2011/02/16/using-tabs-in-arduino-ide/

Включая .cpp файлы

Хранение всех библиотек в каталоге эскизов Arduino

Заголовок C ++ и CPP включает

12

Решение

Причина, по которой это не работает, заключается в том, что вам нужно включить что-то в ваши файлы a.h или a.cpp.

Попробуйте это в вашем файле .h, и тогда все должно работать.

#ifndef H_A
#define H_A

#include <Arduino.h> //needed for Serial.println
#include <string.h> //needed for memcpy

...

Причина этого в том, что вы можете думать о компиляторе, который отдельно компилирует каждый файл cpp. На самом деле #include — это просто автоматическое копирование. Когда компилятор собирается скомпилировать a.cpp, он не знает, что Serial.println () существует, потому что он не был определен в a.h, который является единственным другим текстом, который появляется в a.cpp. Причина, по которой он работает, когда вы помещаете все это в заголовок, заключается в том, что в ваш основной cpp-файл вы включили Arduino.h перед включением ah, поэтому после того, как эти #include будут скопированы в него, как если бы вы просто написали код в первое место.

Вы можете просто написать весь свой код в заголовках, но это не рекомендуется по разным причинам, включая эффективность во время компиляции (но поскольку программа на arduino может быть только 32 КБ, я не думаю, что время компиляции будет слишком длинным!)

16

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector