C++ fertig kompilirtes programm funktioniert nicht
-
Hallo alle zusammen
Ich habe mir ein Programm geschrieben das mir eine complizirte rechnung ausrechnen soll. Ich habe das programm Kompiliert und alles hat funktioniert. Wenn ich jedoch etwas eingebe dann kommt die fehlermeldung :Programm hat aufgehört zu funkionieren.#include <cstdlib> #include <iostream> #include <fstream> using namespace std; int main(int argc, char *argv[]) {int R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R123,R23,R1234,R12345,R78,R678,R12345678,Rg,Uq,Ig,I10,I9,I12345678,I12345,I678,U10,I6,U6,U78,I7,I8,U12345,U1234,U5,I1234,U123,U4,I5,U1,I1,U2,U3,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,M,SLN,I2,I3,I4,U7,U8,U9,Pg,Pg1; cout<<"Bitte geben sie die Schülerlistennumer ein."<<endl; cin>>SLN;//SLN eingeben //Widerstandsvariablen definieren R1=100; R2=200; R4=400; R5=500; R7=700; R8=800; R10=1000; //Widerstände berechnen R3=SLN*25; R6=1000-(SLN*15); R9=SLN*20; R23=R2+R3; R123=(R23*R1)/(R23+R1); R1234=R123+R4; R12345=(R1234*R5)/(R1234+R5); R78=(R7*R8)/(R7+R8); R678=R6+R78; R12345678=R12345+R678; Rg=1/((1/R12345678)+(1/R9)+(1/R10)); //Ströme berechnen Ig=Uq/Rg; I10=Uq/R10; I9=Uq/R9; I12345678=Uq/R12345678; I12345=I12345678; I678=I12345678; I6=I678; I7=U78/R7; I8=U78/R8; I1234=U1234/R1234; I5=U5/R5; I1=U1/R1; I2=I12345678; //Spannungen berechnen U10=I10*R10; U6=I6*R6; U78=I678*R78; U12345=I12345*R12345; U5=U12345; U1234=U12345; U123=I1234*R123; U4=I1234*R4; U1=U123; U2=R2*I12345678; U3=R3*I12345678; Uq=12+(SLN*0,1); //Leistungen berechnen P1=I1*U1; P2=I2*U2; P3=I3*U3; P4=I4*U4; P5=I5*U5; P6=I6*U6; P7=I7*U7; P8=I8*U8; P9=I9*U9; P10=I10*U10; Pg=Uq*Ig; Pg1=P1+P2+P3+P4+P5+P6+P7+P8+P9+P10; //Variablen ausgeben(Spannung) cout<<"Die spannung U1 betraegt"<<U1<<"Volt."<<endl; cout<<"Die spannung U2 beträgt"<<U2<<"Volt."<<endl; cout<<"Die spannung U3 betraegt"<<U3<<"Volt."<<endl; cout<<"Die spannung U4 betraegt"<<U4<<"Volt."<<endl; cout<<"Die spannung U5 betraegt"<<U5<<"Volt."<<endl; cout<<"Die spannung U6 betraegt"<<U6<<"Volt."<<endl; cout<<"Die spannung U7 betraegt"<<U7<<"Volt."<<endl; cout<<"Die spannung U8 betraegt"<<U8<<"Volt."<<endl; cout<<"Die spannung U9 betraegt"<<U9<<"Volt."<<endl; cout<<"Die spannung U10 betraegt"<<U10<<"Volt."<<endl; //Variablen ausgeben (Strom) cout<<"Der Strom I1 betraegt"<<I1<<"Ampere."<<endl; cout<<"Der Strom I2 betraegt"<<I2<<"Ampere."<<endl; cout<<"Der Strom I3 betraegt"<<I3<<"Ampere."<<endl; cout<<"Der Strom I4 betraegt"<<I5<<"Ampere."<<endl; cout<<"Der Strom I5 betraegt"<<I5<<"Ampere."<<endl; cout<<"Der Strom I6 betraegt"<<I6<<"Ampere."<<endl; cout<<"Der Strom I7 betraegt"<<I7<<"Ampere."<<endl; cout<<"Der Strom I8 betraegt"<<I8<<"Ampere."<<endl; cout<<"Der Strom I9 betraegt"<<I9<<"Ampere."<<endl; cout<<"Der Strom I10 betraegt"<<I10<<"Ampere."<<endl; cout<<"Der Strom Iges betraegt"<<Ig<<"Ampere."<<endl; //Variable ausgeben(Leistung) cout<<"Die Leistung P1 betraegt "<<P1<<"Watt."<<endl; cout<<"Die Leistung P2 betraegt "<<P2<<"Watt."<<endl; cout<<"Die Leistung P3 betraegt "<<P3<<"Watt."<<endl; cout<<"Die Leistung P4 betraegt "<<P4<<"Watt."<<endl; cout<<"Die Leistung P5 betraegt "<<P5<<"Watt."<<endl; cout<<"Die Leistung P6 betraegt "<<P6<<"Watt."<<endl; cout<<"Die Leistung P7 betraegt "<<P7<<"Watt."<<endl; cout<<"Die Leistung P8 betraegt "<<P8<<"Watt."<<endl; cout<<"Die Leistung P9 betraegt "<<P9<<"Watt."<<endl; cout<<"Die Leistung P10 betraegt "<<P10<<"Watt."<<endl; cout<<"Die Leistung Pges betraegt "<<Pg<<"Watt."<<endl; cout<<"Die Leistung Pg1 betraegt "<<Pg1<<"Watt."<<endl; //Maschenregel ausgeben M=U5-U10+U8+U6; cout<<"Bei der Machenregel kommt"<<M<<"heraus."<<endl; system("PAUSE"); return EXIT_SUCCESS; }Ich weis jetz nicht was ich falsch gemacht habe oder warum es nicht funktioniert. Ich würde mich freuen wenn sich jemand damit auskennt.
-
bestimmt eine divison durch 0.
du rechnest nur mit integern und ganzzahldivisionen werden abgerundet. stelle auf float oder double um.
-
Jap, Division durch 0. Abgesehen davon rechnest du ohne Ende mit uninitialisierten Variablen. Welchen Wert hat Uq in Zeile 37? Da kann ja nichts Sinnvolles bei raus kommen.
-
Thomas123 schrieb:
Ich weis jetz nicht was ich falsch gemacht habe oder warum es nicht funktioniert. Ich würde mich freuen wenn sich jemand damit auskennt.
Dein Compiler z.B.!

