manière correcte d'inclure les fichiers .cpp et .h dans une esquisse Arduino
Tout d'abord, le problème:
principal esquisse fichier:
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(){}
//un.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
}
Ci-dessus, comme il est, ne se compile pas et ce sont les erreurs que j'obtiens:
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
Le premier problème est de type booléen, semble souffrir de quelques amputation des noms que l'environnement Arduino, mais qui est généralement fixé par le char foo;
dans le fichier principal. Et dans certaines situations, il est. Mais pour utiliser ce type dans le .cpp
fichier génère cette erreur.
Je peux voir que les Erreurs 2 et 3 sont liées, mais comment puis-je obtenir ces dans le champ d'application? Je me rends compte qu'une partie du problème est probablement le #include
lui-même (peut-être) parce que Serial
et memcpy
ne sont pas encore définis/déclarés? J'ai essayé, y compris le Arduino.h
de la bibliothèque, mais cela n'a pas aidé. En fait, il ne aider à la boolean problème, mais seulement dans le cas de tout mettre dans le .h
fichier (comme je l'ai discuter de la suite ci-dessous), ce qui n'aide pas l'exemple ci-dessus.
Si j'ai mis les trois fichiers ensemble et ont tout dans les principaux esquisse (.ino
) fichier, il fonctionne comme il se doit. Mais l'idée ici, c'est que j'ai envie de sortir un peu de code et de faire mes croquis plus lisible.
Le plus proche je suis arrivé à une solution a été trouvée ici: http://liudr.wordpress.com/2011/02/16/using-tabs-in-arduino-ide/ où, après l'exécution de mes propres tests, j'ai décidé que si je mets le TOUT dans une .h
fichier, ça fonctionne!
Par exemple, en laissant le principal esquisse fichier inchangé, si je supprime a.cpp
et créer a.h
(comme suit), il fonctionne!
#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
Cela résout le booléen problème (enfin.... J'ai encore besoin de Arduino.h
ou char foo;
), et il résout les questions de portée.
Mais il se sent juste mal.
Ce n'est pas sur la création d'une bibliothèque de fonctions standard, j'ai pu utiliser sur les différents croquis, il est tout au sujet de la rupture de mon code en plus petits (lisible) de morceaux, et de les garder tous ensemble dans le dossier du projet. Je veux faire cela dans la plus correcte possible, il semble juste être je suis limitée par l'IDE. Je suis sûr que j'ai adapté à la compréhension de la façon de mettre un en-tête et associés .cpp
fichier (j'espère que j'ai pas eu ça part mal).
Je suis totalement autodidacte avec tout C/C++ et n'ont vraiment entré dans la programmation de micros très récemment.
J'ai fait des recherches à travers les profondeurs de google et je suis juste continuellement court.
Sans recourir à hacks
et garder les choses simples pour les gens comme moi, comment pourrais-je mieux de mettre ensemble les exemples ci-dessus, de sorte que l'IDE Arduino/gcc compiler?
edit: j'ai pensé que je voudrais simplement comprendre CERTAINS des onglets j'ai ouvert ici pour montrer que j'ai vraiment fait des recherches sur ce!
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 (c'est là que j'ai trouvé le char foo;
solution)
http://liudr.wordpress.com/2011/02/16/using-tabs-in-arduino-ide/
En gardant toutes les bibliothèques dans le sketch Arduino répertoire
En-Tête C++ et du RPC comprend
source d'informationauteur Madivad
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle cela ne fonctionne pas est que vous devez inclure quelque chose dans votre une.h ou a.cpp les fichiers.
Essayer dans votre une.h fichier et ensuite tout devrait fonctionner.
La raison pour cela est que vous pouvez penser, le compilateur séparément la compilation de chaque fichier cpp. Un #include n'est en réalité qu'un système automatisé de copier coller. Lorsque le compilateur arrive à compiler a.cpp il ne sait pas que la Série.println() existe, parce qu'il n'était pas définie dans une.h, qui est le seul autre texte qui s'affiche dans a.cpp. La raison pour laquelle il fonctionne lorsque vous mettez tout dans la tête, c'est que dans votre fichier principal rpc que vous avez inclus Arduino.h avant de l'un.h inclure, donc une fois que ces #comporte ont été copier collé dans son, comme si vous venez d'écrire du code dans la première place.
Il vous suffit d'écrire tout le code dans les en-têtes, mais il n'est pas conseillé, pour diverses raisons, y compris l'efficacité au moment de la compilation (mais comme un arduino programme ne peut être 32k, je ne pense pas que les temps de compilation, on va arriver trop long!)