Ich bin gerade dabei mich in C++ ein zu arbeiten (unter Zuhilfenahme eines Buches) und habe als Einstieg einfach mal ein kleines Additionsprogramm geschrieben (ich weiß, nix dolles, aber ich hab ja auch erst am Freitag mit C++ bzw. überhaupt dem Programmieren angefangen ).
Bei dem Buch mitgeliefert war auch die Authorenversion von Visual C ++ 6 (den ich schon jetzt furchtbar finde), habe mir als Alternative auch das Dev-C++/Mingw Package von Bloodshed installiert (DJGPP habe ich trotz Angabe der Umgebungs-Variablen nicht zum laufen bekommen da angeblich eine bestimmte datei nicht gefunden werden kann...).
So, nun zum eigentlichen Problem: wenn ich mein Rechner-Proggi mit VC++6 kompilieren lasse klappts ausgezeichnet, bei Dev-C++ bekomme ich eine Fehlermeldung....
...und zwar in Zeile 5, also der ersten geschweiften Klammer nach:
die Fehlermeldung lautet in etwa so:
Zitat
'main' must int
...
Nun habe ich in einigen anderen Quelcodes gesehen dass dort die Mainfunction mit...
...deklariert wurde. In diesen Quellcodes wurden die Präprozessor-Amnweisungen übrigens auch mit...
anstatt
...eingebunden. Mein Buch (nach welchem ich auch hauptsächlich arbeite) benutzt bei allen Übungen die letztere Variante, der Autor gibt allerdings an dass man
benutzen soll wenn man einen älteren Compiler hat.
Unter VC++6 funktioniert es wie gesagt einwandfrei, aber ich will das Schrottding ehrlich gesagt nicht länger benutzen.
Um's kurz zu machen:
Ps.: Ich habe den Quellcode den ich oben angegeben habe nochmal aus dem Kopf geschrieben, da ich gerade nicht an meinem eigenen Rechner sitze. Deshalb kann es sein dasss nun ein paar Syntax-Error drin sind die im Original nicht waren. An denen liegt's also nicht...
--
Posten kann jeder, textvolumenoverkillen nur die Elite! Mein deviantART
1.) Microsofts obskures pseudo-C++, das ich nicht als echtes C++ ansehe, weil es sich nicht an den ANSI-Standard für C++ hält, hat main als void. Korrektes, standardkonformes C++ hat main als int. Benutze int main() (oder meinetwegen int main(void), was das gleiche ist).
2.) <*.h> hießen die STL-Header früher. Irgendwann wurde dann festgelegt, daß das .h überflüssig ist, seitdem heißen sie <*>. Laß' das .h weg, es sei denn der Compiler kann die includete Datei ohne .h nicht finden.
Mir ist keine Version von gcc/g++* bekannt, die noch das .h erwarten würde; wenn du mit .h includest bekommst du zur Kompilierzeit eine Warnung.
Ja, danke für die schnelle Antwort.
Wundert mich allerdings trotzdem das in dem Buch überhaupt void main(void) benutzt wird, wenn es nur mit VC++ zu kompilieren ist. Der Autor hat nämlich geschrieben das die Code-Beispiele nicht explizit für VC++ geschrieben wurden sondern allesamt ebenfalls mit dem Borland Compiler getestet wurden. Ausserdem wird da behauptet der VC++6 sei ANSI/ISO-Konform...Naja, ich mag das Teil sowieso nicht, alleine die unglaublich nervige Projektverwaltung und die Tatsache dass dein simpler Tippfehler wie "ednl;" statt "endl;" das Programm zum Komplettabsturz bringt sind mir gehörig auf den Wecker gegangen.
Also, nochmal danke, ich werde das heute abend gleich mal ausprobieren.
--
Posten kann jeder, textvolumenoverkillen nur die Elite! Mein deviantART
umgeschrieben hast, darfst du natuerlich nicht vergessen, dass du dann auch einen return code zurueckgeben musst.
ein einfaches
vor der letzten geschweiften Klammer sollte ein etwaiges Problem beheben.
...
Öhm ja, wieder so eine Sache die in meinem Buch (zumindest in den bisherigen Programmbeispielen) überhaupt keine Verwendung gefunden hat, die mir aber in diversen Online Tutorials aufgefallen ist. Hat das auch etwas mit VC++ zu tun (Die Tatsache dass es im Buch nicht gemacht wurde)? So langsam fang ich an die Sinnhaftigkeit meiner Lernlektüre in Frage zu stellen...
Zitat
BTW.. ich schiebs zwar mal auf die von dir beschriebenen Tippfehler, aber bei deiner letzten cout-zeile hast du ein beginnendes " vergessen ^^
...
Meinst du:
oder:
?
In beiden Fällen verstehe ich nicht ganz wo da ein " fehlt. zahl1, zahl2 und ergebnis sind ja Variablen, brauchen also afaik keine Anführungszeichen, und " + " und " = " haben beide je ein einleitendes " da sie ja hier als Konstante und nicht als Operatoren verwendet werden (hab ich doch richtig verstanden, oder? wenn nicht: klärt micht auf )
und bei "SOMEBODY HELP ME PLEASE!" sind doch auch beide Anführungszeichen vorhanden (allerdings hab ich das abschliesende semikolon vergessen )
Wie gesagt, ich hab dieses Wochenende erst mit dem ganzen Krempel angefangen, vorm Programmieren hab ich bisher immer zu viel Respekt gehabt. Daher bin ich über jedwede Richtigstellung eventueller Misskonzeptionen meinerseits mehr als dankbar.
--
Posten kann jeder, textvolumenoverkillen nur die Elite! Mein deviantART
Original geschrieben von -=kama=- Öhm ja, wieder so eine Sache die in meinem Buch (zumindest in den bisherigen Programmbeispielen) überhaupt keine Verwendung gefunden hat, die mir aber in diversen Online Tutorials aufgefallen ist. Hat das auch etwas mit VC++ zu tun (Die Tatsache dass es im Buch nicht gemacht wurde)? So langsam fang ich an die Sinnhaftigkeit meiner Lernlektüre in Frage zu stellen...
...
Also... Microsoft will, daß main() vom Typ void ist. Das heißt, es hat keinen Rückgabewert. ANSI will, daß main() vom Type int ist, also als Rückgabewert eine Ganzzahl hat. Mit einem main() als int mußt du natürlich auch eine Zahl zurückgeben; im Normalfall ist das 0.
BTW, folgende Zeile ist zwar anführungszeichentechnisch okay, aber aus einem anderen Grund nicht gut:
Also... Microsoft will, daß main() vom Typ void ist. Das heißt, es hat keinen Rückgabewert. ANSI will, daß main() vom Type int ist, also als Rückgabewert eine Ganzzahl hat. Mit einem main() als int mußt du natürlich auch eine Zahl zurückgeben; im Normalfall ist das 0.
...
Hm..ja, macht Sinn. Werde ich in Zukunft also nicht mehr machen.
Hab ich gar nicht dran gedacht, ist aber irgendwie logisch jetzt wo ich's sehe.
Danke.
--
Posten kann jeder, textvolumenoverkillen nur die Elite! Mein deviantART
Das mit dem Anfuehrungszeichen hab ich verbrochen ... ich hatte mich einfach verlesen ^^
kann ja mal vorkommen
...
Köpft ihn!
Naja, jedenfalls habe ich eure Ratschläge beherzigt und siehe da, es funzt!
Allerdings habe ich inzwischen ein anderes Problem:
funktioniert einwandfrei, aber
wird einfach ignoriert, sprich: das Programm wird nach einmaligem Durchlauf geschlossen. How comes?
Und wo ich grad schon mal dabei bin: ich habe mir mal dieses Rechenprogramm von Balbero angeschaut und - nachdem ich verstanden hab wie es funktioniert - in leicht modfizierter Form nachgebaut. Was mich daran aber stört ist dass das Programm nach Ausführung einfach zu Ende ist. Gibt es da nicht eine möglichkeit nach Ausführung der Funktion multiplikation(); wieder zu main(); zu "springen"? Ich hab einfach mal versucht die Rechenfunktionen (addition(); , multiplikation(); etc.) innerhalb von main zu deklarieren, aber das hat nicht _SO_GANZ_ () funktioniert. Irgendwelche Ideen wie man sowas am besten macht?
--
Posten kann jeder, textvolumenoverkillen nur die Elite! Mein deviantART
Das verstehe ich allerdings nicht:
Ich dachte man muss funktionen immer mit (); ansprechen, also
Warum nicht auch in diesem fall?
Und das hier ist mir auch nicht ganz klar:
Damit lege ich doch die Bedingung für die Wiederholung der Schleife fest, oder? Was bedeuten dann die beiden semikolons? Ich kenne das nur so:
--
Posten kann jeder, textvolumenoverkillen nur die Elite! Mein deviantART
Beim Funktionsaufruf fehlen tatsächlich die Klammern.
Das for(;;) ist eine Schleife ohne Bedingungen. Sprich: Sie wird ewig wiederholt, solange man sie nicht irgendwie verläßt (entweder durch ein break oder durch return, bzw. exit()). Man kann genausogut auch while (true) hinschreiben, das hat den selben Effekt.
Man kann nicht einfach for() schreiben, weil für for die Schrebweise mit den Semikolon-getrennten Befehlen vorgeschrieben ist. for(;;) läßt sich übersetzen zu: Mache zuerst nichts. Durchlaufe eine Schleife; bei jedem Durchlauf überprüfst du nicht, ob du sie beenden sollst und du tust auch nichts besonderes.
Das for(;;) ist eine Schleife ohne Bedingungen. Sprich: Sie wird ewig wiederholt, solange man sie nicht irgendwie verläßt (entweder durch ein break oder durch return, bzw. exit()). Man kann genausogut auch while (true) hinschreiben, das hat den selben Effekt.
...
Ok, ich glaube ich hab's verstanden. Nur noch eine letzte Sache (um auf Nummer sicher zu gehen):
ist es das "return(0);" oder das "break;" welches die for-Schleife beendet? Denn breaks habe ich in einem switch ja mehrere (in meinem fall sinds fünf). Und z.B. nach...
...soll die Schleife ja von vorne beim "Auswahlmenü" beginnen. Falls das break; dort aber Schleife beendet, dann würde das ja nicht funzen.
Ich hoffe ich geh dir nicht auf den Keks mit der ganzen Fragerei... ^_^
--
Posten kann jeder, textvolumenoverkillen nur die Elite! Mein deviantART
Original geschrieben von .drifting "break" beendet in diesem Fall den "switch"-Teil. Das "return" beendet die aktuelle Funktion (in diesem Fall das Programm).
...
An sich wäre das break überflüssig, da es keinen Sinn macht, einen switch zu verlassen, nachdem man das Programm beendet hat. Allerdings würde sich der Compiler dann beschweren.
Original geschrieben von Jesus_666 An sich wäre das break überflüssig, da es keinen Sinn macht, einen switch zu verlassen, nachdem man das Programm beendet hat. Allerdings würde sich der Compiler dann beschweren.
...
Hmm... eigentlich sollte das Programm dann in den nächsten "case"-Teil fallen, der unter dem aktuellen steht.
Yup. Ich kann mich aber daran erinnern, daß g++ sich darüber mal beschwert hat... Warning, nicht Error. Interessanterweise kann ich das nicht replizieren. Könnte vielleicht daran liegen, daß ich inzwischen eine andere Version von g++ benutze. Vielleicht war's auch gcc, der laut geworden ist.
Funzt dank euerer eurer Hilfe prächtig. Zwei kleine Problemchen gibt aber auch diesmal wieder:
- clrscr(); zum löschen des Fensters funktioniert nicht (ERROR: undefined function 'clrscr()'!!)
- ich hab versucht bei "case 4: ergebnis = zahl1 / zahl2" per Cast aus den Integern ein Double zu machen, hat aber nicht wirklich geklappt, weder mit "static_cast<double> (...)" noch mit "(double) (...)". Kann man Variablen überhaupt casten?
--
Posten kann jeder, textvolumenoverkillen nur die Elite! Mein deviantART