In diesem solltest Du möglichst alle Warnungen aktivieren.
-
cooky451 schrieb:
Jap, Division durch 0. Abgesehen davon rechnest du ohne Ende mit uninitialisierten Variablen. Welchen Wert hat Uq in Zeile 37? Da kann ja nichts Sinnvolles bei raus kommen.
Uq ist in zeile 63 definniert,und wo habe ich eine division durch null?
-
Zum Programmieren gehört zur Entwicklung (und Erweiterung) immer auch eine Fehlerstrategie.
Hierfür gibt es z.B. die Möglichkeiten:1. Debuggen
2. Kontrollausgaben
3. try-catch-BlöckeLasse die Entwicklungsumgebung oder dein Programm nach Fehlern suchen und nicht uns.
-
Wirf die ganzen Variablendeklarationen raus und initialisiere sie sofort. Dann meckert der Compiler schon, wenn du irgendwo Variablen benutzt, die noch nicht definiert sind.
Worauf cookie451 hinweist ist (gekürzt):int main() { int A, B, C; A = 4; B = C / A; C = 1; }Zum Zeitpunkt wo B ein Wert zugewiesen wird hat C noch einen zufälligen Wert und deswegen steht danach Käse in B. Wenn du das allerdings so umbaust
int main() { int A = 4; int B = C / A; int C = 1; }meckert dein Compiler, weil er
Czum Zeitpunkt der Division nicht kennt. Und du solltestdoubleals Datentyp benutzen, damit du dich um die Probleme der Integerdivision nicht kümmern musst ( 1.0/4.0 = 0.25, statt 1/4 = 0).int main() { double A = 4; double C = 1; double B = C / A; }
-
berniebutt schrieb:
Zum Programmieren gehört zur Entwicklung (und Erweiterung) immer auch eine Fehlerstrategie.
Hierfür gibt es z.B. die Möglichkeiten:1. Debuggen
2. Kontrollausgaben
3. try-catch-BlöckeLasse die Entwicklungsumgebung oder dein Programm nach Fehlern suchen und nicht uns.
Ok ja das habe ich ja gemacht aber die fehlermeldung kommt von windows weil das programm abstürzt http://abload.de/img/hweteu89.png
-
berniebutt schrieb:
1. Debuggen
2. Kontrollausgaben
3. try-catch-BlöckeDie beste Möglichkeit hast du gar nicht genannt, dabei ist es die, die C++ so stark macht: So programmieren, dass Logikfehler zu Compilerfehlern (oder Warnungen) werden. Das fällt dem C++-Profi wahrscheinlich gar nicht mehr auf, dass er das so macht. Aber durch das strenge Typsystem lassen sich sehr viele Fehler schon im Vorfeld ausschließen, da dann der Compiler meckert. Man denke nur an die vielen möglichen Fehler in C alleine schon bei printf/scanf, die in C++ gar nicht mehr möglich sind. Und das ist nur ein winzig kleiner Teilbereich. Man muss dafür ja auch gar nicht viel tun, deshalb fällt es kaum auf. Man muss bloß die Sprache so benutzen, wie sie gedacht ist, und nicht versuchen, C oder Java in C++ zu programmieren.
Hier liegt letztendlich auch ein Fehler vor, den der Compiler entdecken konnte, die Warnungen wurden bloß nicht beachtet.
-
Idee: fuer so eine Aufgabe ein vernuenftiges Programm benutzen (z.B. octave, Matlab etc.). Dann musst du nicht mal kompilieren.
-
Hyde++ schrieb:
Dann musst du nicht mal kompilieren.
Und du hast die Fehler wieder zur Laufzeit. Toller Trade-Off.
(Generell stimme ich zwar zu, dass für derartige Prototypen Matlab geeigneter sein kann, aber dieses Argument ist fragwürdig)
-
Hyde++ schrieb:
Idee: fuer so eine Aufgabe ein vernuenftiges Programm benutzen (z.B. octave, Matlab etc.). Dann musst du nicht mal kompilieren.
Ich habe die rechnung berteits in excel brechnet aber ich habe eine hausaufgabe es auch in c++ zu berechnen.....
-
Hast Du jetzt die Warnungen in Deinem Compiler aktiviert?
Und in der Folge die Warnungen beachtet?
-
Furble Wurble schrieb:
Hast Du jetzt die Warnungen in Deinem Compiler aktiviert?
Und in der Folge die Warnungen beachtet?Ich habe sie aktiviert aber es werden keine angezeigt
-
Thomas123 schrieb:
Furble Wurble schrieb:
Hast Du jetzt die Warnungen in Deinem Compiler aktiviert?
Und in der Folge die Warnungen beachtet?Ich habe sie aktiviert aber es werden keine angezeigt
Das ist schlecht.

