PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : cout nicht deklkariert



p_mork
26.10.2006, 16:50
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

uwegw
26.10.2006, 17:03
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.

p_mork
26.10.2006, 17:29
Der Text sollte mit dem UART gesendet werden (wie <print "Hallo Welt> in BASCOM)

Wie schreibt man denn eine lib?

coCo
26.10.2006, 17:40
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

p_mork
26.10.2006, 17:52
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

robocat
26.10.2006, 18:09
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?

p_mork
26.10.2006, 18:27
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

ogni42
27.10.2006, 14:26
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.

p_mork
27.10.2006, 18:03
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?

Felix G
27.10.2006, 18:10
Naja, wenn die C++ Standardbibliothek fehlt musst du wohl auf Funktionen aus der C-Standardbibliothek zurückgreifen, also z.B. printf

ogni42
27.10.2006, 18:15
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.

ogni42
27.10.2006, 23:30
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.