Willkommen im #Neuland
Login wie bei quake.ingame.de zuvor, die Passwörter aus der alten Datenbank wurden aber gelöscht - einmal hier neu anfordern.
Wer seine E-Mail-Adresse nicht mehr hat oder kennt, bitte eine Nachricht mit Infos schicken o. im Discord melden.

PQ Discord Server: #planetquake                                                                                                                                         Spenden? Hier entlang!

[C++] Schleifendurchlauf

Forum für alles rund ums Coden und web.design - HTML, XHTML, XML, CSS, PHP, ASP, Zugriffsrechten, Mods uvm.
Antworten
Fr33man

[C++] Schleifendurchlauf

Beitrag von Fr33man »

hi,
wieso funktioniert folgender code

Code: Alles auswählen

#include <iostream.h>
void main()
{
	int i=1;
	while(i<=10)
	{
		cout<<i<<endl;
		i=i+1;
	};
};
mit dem kompiler dev-c++ nicht, aber mit msvc++ gehts einwandfrei.
er öffnet mir nach dem kompilieren immer ein neues tab mit iostream.h und weist mich auf die zeile in der "#include "backward_warning.h"" steht hin.
sorry, bin noob ;)
Silver7

Beitrag von Silver7 »

also include <iostream> musst du machen, und es heisst normalerweise int main(int argc, char **argv) !!

mfG
Fr33man

Beitrag von Fr33man »

geht auch nicht
wenn ich <iostream> nehme, kommt ne fehlermeldung bei cout
n00dles

Beitrag von n00dles »

Original erstellt von Silver
also include <iostream> musst du machen, und es heisst normalerweise int main(int argc, char **argv) !!

mfG
Bitte keine Anfänger mit Halbwahrheiten belasten, die zum eigentlichen Problem nichts beitragen. Auch ich wurde durch solche Aussagen am Anfang nicht gerade gefördert.

Zum eigentlichen Problem:

Zu allererst folgendes:
Du brauchst kein Semikolon hinter einer geschweiften Klammer. Anweisungen in geschweiften Klammern stehen überall da, wo normalerweise syntaktisch nur eine einzige Anweisung stehen würde. Wenn man aber mehrere Anweisungen haben will, braucht man geschweifte Klammer, um alle Anweisungen sozusagen zu einer großen Anweisung zusammenzufügen. In deinem Code stehen nach der while-Schleife und nach main ein Semikolon. Doch eigentlich sind sie nicht nötig, denn sie sind leere Anweisungen, da mit der schließenden schweifenden Klammer die Anweisung zu Ende ist. Und im Falle des zweiten Semikolons, ist die Anweisung sogar nicht einmal mehr im Programm.
Stell dir das ungefähr so vor: Jede Anweisung ist ein Blatt Papier, dass du einem Mitarbeiter in die Hand drückst, auf dem deine Befehle stehen. Auf jedem Papier steht nur ein Befehl. Wenn jetzt aber ein Mitarbeiter mehrere Befehle ausführen soll (so wie z.B. dein while-Schleifen Mitarbeiter), dann nimmst du beliebig viele Papiere und heftest sie mit ner Büroklammer zusammen. An der geschlossenen Klammer verlässt der Mitarbeiter dein Büro um seiner Arbeit nach zu gehen und der nächste kommt rein um dein Befehl entgegen zu nehmen. Du drückst ihm dann ein leeres Blatt in die Hand. Er wird sich freuen, dass er nichts zu tun hat, aber eigentlich ist es sinnlos, nicht wahr?

Jetzt zu deinem eigentlichen Problem:
Ganz ehrlich, ich kann dir nicht helfen, warum genau Dev-Cpp dir einen Fehler ausgibt, ich kann nur vermuten, da deine Aussage etwas wage ist. Doch ich will es versuchen. In der Tat wäre es besser wenn du <iostream> verwendest und nicht <iostream.h>, weil letztere veraltet ist. Doch das ist nicht das Problem. Vermutlich meckert Dev-Cpp, weil du die Namespaces vergessen hast. MSV-C++ weiß wohl, dass das ein häufiger Fehler ist und korrigiert ihn automatisch. Versuche es einmal mit folgendem Code:

Code: Alles auswählen

#include <iostream>
using namespace std;

