PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Programm zum Anfangen


Bond2k
2005-07-26, 12:37:20
Ich möchte mit C++ anfangen. Habe mir dazu ein Buch gekauft "C++ Lernen und professionell anwenden".

Jedoch komm ich schon beim ersten Beispiel nicht weiter.

Es soll eine einfach Bildschirmausgabe programmiert werden.

Als Quellcode wird folgender angegeben:
------------------------
#include <iostream>
using namespace std;

int main()
{
cout << "Viel Spass mit C++!" << endl;
return 0;
}
------------------------
Jedoch wenn ich diesen eingebe und auf ausführen klicke, kommt folgendes:

--------------------Konfiguration: Test - Win32 Debug--------------------
Kompilierung läuft...
Test1.cpp
Linker-Vorgang läuft...
LIBCD.lib(wincrt0.obj) : error LNK2001: Nichtaufgeloestes externes Symbol _WinMain@16
Debug/Test.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

Test.exe - 2 Fehler, 0 Warnung(en)

Weiss jemand, was ich falsch gemacht habe?

mfg

EDIT: Hat sich erledigt. Hatte Win32-Anwendung anstatt Win32-Konsolenanwendung geöffnet.

Katano
2005-07-26, 12:58:34
hi,
also wenn du nen C++ Kompiler hast, der sich die bibliotheken nich selber sucht, versuchs mal so.


#include <iostream.h>

int main()
{
cout << "Viel Spass mit C++!" << endl;
return 0;
}

geändert habe ich nur an das iostream ein .h angehängt.
sowie den namespace entfernt.

rattentod
2005-07-26, 13:26:56
geändert habe ich nur an das iostream ein .h angehängt.
sowie den namespace entfernt.

In der Form sollte das nicht gehen. Zum einen müsstest du dann auch std::cout usw. schreiben und zum anderen wird in "Systembibliotheken" bewusst auf ein *.h verzichtet - ist ja auch kein C.

Prinzipiell wäre interessant zu erfahren wie du das obige Programm kompilierst. Eventuell mit dem gcc statt g++?

** Edit: Okay, das sieht mir doch oben nach VS aus. Was hast du für ein Projekt angelegt? C++ mit einer IDE wie VS zu lernen halte ich im übrigen für keine gute Idee.

Bond2k
2005-07-26, 13:49:51
In der Form sollte das nicht gehen. Zum einen müsstest du dann auch std::cout usw. schreiben und zum anderen wird in "Systembibliotheken" bewusst auf ein *.h verzichtet - ist ja auch kein C.

Prinzipiell wäre interessant zu erfahren wie du das obige Programm kompilierst. Eventuell mit dem gcc statt g++?

** Edit: Okay, das sieht mir doch oben nach VS aus. Was hast du für ein Projekt angelegt? C++ mit einer IDE wie VS zu lernen halte ich im übrigen für keine gute Idee.

hmm... ich weiss zwar nicht genau von was du redest. Aber wie ich schon in meinem ersten Posting editiert habe, hat es sich erledit... danke trotzdem

Coda
2005-07-26, 13:50:22
geändert habe ich nur an das iostream ein .h angehängt.
sowie den namespace entfernt.Das ist eben falsch. Es gibt kein <iostream.h> im C++ Standard.

Prinzipiell wäre interessant zu erfahren wie du das obige Programm kompilierst. Eventuell mit dem gcc statt g++?Mit dem MS-Compiler natürlich ;)

C++ mit einer IDE wie VS zu lernen halte ich im übrigen für keine gute Idee.Weshalb?

Hucke
2005-07-26, 14:12:28
Weshalb?

Frag ich mich auch. Wenn man C++ unter Windows programmiren möchte, dann ist das Visual Zeugs doch ganz nett. Prima Hilfe (zumindest bei der 5er die ich hab).

Und wenns am Geld liegt, ich mag noch den Bloodshed DevC++. Nettes IDE, das den gcc benutzt.
http://www.bloodshed.net/devcpp.html