Evtl. kannst Du das Level noch anpassen, so dass der Compiler noch pingeliger ist. Schau nochmal in die Doku.Ich erhalte z.B. für Deinen Code:
make -k g++ -std=c++11 -Wall -pedantic -g -D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC test.cc -o test test.cc: In function ‘int main(int, char**)’: test.cc:63:14: warning: left operand of comma operator has no effect [-Wunused-value] test.cc:37:9: warning: ‘Uq’ may be used uninitialized in this function [-Wuninitialized] test.cc:44:10: warning: ‘U78’ may be used uninitialized in this function [-Wuninitialized] test.cc:46:18: warning: ‘U1234’ may be used uninitialized in this function [-Wuninitialized] test.cc:47:9: warning: ‘U5’ may be used uninitialized in this function [-Wuninitialized] test.cc:48:9: warning: ‘U1’ may be used uninitialized in this function [-Wuninitialized] test.cc:68:9: warning: ‘I3’ may be used uninitialized in this function [-Wuninitialized] test.cc:69:9: warning: ‘I4’ may be used uninitialized in this function [-Wuninitialized] test.cc:72:9: warning: ‘U7’ may be used uninitialized in this function [-Wuninitialized] test.cc:73:9: warning: ‘U8’ may be used uninitialized in this function [-Wuninitialized] test.cc:74:9: warning: ‘U9’ may be used uninitialized in this function [-Wuninitialized] Compilation finished at Wed Apr 9 18:51:15
-
Furble Wurble schrieb:
Thomas123 schrieb:
Furble Wurble schrieb:
Hast Du jetzt die Warnungen in Deinem Compiler aktiviert?
Und in der Folge die Warnungen beachtet?Ich habe sie aktiviert aber es werden keine angezeigt
Das ist schlecht.