void main()
{
	int i=1;
	while(i<=10)
	{
		cout<<i<<endl;
		i=i+1;
	}
}
Kleiner Unterschied, hoffentlich erwünschte große Wirkung. Und zerbrech dir am Anfang nicht den Kopf was du da gemacht hast, werde erst mit den grundsätzlichen Dingen richtig vertraut, um dann auf sowas rumzukauen. Aber falls es dich trotzdem interessiert: Die cout, die Funktion, die du benutzt (genauso wie endl), gehört zur C++ Standardbibliothek. Und diese hat nunmal den std namespace vorne dran.
Bildlich wäre es so, wie wenn du deine Befehle in Karteischränken mit verschiedenen Namen aufbewahrst. Normalerweise haben die Anweisungen, die von dir programmiert werden, keine Namen. Aber cout wurde ja nicht von dir programmiert, sondern von irgendjemand. Und der hat die Anweisung im Karteischrank wenn mit dem namen std abgelegt. Und wenn du das dem Computer nicht sagst, kann es sein, dass ers nicht blickt.

Zum Abschluss noch zwei Dinge:
1. Gewöhn dir gleich von Anfang an an, Fehlerbeschreibung möglichst genau vorzunehmen. Wenn du einen Fehlertext bekommst, poste die genau Fehlermeldung zum Code. Rechtsklick auf die Fehlermeldung und Copy und dann hier Paste sollte bei allen IDEs gehen. Bei Dev-Cpp gehts, bei MS VS 6.0 und VS.net gehts auch und du benützt eh nur die. Um so genauer du den Fehler beschreibst, desto besser könnnen wir dir helfen.
2. Diese Information muss dich nicht umbedingt berühren, nur falls du es von Anfang an mit der Terminologie genau nehmen willst, spuckt dir nicht dein Dev-Cpp Compiler und auch nicht dein MS VS Compiler eine Fehlermeldung aus, weil das sind keine Compiler. Compiler sind normalerweise Konsolen basiert und von ihrer eigentlichen Arbeit kriegst du unter Windows wenn du dir nicht die Mühe machst und sehr genau hinschaust nichts mit. Dev-Cpp und auch MS VS sind IDE, das steht für Integrated Development Entviroment, zu deutsch Integrierte Entwicklungs Umgebung. Sie kombinieren einen Editor, normalerweise mit Syntaxhighlightning (= Hervorhebung der einzelnen Befehle), Projektorganisation in Dateien und Klassen, Compiler, Debugger und was weiß ich was. Aber gerade bei Dev-Cpp hat die IDE nichts mit dem Compiler zu tun. Wenn du auf den Compile-Button klickst, ruft Dev-cpp den gcc-Compiler mit verschiedenen Kommandoübergaben extra auf. Es öffnet sich nur keine Konsoloe, die das schön demonstrieren & dokumentieren würde, sondern so ne olle Fortschrittsbox. Nur der Vollständigkeit und Richtigkeit halber. Falls du das jetzt noch nicht verstanden haben solltest, vergiss es einfach und komm in zwei Monaten zu diesem Absatz zurück.

Ansonsten hoffe ich, dich mit meinen sehr ausführlichen Auschweifungen nicht gelangweilt zu haben, es anständig erklärt zu haben (auch anschaulich an meinen Beispielen) und das es nicht falsch ist. Wenn ja, wird mich edgewalker oder sonst irgendwer hoffentlich berichtigen.

Und dann wünsch ich dir noch viel Spaß und Glück/Erfolg beim weiteren lernen
n00dles
Fr33man

Beitrag von Fr33man »

wow, vien dank, dass du dir die ganze mühe für mich gemacht hast! :)
ok, hab schon verstanden, aber dass bei der ms IDE die fehler gar nicht einmal angemerkt werden finde ich jetzt wirklich nicht so toll, was dann schliesslich auch später zum schlechten programmierstil führen kann, wenn man sich auch mehrere solche eigentlichen fehler anlernt.
und ebenfalls danke für die aufklärung eines kompilers und einer IDE ;)
n00dles

Beitrag von n00dles »

