Go Down

Topic: ... was not declared in this scope (Read 924 times) previous topic - next topic

TERWI

Das hier
Code: [Select]

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:
Quote

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'

Warum ?
To young to die - never to old for rock'n roll

olf2012

weil du dich vertippt hast?


CMD_Seqence != CMD_Sequence

TERWI

.... ach du dickes Ei ! 2x sogar: CMD_record != CMD_Record
Das finde ich sehr nervig, dieses Unterscheiden zwischen klein & groß ...
To young to die - never to old for rock'n roll

uwefed


Das finde ich sehr nervig, dieses Unterscheiden zwischen klein & groß ...

Ist aber leider so.
Grüße Uwe

michael_x

Hat auch sein Gutes ;)

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.

Code: [Select]
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 ? "


TERWI

#5
Jul 16, 2013, 01:46 pm Last Edit: Jul 16, 2013, 01:57 pm by TERWI Reason: 1
Schon wieder ... diesmal hab ich aber nach Tippfehlern geguckt !

Mein Projekt-Sketch erkennt (plötzlich) die in der Lib instantiierte Klasse nicht mehr.
Das sieht anfangs der MegaStepper.cpp so aus:
Code: [Select]

#include "MegaStepper.h"

MegaStepper MegaStep = MegaStepper();      // preinstatiate
.....
ISR(TIMER1_OVF_vect)    
{
 MegaStep.StepMotor(0);
}
.....


Bis hier wird noch nicht rumgemault, aber hier im Sketch:
Code: [Select]

#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:
Code: [Select]

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 ....
To young to die - never to old for rock'n roll

michael_x

Wenn ich dich richtig verstehe:

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:

Code: [Select]
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 )

Jomelo

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.

TERWI

Vorweg gesagt: mit extern ... im Sketch funktioniert das (wieder).

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.
To young to die - never to old for rock'n roll

michael_x

http://www.pjrc.com/teensy/td_libs_TimerOne.html

In der TimerOne.cpp ist

TimerOne Timer1; // Definition

und am Ende von TimerOne.h steht

extern TimerOne Timer1;

Und wo ist dein Problem ?

TERWI

#10
Jul 16, 2013, 06:11 pm Last Edit: Jul 16, 2013, 06:21 pm by TERWI Reason: 1
Ä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 !  :smiley-mr-green:

Nachtrag: Diese extern-Dekl. muss wohl anscheinend genau an dieser Stelle stehen !?
To young to die - never to old for rock'n roll

michael_x

#11
Jul 17, 2013, 09:12 am Last Edit: Jul 17, 2013, 09:15 am by michael_x Reason: 1

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.

Go Up