Evtl. kannst Du das Level noch anpassen, so dass der Compiler noch pingeliger ist. Schau nochmal in die Doku.Ich erhalte z.B. für Deinen Code:
make -k g++ -std=c++11 -Wall -pedantic -g -D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC test.cc -o test test.cc: In function ‘int main(int, char**)’: test.cc:63:14: warning: left operand of comma operator has no effect [-Wunused-value] test.cc:37:9: warning: ‘Uq’ may be used uninitialized in this function [-Wuninitialized] test.cc:44:10: warning: ‘U78’ may be used uninitialized in this function [-Wuninitialized] test.cc:46:18: warning: ‘U1234’ may be used uninitialized in this function [-Wuninitialized] test.cc:47:9: warning: ‘U5’ may be used uninitialized in this function [-Wuninitialized] test.cc:48:9: warning: ‘U1’ may be used uninitialized in this function [-Wuninitialized] test.cc:68:9: warning: ‘I3’ may be used uninitialized in this function [-Wuninitialized] test.cc:69:9: warning: ‘I4’ may be used uninitialized in this function [-Wuninitialized] test.cc:72:9: warning: ‘U7’ may be used uninitialized in this function [-Wuninitialized] test.cc:73:9: warning: ‘U8’ may be used uninitialized in this function [-Wuninitialized] test.cc:74:9: warning: ‘U9’ may be used uninitialized in this function [-Wuninitialized] Compilation finished at Wed Apr 9 18:51:15ok werde ich machen
-
Thomas123 schrieb:
Furble Wurble schrieb:
Hast Du jetzt die Warnungen in Deinem Compiler aktiviert?
Und in der Folge die Warnungen beachtet?Ich habe sie aktiviert aber es werden keine angezeigt
So schlecht kann VS doch wohl kaum sein. Kann das mal jemand pruefen?
Hier mal die Ausgabe des GCC mit allen gaengigen Warnungen aktiviert (mit dem Originalcode aus dem Eingangsbeitrag):
test.cc: In function ‘int main(int, char**)’: test.cc:63:14: warning: left operand of comma operator has no effect [-Wunused-value] Uq=12+(SLN*0,1); ^ test.cc: At global scope: test.cc:7:5: warning: unused parameter ‘argc’ [-Wunused-parameter] int main(int argc, char *argv[]) ^ test.cc:7:5: warning: unused parameter ‘argv’ [-Wunused-parameter] test.cc: In function ‘int main(int, char**)’: test.cc:37:9: warning: ‘Uq’ may be used uninitialized in this function [-Wmaybe-uninitialized] Ig=Uq/Rg; ^ test.cc:44:10: warning: ‘U78’ may be used uninitialized in this function [-Wmaybe-uninitialized] I7=U78/R7; ^ test.cc:46:18: warning: ‘U1234’ may be used uninitialized in this function [-Wmaybe-uninitialized] I1234=U1234/R1234; ^ test.cc:47:9: warning: ‘U5’ may be used uninitialized in this function [-Wmaybe-uninitialized] I5=U5/R5; ^ test.cc:48:9: warning: ‘U1’ may be used uninitialized in this function [-Wmaybe-uninitialized] I1=U1/R1; ^ test.cc:68:9: warning: ‘I3’ may be used uninitialized in this function [-Wmaybe-uninitialized] P3=I3*U3; ^ test.cc:69:9: warning: ‘I4’ may be used uninitialized in this function [-Wmaybe-uninitialized] P4=I4*U4; ^ test.cc:72:9: warning: ‘U7’ may be used uninitialized in this function [-Wmaybe-uninitialized] P7=I7*U7; ^ test.cc:73:9: warning: ‘U8’ may be used uninitialized in this function [-Wmaybe-uninitialized] P8=I8*U8; ^ test.cc:74:9: warning: ‘U9’ may be used uninitialized in this function [-Wmaybe-uninitialized] P9=I9*U9; ^Bis auf die beiden unused-parameter Warnungen darfst du jede dieser Meldungen als handfesten Fehler im Programm betrachten. Es wird bloss nur gewarnt (anstatt abzubrechen), weil der Code technisch gesehen korrektes C++ ist. Es macht nur keinen Sinn, was der Compiler auch erkennt.
(Die beiden unused-parameters darfst du als "echte" Warnungen (im Gegensatz zu Fehlern) ansehen, dass du beim Schreiben des Codes nicht wirklich nachgedacht hast, was der Code genau macht.)edit: Irgendwie bin ich in den letzten Tagen immer viel zu langsam. Ist meine Leitung zu lang und hat eine Latenz von mehreren Minuten?