Katano
2005-07-26, 14:19:32
ja ok, das mit dem .h stimmt net.. hab das wieder mit C durcheinander gebracht.

Coda
2005-07-26, 14:24:54
In C gibt's auch kein iostream.h ;)

Katano
2005-07-26, 14:28:21
richtig. da gibts nen stdio.h :D
und tausend andere IO Header :rolleyes:

Senior Sanchez
2005-07-26, 15:41:52
iostream.h gabs doch aber bei "C++", allerdings entspricht das doch nicht dem Ansi-C++ Standard.

Ich bin DevC++ gerade am C++ lernen ;) Ich halte es auch so, dass ich mir da erstmal keine große IDE aufhalse, da die manchmal irgendwelches spezielles Zeug gleich einbauen (wie z.b. der borland c++ builder der irgendwelche eigenen bibliotheken mit einbaut und das verwirrt). Außerdem will ich ja erst die Sprache lernen und dann danach erst die IDE ;)

Matrix316
2005-07-26, 16:02:42
EDIT: Hat sich erledigt. Hatte Win32-Anwendung anstatt Win32-Konsolenanwendung geöffnet.

Das wäre mein erster Tipp gewesen, denn winmain sollte mit dem Programm oben eigentlich nicht viel zu tun haben. ;)

Coda
2005-07-26, 16:30:23
iostream.h gabs doch aber bei "C++", allerdings entspricht das doch nicht dem Ansi-C++ Standard.Es war nie irgendwo spezifiziert. Seit 98 gibt's jetzt den C++ Standard und da steht <iostream> drin. Eigentlich sollten langsam auch die letzten drauf gekommen sein und MS hat den Support für <iostream.h> bei .NET 2003 sogar gestrichen (zurecht!).

g++ gibt nur eine Warnung aus, aber auch das sollte eigentlich schon ausreichen um einen davon abzuhalten.

Es gibt immer noch Leute die nach 7 Jahren sowas in Büchern schreiben :ucrazy:

Senior Sanchez
2005-07-26, 16:50:04
Es war nie irgendwo spezifiziert. Seit 98 gibt's jetzt den C++ Standard und da steht <iostream> drin. Eigentlich sollten langsam auch die letzten drauf gekommen sein und MS hat den Support für <iostream.h> bei .NET 2003 sogar gestrichen (zurecht!).

g++ gibt nur eine Warnung aus, aber auch das sollte eigentlich schon ausreichen um einen davon abzuhalten.

Es gibt immer noch Leute die nach 7 Jahren sowas in Büchern schreiben :ucrazy:

Naja, in meinem buch stands auch drin, aber als verweis, dass das halt nicht mehr entsprechend "gültig" sei (es war nach deiner aussage, ja eigentlich nie wirklich gültig). Aber ich machs auch über <iostream> :)

Bei DevC++ habe ich btw gemerkt, dass wenn man Schnittstellen in Form von Header-Dateien formuliert, diese zwingend die Endung .hpp haben müssen, damit gcc (ich meine gcc ist bei mir eingestellt) die Implementierung und die Schnittstelle entsprechend einander zuordnen kann.

Ist das auch bei anderen Compilern so? Ich dachte bisher immer, das .h halt entsprechend weiter verwendet werden kann.

Coda
2005-07-26, 18:56:01
Bei DevC++ habe ich btw gemerkt, dass wenn man Schnittstellen in Form von Header-Dateien formuliert, diese zwingend die Endung .hpp haben müssen, damit gcc (ich meine gcc ist bei mir eingestellt) die Implementierung und die Schnittstelle entsprechend einander zuordnen kann.Kannst du genauer erklären was du damit meinst?

In C++ findet solch eine Zuordnung eigentlich nicht automatisch statt, es wird ja immer nur eine Übersetzungseinheit betrachtet, die vom Präprozessor entsprechend zusammengefügt wird.

