Hallo leute.
Ich hab da eine library geschrieben und die läuft super wenn ich den constructor in der .ino Datei aufrufe. Ausgelagert in eine .h und .cpp datei meckert aber der Compiler
115:2: error: 'AHT' was not declared in this scope
AHT.begin()
Solche "quasi-Singletons" haben bei Arduino auch gerne Großbuchstaben am Variablennamen-Anfang (z.B. Serial)
Aber "dass hier sowas gewünscht wird", denke ich auch.
Das extern AHT20 AHT;
in der include Datei zu vergessen könnte das Problem sein, sagt meine Glaskugel.
Gestern hatte ich schon einen ganzen Roman zusammen......Mein Code zieht sich über viele Dateien und dazu noch mehrere eigene Librarys.
Hab dann doch versucht den Post kurz zu halten
ich versuchs in einem Satz:
Ich hab eine Funkplatine die ich unterschiedlich mit bestücken kann und je nach "Variante"braucht es andere Librarys und arrays die ich grad versuche über Präprozessordirekiven zu definieren, was im main code klappt, aber super unübersichtlich ist und ich somit gerne in eine andere Datei auslagern würde um mich nicht mit 6 Kopien des eigentlich gleichen Codes rumschlagen zu müssen .
z.B.
Extern an sich ist nicht böse, es ist nur die öffentliche Fixierung eines vorhergehenden "******".
Hier kommen Vorlieben ins Spiel!
Eins meiner Ziele ist, die Dinge tief in Geltungsbereiche zu versenken.
Hat man viele Dinge im aktuellen Geltungsbereich, kann es Namenskollisionen geben, z.B. Libraries welche den gleichen Bezeichner für unterschiedliche Dinge nutzen, oder eben z.B. Wire nutzen, man selber aber Wire1 damit beauftragen möchte.
Globale Variablen sind auf diese Art eher "sperrig".
Mit dem AHT20 Sensor hats gleich geklappt.
Mit den ds18b20 Sensoren krieg ich den "multiple definition of tempSensorBulb" linker Fehler wenn ich den Pin direkt im Aufruf der Funktion einsetze. Also habe ich versucht Deklaration i .h und Definition in .cpp auszulagern aber irgendwie verstehe ich nicht wie ich da eine Logik rein kriege.
Wenn es an der Stelle überflüssig ist, dann ist es falsch, schon alleine weil es keiner so tut.
Es widerspricht dem Prinzip der geringsten Verwunderung.
Jetzt hab ichs gesehen
Die geschwungenen Klammern sinds! Danke Danke
und es läuft
Ich dachte mir das so:
die Sendefunktion nimmt ein Array entgegen. Dieses Array ist jedoch je nach Variante unterschiedlich lang also baue ich mir bei den Präprozessordirektiven auch direkt den jeweiligen struct zusammen und gib ihn an die Sendefunktion weiter
Das war auch nicht mein Argument.
Es macht einfach keiner so.
Von daher trägt das eher zur Verwirrung bei.
Übrigens:
struct Test
{
int gibWas(){ return 42; }
};
class Test test;
// struct Test test;
// Test test;
void setup()
{
Serial.begin(9600);
Serial.println(test.gibWas());
Serial.println((class Test){}.gibWas());
}
void loop() {}