Archiv verlassen und diese Seite im Standarddesign anzeigen : cout nicht deklkariert
Hallo,
ich möchte die Programmierung von AVRs in c++, was ich nur im Zusammenhang mit win32-Systemen kenne, erlernen, komm damit aber irgenwie nicht klar. Wieso klappt z.B. folgendes nicht:
#include <avr\io.h>
int main(void)
{
cout << "Hallo Welt\n";
return 0;
}
der Compiler(AVR-GCC) meldet nämlich, dass das Objekt "cout" nicht deklariert ist. Kann mir bitte jemand weiterhelfen?
MfG Mark
PasstScho
26.10.2006, 17:02
Hallo,
Was stellst du dir den vor, was der Prozessor jetzt machen sollte?
MfG Alex
Auf nen AVR gibt es keine Standardausgabe, wo deine Meldung landet, wenn du ncihts anderes einstellst. Du musst dich schon selbst drum kümmern, wie du dein Hallo Welt zu Gesicht bekommst. Wohin hättest du den Text denn gern? auf die serielle Schnittstelle, auf nen LCD, auf einen Drucker, per Funk oder per Ethernet versendet? Der Compiler kann nicht gedankenlesen. Du muss schon ne passende lib für die Ausgabe organisieren und einbinden oder selbst schreiben.
Der Text sollte mit dem UART gesendet werden (wie <print "Hallo Welt> in BASCOM)
Wie schreibt man denn eine lib?
Hi,
schau mal hier: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Da steht auch wie du etwas per UART senden kannst.
lib steht für Library, sprich eine Datei die Funktionen enthält. Da kannst du dir dann eine Funktion schreiben die, dein UART initialisiert und eine der du einfach den auszugebenden Text als Parameter übergibst, und diese Funktion den Text dann per UART sendet.
Achja, wenn du bei C++ 'cout' bzw 'cin' verwenden willst musst du die lib <iostream> einbinden.
MfG
Hallo coCo,
die lib <iostream> hab ich nicht gefunden.
außerdem weiss ich wie man einzelne Zeichen mit dem UART sendet, aber ich möchte eine Funktion haben, die selbst das Umwandeln in einen ASCII-String übernimmt, ohne dass ich eingeben muss, was es für ein Datentyp ist, den ich senden möchte.
MfG Mark
deine vorstellungen von mikrocontrollern sind seltsam. natürlich findest du keine <iostream> denn es ist nunmal kein PC und besitzt keinen festgelegten iostream. scheinbar möchtest du laufen können, ohne gehen zu müssen. ich würde dir nahelegen, bei visual brainfuck.dot.net zu bleiben. oder einen blick ins datenblatt zu werfen.
wenn du weisst, wie man einzelne zeichen übermittelt, kannst du die doch fluxx mit einer schleife durchgehen und senden?
meine Vorstellungen von Microcontrollern sind nicht seltsam, das ich sehr wohl weiss was ein AVR hardwaremäßig (nicht) kann. schließlich hab ich bisher auch größere Programme in asm geschrieben, was mir aber mit der Zeit zu aufwändig wurde.
mein eigentliches problem ist, dass ich nicht weiss, wie man in c++ folgendes realisiert:
void irgendwas(a)
{
anweisung an den compiler: wann a ein float ist, dann f1(float a)
wenn a ein int ist, dann f2(int a)
u.s.w.
}
Die Funktionen void f1(float a) und void f2(int a) stehen irgendwo im Quelltext
Hubert.G
26.10.2006, 19:02
AVR-GCC kann mit C++ spezifischen Anweisungen nichts anfangen. Ein AVR ist ein 8-bit-System mit stark eingeschränkem Arbeitsspeicher, das müsstest du doch vom ASM-Programmieren her wissen. C++ Funktionen sind aber alles andere als Arbeitsspeicherschonend. Du wirst von deinem C das ++ weglassen müssen um Erfolg zu haben.
SprinterSB
27.10.2006, 11:28
[...] der Compiler(AVR-GCC) meldet nämlich, dass das Objekt "cout" nicht deklariert ist. Kann mir bitte jemand weiterhelfen?
avr-gcc bietet keine 100% C++-Unterstützung:
https://www.roboternetz.de/wissen/index.php/Avr-gcc#C.2B.2B
Als "Hallo Welt" ist eine Textausgabe schon recht kompliziert. Man fängt vielleicht besser ne Ebene einfacher an, wie in
https://www.roboternetz.de/wissen/index.php/Hallo_Welt_f%C3%BCr_AVR_%28LED_blinken%29
Also Hubert, wo C++ Funktionen (die man dort im Übrigen Methoden nennt, sofern sie zu einer Klasse gehören) mehr Speicher verbrauchen als C Funktionen musst Du mir mal erklären.
Im Übrigen habe ich auf dem AVR schon einiges erfolgreich in C++ implementiert, würde aber, wegen den von Sprinter in dessen Wiki Artikel genannten Nachteilen, zu denen ich als größten die mangelnde Debugging Unterstützung im AVR Studio zählen würde, derzeit noch abraten.
Um den Gebrauch von new und delete kommt man noch herum, die Standardbibliothek dabei zu haben wäre allerdings schick.
Die Codequalität von avr-g++ ist genauso gut wie beim avr-gcc.
SprinterSB
27.10.2006, 16:53
Das Plus an Speicherverbrauch und Laufzeit wirst du bemerken, wenn du VTables brauchst, also zB wenn du mit abstrakten Klassen arbeitest und auf deren Methoden zugreifst. Dann muss nämlich zur Laufzeit in der VTable nachgeschlagen werden, welche Methode zu nehmen ist. Weitere Gründe findest du im avr-gcc-Artikel.
Als "Hallo Welt" ist eine Textausgabe schon recht kompliziert.
was ist denn daran kompliziert? der Compiler muss doch nur den string "Hallo Welt" in den Flash reinkopieren und der controller soll diese Zeichen
einfach nacheinander mit dem UART senden.
wie soll man den sonst einen String mit dem UART senden?
Naja, wenn die C++ Standardbibliothek fehlt musst du wohl auf Funktionen aus der C-Standardbibliothek zurückgreifen, also z.B. printf
Sprinter, das ist mir schon klar. Aber es ging um den Speicherverbrauch/Laufzeit von C++-Funktionen/Methoden und da gibt es kein "mehr als C".
Die Verwendung von vtables bei virtuellen Methoden entspricht der von Funktionspointertabellen in C und ist von der Laufzeit zu dem C-Konstrukt identisch.
Die Verwendung solcher Indirektionen macht auch in C Sinn - für genau dieselben Fälle wie bei C++ - ist aber von der Implementierung her ungleich aufwändiger und daher nur selten anzutreffen.
Ohne virtual keine vtable und damit keine Indirektion und damit derselbe Speicherverbrauch/Laufzeit wie bei C.
SprinterSB
27.10.2006, 22:58
mein eigentliches problem ist, dass ich nicht weiss, wie man in c++ folgendes realisiert:
void irgendwas(a)
{
anweisung an den compiler: wann a ein float ist, dann f1(float a)
wenn a ein int ist, dann f2(int a)
u.s.w.
}
Die Funktionen void f1(float a) und void f2(int a) stehen irgendwo im Quelltext
Ich weiß ja nicht, was du damit anstellen willst...
In C++ Machst du eine Wrapper-Klasse, welche die gewünschte Funktion als virtuelle Mathode hat.
Davon werden eine Integer und eine Float-Class abgeleitet, die ihre Vorstellung von f() implementieren.
Es geht auch über eine union, aber dann programmierst du C mit C++.
Wenn es denn Standard-Funktionen sein sollen, ist fprintf dein Freund, evtl fputs. Bau dir einen FILE file, der die Ausgabe auf den UART (oder wohin auch immer) implementiert und rufe dein fprintf (file, format, args...) auf wie gewohnt. That's it. Alternativ verbiegst du stdout oder stderr.
@ogni42:
Zum C++-Debuggen sollte auch ein avr-gdb gehen, evtl. mit GUI wie insight oder ddd. Die Frage ist, ob man sich mit gdb auseinandersetzen will. Mit silulavr gehts jedenfalls. Zum richtigen debuggen brauchts dann noch einen JTAG-Server oder 1DWire-Server.
Sprinter, meinst Du mit siluavr vielleicht simulavr? Würde ich dann mal ausprobieren. gdb ist nicht das Problem, der hat mir schon manches mal das Programmiererleben gerettet.
p_morg, so wie Du Dir das vorstellst geht es weder in C noch C++. Der Typ von a in irgendwas steht immer zur Übersetzungszeit fest. Wenn Du einen dynamischen Typ haben willst geht das in C++ über Vererbung und der Auswertung der Runtime Type Information, z.B. per dynamic_cast
class A
{
//....
};
class B
{
//....
};
class C : public A
{
//....
};
class D : public A
{
//....
};
int main()
{
A* a = 0;
B b;
C c;
D d;
a = &c;
if (dynamic_cast<C*>a != 0 ) // das wird funktionieren, Ergebnis ist true
{
}
if (dynamic_cast<B*>a != 0 ) // das nicht, das Ergebnis ist false
{
}
a = &d;
if (dynamic_cast<C*>a != 0 ) // das funktioniert jetzt nicht, Ergebnis ist false
{
}
}
SprinterSB
29.10.2006, 00:09
Jo simulavr. War'n Vertipper. Aber erwarte nicht zuviel davon.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.