Во-первых, проблема:
Основной файл эскиза:
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/
Причина, по которой это не работает, заключается в том, что вам нужно включить что-то в ваши файлы 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 КБ, я не думаю, что время компиляции будет слишком длинным!)
Других решений пока нет …