Senior Sanchez
2005-07-27, 12:36:56
Naja, ich formuliere doch ne Header-Datei als Schnittstelle. Dort schreibe ich die Signatur der Klasse und derer Methoden rein.
Nun muss ich aber das ganze noch implementieren. Dazu erstelle ich ne normale CPP-Datei mit dem selben Namen (Ich weiß, dass es auch den selben Namen gehen sollte) wie die Header-Datei, aber mit ner anderen Endung. Wenn ich nun die Klasse nutzen möchte, importiere ich immer entsprechend die Header-Datei.

Bei mir war es aber so, dass damit das so funktioniert, die Header-Datei mit hpp enden muss. Andernfalls hat diese ganze Zuordnung Schnittstelle-Implementierung net funktioniert und es gab Compiler-Fehler.

rattentod
2005-07-27, 13:30:59
Weshalb?

1. Die Microsoft Datentypen wie DWORD, CString oder der BOOL der 3 Werte annehmen sind kein C++ Standard. Wenn man schon C++ macht, dann sollte man die "Originalsprache" lernen.
2. Aus 1. ergeben sich wilde Cast Operationen die nicht static_cast oder ähnlich heißen sondern z. B. LPCSTR
3. Der dynamisch erzeugte Code von VS ist grusel. Warum ich mehrere public Statements in einer Klasse habe oder auch leere private/public/protected dann kann man das nur Code Müll nennen. Warum Implementierung und Definition nicht immer fein säuberlich getrennt werden ist eigentlich auch eine spannende Sache.
4. Man benutzt keine Makros in C++, das ist einfach ein ungeschriebenes Gesetzt, wer die Message Map kennt, weis wovon ich rede.

Kurzum, auch wenn es persönliche Eindrücke wiedergibt so ist es einfach kein Standard C++ mit der STL. Prinzipiell ist das sehr Schade da die Entwicklungsumgebung vom Handling schon ganz nett ist. Man lernt ja auch nicht aufm Traktor, Bus fahren.

Legolas
2005-07-27, 14:42:41
Naja, ich formuliere doch ne Header-Datei als Schnittstelle. Dort schreibe ich die Signatur der Klasse und derer Methoden rein.
Nun muss ich aber das ganze noch implementieren. Dazu erstelle ich ne normale CPP-Datei mit dem selben Namen (Ich weiß, dass es auch den selben Namen gehen sollte) wie die Header-Datei, aber mit ner anderen Endung. Wenn ich nun die Klasse nutzen möchte, importiere ich immer entsprechend die Header-Datei.

Bei mir war es aber so, dass damit das so funktioniert, die Header-Datei mit hpp enden muss. Andernfalls hat diese ganze Zuordnung Schnittstelle-Implementierung net funktioniert und es gab Compiler-Fehler.

In die *.cpp Datei, in der die Implementierung einer Klasse steht, muss der Header auch inkludiert sein. Dadurch ist die Benennung der Dateien eigentlich völlig schnuppe.

zeckensack
2005-07-27, 15:51:17
1. Die Microsoft Datentypen wie DWORD, CString oder der BOOL der 3 Werte annehmen sind kein C++ Standard. Wenn man schon C++ macht, dann sollte man die "Originalsprache" lernen.
2. Aus 1. ergeben sich wilde Cast Operationen die nicht static_cast oder ähnlich heißen sondern z. B. LPCSTR
3. Der dynamisch erzeugte Code von VS ist grusel. Warum ich mehrere public Statements in einer Klasse habe oder auch leere private/public/protected dann kann man das nur Code Müll nennen. Warum Implementierung und Definition nicht immer fein säuberlich getrennt werden ist eigentlich auch eine spannende Sache.
4. Man benutzt keine Makros in C++, das ist einfach ein ungeschriebenes Gesetzt, wer die Message Map kennt, weis wovon ich rede.