-
SeppJ schrieb:
Thomas123 schrieb:
Furble Wurble schrieb:
Hast Du jetzt die Warnungen in Deinem Compiler aktiviert?
Und in der Folge die Warnungen beachtet?Ich habe sie aktiviert aber es werden keine angezeigt
So schlecht kann VS doch wohl kaum sein. Kann das mal jemand pruefen?
Hier mal die Ausgabe des GCC mit allen gaengigen Warnungen aktiviert (mit dem Originalcode aus dem Eingangsbeitrag):
test.cc: In function ‘int main(int, char**)’: test.cc:63:14: warning: left operand of comma operator has no effect [-Wunused-value] Uq=12+(SLN*0,1); ^ test.cc: At global scope: test.cc:7:5: warning: unused parameter ‘argc’ [-Wunused-parameter] int main(int argc, char *argv[]) ^ test.cc:7:5: warning: unused parameter ‘argv’ [-Wunused-parameter] test.cc: In function ‘int main(int, char**)’: test.cc:37:9: warning: ‘Uq’ may be used uninitialized in this function [-Wmaybe-uninitialized] Ig=Uq/Rg; ^ test.cc:44:10: warning: ‘U78’ may be used uninitialized in this function [-Wmaybe-uninitialized] I7=U78/R7; ^ test.cc:46:18: warning: ‘U1234’ may be used uninitialized in this function [-Wmaybe-uninitialized] I1234=U1234/R1234; ^ test.cc:47:9: warning: ‘U5’ may be used uninitialized in this function [-Wmaybe-uninitialized] I5=U5/R5; ^ test.cc:48:9: warning: ‘U1’ may be used uninitialized in this function [-Wmaybe-uninitialized] I1=U1/R1; ^ test.cc:68:9: warning: ‘I3’ may be used uninitialized in this function [-Wmaybe-uninitialized] P3=I3*U3; ^ test.cc:69:9: warning: ‘I4’ may be used uninitialized in this function [-Wmaybe-uninitialized] P4=I4*U4; ^ test.cc:72:9: warning: ‘U7’ may be used uninitialized in this function [-Wmaybe-uninitialized] P7=I7*U7; ^ test.cc:73:9: warning: ‘U8’ may be used uninitialized in this function [-Wmaybe-uninitialized] P8=I8*U8; ^ test.cc:74:9: warning: ‘U9’ may be used uninitialized in this function [-Wmaybe-uninitialized] P9=I9*U9; ^Bis auf die beiden unused-parameter Warnungen darfst du jede dieser Meldungen als handfesten Fehler im Programm betrachten. Es wird bloss nur gewarnt (anstatt abzubrechen), weil der Code technisch gesehen korrektes C++ ist. Es macht nur keinen Sinn, was der Compiler auch erkennt.
(Die beiden unused-parameters darfst du als "echte" Warnungen (im Gegensatz zu Fehlern) ansehen, dass du beim Schreiben des Codes nicht wirklich nachgedacht hast, was der Code genau macht.)edit: Irgendwie bin ich in den letzten Tagen immer viel zu langsam. Ist meine Leitung zu lang und hat eine Latenz von mehreren Minuten?

Ok das habe ich jetzt gemacht aber es geht immer noch nicht. Es kommt immer noch diese Fehlermeldung
-
Hast du denn auch die ersten beiden Antworten in diesem Thread beachtet? Welchen Code benutzt du derzeit? Wir koennen nicht hellsehen. Es kann schliesslich gut sein, dass du diese Fehler falsch behoben hast. Zu einer Frage nach einem Fehler hier im Forum gehoert immer folgendes:
1. Minimaler(!) Beispielcode, der den Fehler reproduziert. (siehe: http://www.c-plusplus.net/forum/304133 )
2. Genaue(!) Beschreibung, was du tust, was du erwartest, was passiert. (siehe: http://www.c-plusplus.net/forum/200753 und http://www.tty1.net/smart-questions_de.html )
-
SeppJ schrieb:
Hast du denn auch die ersten beiden Antworten in diesem Thread beachtet? Welchen Code benutzt du derzeit? Wir koennen nicht hellsehen. Es kann schliesslich gut sein, dass du diese Fehler falsch behoben hast. Zu einer Frage nach einem Fehler hier im Forum gehoert immer folgendes:
1. Minimaler(!) Beispielcode, der den Fehler reproduziert. (siehe: http://www.c-plusplus.net/forum/304133 )
2. Genaue(!) Beschreibung, was du tust, was du erwartest, was passiert. (siehe: http://www.c-plusplus.net/forum/200753 und http://www.tty1.net/smart-questions_de.html )Ich benutze Dev c++