Hallo,
ich möchte einen Timerinterrupt für meinen AVR in C++ erstellen.
Habe mir
https://www.mikrocontroller.net/articles/AVR_Interrupt_Routinen_mit_C%2B%2B
durchgelesen und es versucht umzusetzen.
Allerdings bekomme ich beim Kompilieren einen Error
undefined reference to `timer::timerInterrupt::timerInterrupt(int,
timer*)'
Das heisst ja, dass der kompiler das nicht finden kann, das ist aber in
timer.h vorhanden.
Was habe ich bei meiner Umsetzung falsch gemacht?
Frank
Ausführlichprogrammierer schrieb:> Und was hat das mit Klassen-Programmierung und C++ zu tun?
Nichts. Ein funktionierendes C-Beispiel sollte aber auch für C++ helfen
...
Matthias T. schrieb:> Ausführlichprogrammierer schrieb:>>> Und was hat das mit Klassen-Programmierung und C++ zu tun?> Nichts. Ein funktionierendes C-Beispiel sollte aber auch für C++ helfen> ...
Das löst aber nicht sein Problem, dass er die ODR verletzt hat!
Ausführlichprogrammierer schrieb:> Wilhelm M. schrieb:>> aber was ist "Klassenprogrammierung"?>> Korinthenkacker scheinen es nicht zu verstehen, andere schon.
Es geht hier nicht um Erbsenzählerei, sondern darum, dass man sich in
einer (technischen) Disziplin am prägnantesten mit den richtigen Termini
unterhält. Das ist hier bei der Programmierung so, oder in der
E-Technik, oder ...
Dieses Forum soll doch Hilfe zur Selbsthilfe geben! Deswegen sollte der
TO auch die richtigen Bergriffe verwenden. Sonst wird er beim googlen ja
auch nichts finden. Er sollte sich also mal auf den Weg machen und nun
auch ODR nachschlagen.
Ausführlichprogrammierer schrieb:> Matthias T. schrieb:>> Hier meine Lösung für ATtiny 2313:>> Und was hat das mit Klassen-Programmierung und C++ zu tun?
In C bekomme ich die Timer auch zum laufen. Allerdings wollte ich das
ganze anders machen um mein C++ zu verbessern.
Wilhelm M. schrieb:> Ausserdem ist Dein Beispiel nicht vollständig.
Was fehlt denn noch? Die main.cpp sieht noch ziemlich kahl aus. diese
ist noch leer
Frank schrieb:> Jetzt bekomme ich für timer.h den Error> expected class-name before '{' token> -> class timerInterrupt : public interrupt {
Kann es sein, dass Du die Header-datei mit "interrupt" nicht includiert
hast?
Wilhelm M. schrieb:> Frank schrieb:>>> Jetzt bekomme ich für timer.h den Error>> expected class-name before '{' token>> -> class timerInterrupt : public interrupt {>>> Kann es sein, dass Du die Header-datei mit "interrupt" nicht includiert> hast?
... und am besten ein Minimalbeispiel (in einer Datei) und vollständige
Fehlermeldungen. Dann ist es mit weniger Aufwand nachzuvollziehen ...
Wilhelm M. schrieb:> ... und am besten ein Minimalbeispiel (in einer Datei) und vollständige> Fehlermeldungen.
Volle Zustimmung. Kann man alles zur Überprüfung der Funktionsfähigkeit
in eine einzige Datei packen.
UndmitkurzenprägnantenIdentifiernlässtessichnochvielleichterverstehen.
Frank schrieb:> int timer.cpp habe ich nocht> void timer::timerInterrupt::serviceRoutine()> {> if(ownerTimer != 0)> ++ownerTimer->i;> }> hinzugefügt.
Du meinst also dieses Chaos inklusive Salamitaktik soll man
vernünftig nachvollziehen können?
Du machst es dir leicht, aber nicht denen die dir vielleicht
helfen wollen.
Hier wird die Klasse timerInterrupt innerhalb von der Klassendeklaration
timer deklariert. Das alleine sieht schon komisch aus. Dazu wird in
timerInterrupt noch ein Pointer auf ein Objekt vom Typ timer deklariert.
Deswegen meckert dein Kompiler.
Die Deklaration von timerInterrupt gehört hier nicht hin.
gelegenheitsprogrammierer schrieb:>> Die Deklaration von timerInterrupt gehört hier nicht hin.
Nested classes kann man schon machen.
Ich warte erst mal auf das Minimalbeispiel, denn gegenüber der ersten
Version am Anfang hat der TO ja auch noch was geändert ...
Habe jetzt mal beide (timer und interrupt)in eine datei gemacht.
leider bekomme ich immer noch den Fehler
expected class-name before '{' token
Line 13
-> class timerInterrupt : public interrupt {
Der C++ Compiler ist im wesentlichen ein one-pass Compiler, d.h. er geht
von oben nach unten vor. An der Stelle, wo der Typ interrupt gebraucht
wird, ist er noch gar nicht deklariert. Er kennt also den Typ nicht.
Deswegen muss die Deklaration der BasisKlasse vor der abgeleiteten
Klasse stehen (oder inkludiert werden).
Frank schrieb:> Habe jetzt mal beide (timer und interrupt)in eine datei gemacht.> leider bekomme ich immer noch den Fehler> expected class-name before '{' token>> Line 13> -> class timerInterrupt : public interrupt {
In Deiner Datei timerinterrupt.h deklarierst Du zunächst die Klasse
"timer" und danach die Klasse "interrupt". In der Definition der Klasse
"timer" willst Du aber eine nested class "timerInterrupt" definieren,
die von der an dieser Stelle noch unbekannten Klasse "timer" erbt.
Verschieb' die Deklaration von "interrupt" einfach mal nach oben vor die
Deklaration von "timer", dann sollte es klappen -- vorausgesetzt, Du
hast keine weiteren Fehler eingebaut.
Wilhelm M. schrieb:> Deswegen muss die Deklaration der BasisKlasse vor der abgeleiteten> Klasse stehen (oder inkludiert werden).
Das stimmt. Das hätte mir eigentlich auch auffallen müssen.
Habe ich auch geändert, jedeoch kommt dann der nächste Fehler:
undefinied reference to 'interrupt::owner'
1
void interrupt::handler1() {
2
if(owner[0])
3
owner[0]->serviceRoutine();
4
}
5
[code]
6
7
das kommt daher, dass dieser noch niergends initialisiert ist.
8
Auf der Seite steht:
9
Das owner-Array wird - auch hier der Vollständigkeit des Codes halber - auf Null initialisiert.
bekomme so aber die Fehler:
-suggest parantheses around arithmetic in operand of '|'[-Wparentheses]
-qualified-id in declaration before '[' token
-expected initializer before '[' token
Kai schrieb:> Wilhelm M. schrieb:>> Deswegen muss die Deklaration der BasisKlasse vor der abgeleiteten>> Klasse stehen (oder inkludiert werden).>> Das stimmt. Das hätte mir eigentlich auch auffallen müssen.> Habe ich auch geändert, jedeoch kommt dann der nächste Fehler:>> undefinied reference to 'interrupt::owner'>> [code]> void interrupt::handler1() {> if(owner[0])> owner[0]->serviceRoutine();> }> [code]>> das kommt daher, dass dieser noch niergends initialisiert ist.
Es scheint mit, dass Deine C++-Kenntnisse nur rudimentär sind ...
owner ist ein static-member der Klasse. Das ist dann nur eine
Deklaration - die Definition muss in einer Implementierungsdatei
erfolgen -> ODR-Rule!
Wenn Dir die Grundlagen nicht klar sind, so tust Du Dir mit C++ auf dem
uC keinen Gefallen. Lerne C++ auf dem PC, und dann kannst Du umsteigen
damit auf den uC. Man programmiert auf dem uC in C++ zusätzlich auch
noch sehr viel anders als mit C++ auf dem PC ...