typedef struct
{
int Dir;
int Steps;
int Speed;
} CMD_record;
CMD_record* CMD_Seqence;
int NumSeq = 0;
void setup()
{
}
void loop()
{
SetNumSeq();
}
void SetNumSeq()
{
if (NumSeq == 0)
{
NumSeq = 10;
CMD_Sequence = (CMD_Record*) calloc (NumSeq, (sizeof (CMD_Record)));
}
}
gibt folgende Fehler:
sketch_jul06a.ino: In function 'void SetNumSeq()':
sketch_jul06a:27: error: 'CMD_Sequence' was not declared in this scope
sketch_jul06a:27: error: 'CMD_Record' was not declared in this scope
sketch_jul06a:27: error: expected primary-expression before ')' token
sketch_jul06a:27: error: expected `;' before 'calloc'
Man kann sich z.B. angewöhnen, Klassen mit Großbuchstaben anfangen zu lassen, dann ist das "fast" gleiche Wort, mit kleinem Anfangsbuchstaben, noch als Variablennamen verfügbar.
class Sample {};
Sample sample;
Aber dass es nervt, wenn man solche Fehler macht, ist schon richtig. Du bist nicht allein...
Mit der Zeit gewöhnt man sich an, die Fehlermeldungen genau anzusehen: "Was könnte den idiotischen Compiler gestört haben, dass er so meckert ? "
Bis hier wird noch nicht rumgemault, aber hier im Sketch:
#include <MegaStepper.h>
//MegaStepper MegaStep = MegaStepper();
.....
int result = 0;
void setup()
{
.....
result = MegaStep.getFreeRAM();
}
Hier kennt Arduino "MegaStep" plötzlich nicht mehr - in der Lib schon !
Nehme ich allerdings die Slashes vor der (re-)instatiierung weg, gibts Mecker ala "Kenn ich schon !"
Nehme ich die Vorinstantiierung in der Lib weg und klammer die Aurufe in den ISR-Routinen aus, geht das.
Der Witz dabei ist: Das hat schon mal funktioniert ! Irgendwie ....
Und:
Dieses "TimerOne" Beispiel mit ISRBlink ist genauso aufgebaut und funktioniert tadellos:
Aus der TimerOne.cpp:
#include "TimerOne.h"
TimerOne Timer1; // preinstatiate
ISR(TIMER1_OVF_vect) // interrupt service routine that wraps a user defined function supplied by attachInterrupt
{
Timer1.isrCallback();
}
....
Aus dem ISRBlink-Sketch:
#include <TimerOne.h>
void setup()
{
.....// Initialize the digital pin as an output.
Timer1.initialize(100000); // set a timer of length 100000 microseconds (or 0.1 sec - or 10Hz => the led will blink 5 times, 5 cycles of on-and-off, per second)
Timer1.attachInterrupt( timerIsr ); // attach the service routine here
}
Ich bekomm das momentan absolut nicht auf den Schirm, wieso. Help please ....
kennt der Compiler MegaStep nicht ( woher auch ? )
Ohne die Kommentar-Zeichen
MegaStepper MegaStep;
meckert der Linker, dass die Variable MegaStep doppelt definiert ist...
Dann musst du dem Compiler eben sagen, dass es irgendwann (beim Linken) irgendwo (in einer anderen Datei) eine Variable MegaStep vom Typ MegaStepper geben wird:
extern MegaStepper MegaStep;
Kann man auch in die include - Datei schreiben, damit jeder der
#include "MegaStepper.h"
einfügt, dieses globale Objekt kennt.
( Wenn du mehr lernen willst, " c++ static class members " ist etwas anderes, scheint aber auch interessant für dich zu sein )
Oder man kombiniert das ganze noch mit dem "attribute((weak))" Attribut. Falls es dann jemand später aus Dummheit überschreiben sollte, würde keine Fehlermeldung auftauchen. Weak Attribut
Ich habe bei meinen Libs festgestellt, das es immer mal wieder sinnvoll sein kann sowas zu verwenden.
Vorweg gesagt: mit extern ... im Sketch funktioniert das (wieder).
michael_x:
Mit auskommentiertem
// MegaStepper MegaStep ...
kennt der Compiler MegaStep nicht ( woher auch ? )
Ohne die Kommentar-Zeichen
MegaStepper MegaStep;
meckert der Linker, dass die Variable MegaStep doppelt definiert ist...
Dann musst du dem Compiler eben sagen, dass es irgendwann (beim Linken) irgendwo (in einer anderen Datei) eine Variable MegaStep vom Typ MegaStepper geben wird:
Ja, eben drum !
Ich hatte bisher niemals / bzw. über haupt eine (2.) Instantiierung von MegaStep im Sketch.
Stand wie bisher immer "oben" öffentlich in der .cpp.
Eben genauso so wie es in der Timer-Lib auch gemacht wird - und da geht es auch "ohne" die extern Deklaration.
Das ist ja eben, was stutzig macht.
Ähem, hüstel .... Ausrede: Kein (sterblicher) Delphianer kommt normalerweise auf so was ! 8)
Hatte ich das schon mal drin ? Alzheimer seit ein paar Tagen ? Seit Ewigkeiten die Brille nicht mehr geputzt ?
Wie dem auch sei: Ich hab mir nun ne fette Bemerkung in den Source geschrieben.
... deine Erleuchtung werde größer, michael_x !
Nachtrag: Diese extern-Dekl. muss wohl anscheinend genau an dieser Stelle stehen !?
TERWI:
Diese extern-Dekl. muss wohl anscheinend genau an dieser Stelle stehen !?
Dort am Ende ist sie nur, damit du sie nicht so leicht siehst
Muss irgendwo (Nachtrag: nach der Definition der class TimerOne) sein, und bevor die Variable verwendet wird. Ob in der include - Datei oder danach in deiner .ino, ist eigentlich egal.