Original erstellt von Fr33man
wow, vien dank, dass du dir die ganze mühe für mich gemacht hast! :)
[...]
Kein Problem. Ich war ja auch mal Anfänger und hab mich immer über ausführliche Aufklärung gefreut. Und ich will immer ein gutes Vorbild sein.
]O-malar1a[

Beitrag von ]O-malar1a[ »

vage vermutung, aber wahrscheinlich besitzt du nicht die neueste dev-cpp version (4.9.9.0), in dieser wird lediglich angemerkt ("warning" erscheint), dass der verwendete header veraltet ist (deprecated).

im c++ standard gibt es keine ".h" header -
also, entweder schreibst du "using namespace std;" (wie 'noodles' es aufgezeigt hat, aber nie in headerdateien!) oder "std::" (explizite namespace-angabe) vor das jeweilige objekt.
beispiel:

Code: Alles auswählen

#include <iostream>
int main(int argc, char** argv)
{
 std::cout << "\nhello";
}
Fr33man

Beitrag von Fr33man »

ich hab 4.9.8.0 und werde mal dann demnächst updaten. nur leider sind server down und hab kein bock das manuell zu machen.
ansonsten würde es mich noch interessieren was es mit int main(int argc, char** argv) auf sich hat.
palandir

Beitrag von palandir »

Original erstellt von Fr33man
ansonsten würde es mich noch interessieren was es mit int main(int argc, char** argv) auf sich hat.
Bei main() sind die Parameter von besonderer Art. Du rufst die Funktion ja nicht direkt auf, aber main() entspricht dem Start des Programms. Wie übergibt man also Parameter an main()? Per Commandline: "deinprogramm <param1> <param2> <paramN>".

argc enthält die Anzahl der übergebenen Parameter. Die Zahl ist immer mindestens 1, weil der erste immer der Name des Programms selbst ist.

argv ist ein Zeiger auf einen char-Zeiger (das "char **argv" ist identisch mit "char *argv[]", also einem Zeiger auf ein Array von char-Zeigern. Und ein char-Array entspricht einem String). Das heißt, im Array argv[] stehen die Adressen der Strings, die die Programm-Parameter beinhalten.

"int main" bedeutet, dass die main()-Funktion einen Integer zurückliefert. Das ist wichtig. Wenn dein Programm 0 zurückgibt, bedeutet das, dass es erfolgreich beendet wurde. Bei einem Wert != 0 nicht.
youthenergy

Beitrag von youthenergy »

Original erstellt von n00dles
Zu allererst folgendes:
Du brauchst kein Semikolon hinter einer geschweiften Klammer.
Das ist so nicht korrekt. Klassendeklaration erwarten immer ein Semikolon nach der abschließenden Klammer.
Original erstellt von n00dles

Code: Alles auswählen

#include <iostream>
using namespace std;

void main()
{
	int i=1;
	while(i<=10)
	{
		cout<<i<<endl;
		i=i+1;
	}
}
Kleiner Unterschied, hoffentlich erwünschte große Wirkung.[/b]
void main() ist kein Standard C++ und war auch nie Standard C. Wird nur schweigsam von einigen Compilern angenommen.
Original erstellt von n00dles
Die cout, die Funktion, die du benutzt (genauso wie endl), gehört zur C++ Standardbibliothek.
cout ist ein Objekt. Wenn du einigen Leuten Halbwahrheiten vorwirfst, dann behalte deine eigenen auch für dich.
n00dles

Beitrag von n00dles »

>void main() ist kein Standard C++ und war auch nie Standard C. Wird nur schweigsam von einigen Compilern angenommen.

Hab ich auch nie behauptet.

>Das ist so nicht korrekt. Klassendeklaration erwarten immer ein Semikolon nach der abschließenden Klammer.
[...]
>cout ist ein Objekt. Wenn du einigen Leuten Halbwahrheiten vorwirfst, dann behalte deine eigenen auch für dich.

Stimmt, hatte ich im Moment nicht bedachtet. Allerdings frage ich mich, ob es, selbst wenn, nötig gewesen wäre, einem Anfänger, der sich noch beim Lernen von Schleifen befindet, hier schon mit Wissen konfontrieren muss, dass ihn wohl ein paar Lektionen später noch genug beschäftigen muss. Hast du auch erst die Definitionen von natürlichen Zahlen gelernt und dann bis 10 zählen können, oder wars doch anders rum?

Ist ja okay, dass du mich bei cout eines besseren belehrt hast, aber ich hoffe stark, dass du Fr33man dadurch nicht allzu verwirrt hast, denn geholfen hast du ihm damit vermutlich nicht sehr.
qq~
Daemia
Daemia
Beiträge: 325
Registriert: Apr 2002

Beitrag von qq~ »

void main() ist kein standard. es muss heißen "int main()"..
nach belieben noch mit argumenten.
2. iostream.h ist ein veralteter header, es muss heißen <iostream>.. bei c-headern siehts dann so aus: statt <stdlib.h> <cstdlib>

3. der standardmäßige compiler, der bei dev-cpp dabei ist, ist MinGW.. dieser compiler beherrscht den standard, und da ich bezweifle, dass du den msvc compiler brauchst, wird MinGW reichen..
Bild
Antworten