Hallo wie oben geschrieben fange ich grad an zu Programmieren.
folgender code geht leider nicht richtig müsste nicht bei der Variable
erg das ergebnis von 25 rauskommen? Die Variable bleibt nämlich 0. Für
euch sicherlich einfach zu lösen.
In der Funktion rechne() gibtst du mit return erg immer 0 zurück, weil
du erg dort keinen neuen Wert zuweist.
In der Main verwendest du den von rechne() zurück gegebenen Wert auch
gar nicht.
Und was du mit erg; bezwecken willst verstehe ich nicht.
Du kannst entweder in rechne() direkt der Variablen erg etwas zuweisen,
also erg = zahl1 + zahl2;
Oder so wie du es vermutlich willst, in der Main den Rückgabewert von
rechne() nach erg schreiben, also erg = rechne();
Wenn du ergebnis ganz weglassen willst, kannst du in rechne() auch nur
return (zahl1 + zahl2); schreiben.
Danke für die Antwort
Das mit dem "erg = rechne();" hört sich ja ganz gut an aber wie muss
dann
die Funktion aussehen ich verstehe da mit dem Rückgabewert irgendwie
nicht.
Nach dem return steht immer die Variable, die deine Funktion an den
Aufrufer zurück gibt.
Dieser Rückgabewert muss von dem Typ sein, der auch in der Deklaration
am Anfang steht, das ist das int bei "int rechne()".
Mit "erg = rechne();" wird automatisch die Funktion rechne() aufgerufen,
diese gibt dann mit return... etwas zurück und das wird direkt in die
Variable erg geschrieben.
In deiner Funktion schreibst du neben das return einfach die Variable
oder den Rechenausdruck, den du in der aufrufenden Funktion (das ist
hier die Main) weiter verarbeiten willst.
Klappt wunderbar aber ganz so klappt es noch nicht.
Wenn ich das ganze debugge springt er nicht in die while Schleife hinein
und die Variable erg bleibt null. kommentier ich aller diengs die while
schleife mit den zugehörigen geschweiften klammern aus erscheint das
ergebnis in der Vriablen erg aber das programm bricht ja am Ende ab da
ja keine while Schleife mehr vorhanden ist. Ich verzweifle hie so
langsam.
hier noch einmal der fehlerbehaftete Code wo er nicht in die while
Schleife springt.
Dein Programm ist vollkommen richtig. Nicht sonderlich elegant, eher
grausam, aber wie schon gesagt: Es ist richtig und funktioniert.
Es hat nur einen Nachteil: Es ist vollkommen sinnlos.
Der Code weist in einer Schleife einer Variablen "erg" irgendeinen Wert
zu. Weiter nichts. Das wiederholt sich dann solange, bis man den Strom
abstellt.
Was würde sich also ändern, wenn der Controller in dieser Schleife
NICHTS machen würde? Es würde sich gar nichts ändern.
Und genau das weiß der Compiler auch.
Deshalb optimiert er den Code soweit, daß er optimal schnell und mit
wenig Speicher genau das macht was er soll: Nämlich NICHTS.
Stell' mal in Project >> Configuration Options die Optimization von Os
auf O0.
Dann optimiert der Compiler nichts weg und du kannst das so debuggen.
mfg.
floh schrieb:> Vielen Dank jetzt klappt es es lag wirklich an der Optimierung.
Wobei es hier anzumerken gilt, dass die Optimierung solche versteckten
(und üblicherweise eigentlich ungewollten) Programmkonstrukte nur
aufdeckt. Es ist nicht so, dass die Optimierung Programme fehlerhaft
macht. Wenn sich Programme mit Optimierung "fehlerhaft" verhalten, dann
ist idR. eine falsche Codierung die Ursache!
Ein Programm muß mit und ohne Optimierung laufen. Mit Optimierung kann
es kleiner und/oder schneller sein. Es darf aber niemals anders sein!
Lothar Miller schrieb:> Ein Programm muß mit und ohne Optimierung laufen. Mit Optimierung kann>> es kleiner und/oder schneller sein. Es darf aber niemals anders sein!
Das ist natürlich richtig.
Das ist alles kein Fehler sondern liegt am Code, der zwar fehlerfrei
compiliert aber vollkommen unsinnig ist.
So wird rechne() auch mit Optimierung ausgeführt:
>int zahl1 = 12,zahl2 = 13,ergebnis = 0;>>volatile int erg = 0 ;>>int rechne()> {> return(zahl1 + zahl2);> }>>int main()>{> while(1)> {> erg = rechne();> }> return 0;>}
Räumt man mal ein wenig auf:
>volatile int erg = 0;>int rechne(int zahl1, int zahl2)>{> return(zahl1 + zahl2);>}>int main()>{> while(1)> {> erg = rechne(12, 13);> }>}
wird einfach nur 25 in "erg" geschrieben.
Man muß schon ein wenig wissen, wie der Compiler tickt. Deshalb sind
solche Testprogrämmchen im Grunde für'n A...
mfg.