Kurzum, auch wenn es persönliche Eindrücke wiedergibt so ist es einfach kein Standard C++ mit der STL. Prinzipiell ist das sehr Schade da die Entwicklungsumgebung vom Handling schon ganz nett ist. Man lernt ja auch nicht aufm Traktor, Bus fahren.Du verwechselst MSVC mit Win32-Programmierung. Ich stimme zu dass die Win32-API-Header das Code gewordene Grauen sind. Dafür kann aber der Compiler IMO nichts, der muss diesen Schrott ja nur übersetzen.
In die *.cpp Datei, in der die Implementierung einer Klasse steht, muss der Header auch inkludiert sein. Dadurch ist die Benennung der Dateien eigentlich völlig schnuppe.Ack.
Evtl ist hier irgendein "modernes" Feature im Spiel. ZB vorkompilierte Header. Oder GUI-/RAD-Funktionen von DevCPP ala "Class view", "new method" oder sowas.

Ich meine mich dunkel erinnern zu können, dass beide Features für DevCPP mal in der Planung waren. IMO sind vorkompilierte Header auch damals noch kein MingW/GCC-Thema gewesen. Ich benutze diese IDE aber schon eine Weile nicht mehr, und brauche auch diese (Compiler-)Features nicht, von daher weiß ich's nicht genauer.

Senior Sanchez
2005-07-27, 17:17:18
In die *.cpp Datei, in der die Implementierung einer Klasse steht, muss der Header auch inkludiert sein. Dadurch ist die Benennung der Dateien eigentlich völlig schnuppe.

So schlau bin ich auch ;)
Das habe ich schon bedacht, keine Sorge. Trotzdem hat DevC++ rumgezickt. Keine Ahnung weshalb.
Ich konnte es mir auch net erklären, aber mittlerweile scheint es zu gehen.

Majestic
2005-07-30, 17:11:53
Ich bin auch gerade am lernen von c++. Unterscheiden sich VS C++ 6.0 und DEV-C++ auch schon in den Standartausgabeobjekten der IOSTREAM? ich habe folgendes kleine Proggi mit DEV-C++ geschrieben


#include <iostream>
using namespace std;

int main()
{
int a;
for (a=0;a<100000;a++)
{
cout << "Hallo Welt";
}
return 0;
}


Und funktioniert so wie es soll...

Wenn ich diesen Code mit VS C++ compilieren und linken will bekomme ich immer nur ne Fehlermeldung...

/me
2005-07-30, 17:26:15
Wenn ich diesen Code mit VS C++ compilieren und linken will bekomme ich immer nur ne Fehlermeldung...

Es wäre nicht schlecht, wenn du die Meldung hier posten könntest. Evtl. das gleiche Problem wie der Threadstarter?

rattentod
2005-07-30, 17:40:48
Unterscheiden sich VS C++ 6.0 und DEV-C++ auch schon in den Standartausgabeobjekten der IOSTREAM?

Nein. Bibliothek ist Bibliothek. Imo setzen die meisten unter Windows bei "Konsolenanwendungen" noch ein pause in den Code damit beim ausführen das Fenster sich nicht schliesst.

Ich schließe mich mal meinem Vorredner an, eine Fehlermeldung bzw. der genaue Linkerfehler, wäre schick.

Majestic
2005-07-30, 18:17:18
Nein. Bibliothek ist Bibliothek. Imo setzen die meisten unter Windows bei "Konsolenanwendungen" noch ein pause in den Code damit beim ausführen das Fenster sich nicht schliesst.

Ich schließe mich mal meinem Vorredner an, eine Fehlermeldung bzw. der genaue Linkerfehler, wäre schick.
Ich hab inzwischen die gesamte IDE runter geschmissen und noch einmal neu installiert, und siehe da es geht auf einmal.... Die Urspüngliche Fehlermeldung des Compilers war irgendwas mit "Fatal Error 10xxx" ....

rattentod
2005-07-30, 18:37:22
Ich hab inzwischen die gesamte IDE runter geschmissen und noch einmal neu installiert, und siehe da es geht auf einmal

Urgs. Nun gut, so wilde Sachen kenne ich aber.