Fehlermeldung - Unbehandelte Ausnahme!?!?!?



  • Hi, ich hab ein bisschen mit Funktionen Rumgespielt und dabei habe ich eine Fehlermeldung Produziert.
    Hier mal mein Code:

    #include <iostream>
    #include <conio.h>
    
    using namespace std;
    
    //Funktionsprototypen
    
    int cbv( int parameter );//Call by Value
    int cbr1( int* parameter );//Call by Reference
    
    int main()
    {
    	int var = 0;
    	int param = 100;
    	int* iptr = 0;
    
    	//Call by Value
    	cout << "var vor der Funktion [cbv]: " << var << endl;
    	cout << "param vor der Funktion [cbv]: " << param << endl;
    	var = cbv( param );
    	cout << "param nach der Funktion [cbv]: " << param << endl;
    	cout << "var nach der Funktion [cbv]:" << var << endl;
    
    	cout << endl << endl;
    
    	//Call by Reference
    	cout << "var vor der Funktion [cbr1]: " << var << endl;
    	cout << "param vor der Funktion[cbr1]: " << param << endl;
    	*iptr = cbr1( &param );
    	cout << "param nach der Funktion [cbr1]: " << param << endl;
    	cout << "iptr nach der Funktion [cbr1]: " << *iptr << endl;
    
    	getch();
    	return 0;
    }
    
    int cbv( int parameter ) 
    {
    	int erg;
    	cout << "Diese Funktion verdoppelt den Inhalt von 'parameter': " << endl;
    	erg = parameter * 2;
    	cout << "param intern verändern [auf 300]: " << endl;
    	parameter = 300;
    	return erg;
    }
    
    int cbr1( int* parameter )
    {
    	int* ergebnis = 0;
    	cout << "param wird intern verändert: [auf 100] " << endl;
    	*parameter = 100;
    	*ergebnis = (*parameter) * 2;
    	return *ergebnis;
    }
    

    Und noch ne Frage:
    Macht es eigentlich Sinn bei dem Call by Reference verfahren einen wert zu returnen? Kann man das überhaupt, wenn nicht ist das wahrscheinlich mein Fehler?

    Schonmal Danke an euch.


  • Mod

    Fehler: iptr zeigt auf nichts.
    Warnung: Du hast Pointer nicht verstanden
    Warnung: Du hast Call by Reference nicht richtig verstanden
    Warnung: Du weißt nicht, was Referenzen sind

    Ratschlag zur Fehlerbehebung: Die angesprochenen Punkte selbstständig recherchieren. Fang mit Call by Reference an, dann Referenzen, dann eventuell noch Pointer (falls du sie dann überhaupt noch brauchst - sie werden durch Referenzen in diesem Zusammenhang überflüssig).



  • Das ist kein call-by-reference, sondern assignment-to-null-pointer. Beide Techniken sind ausgiebig getestet, aber nur die erste führt nicht zu undefiniertem Verhalten.
    Klartext:
    In Zeile 15 initialisierst du einen Zeiger auf einen int, lässt ihn aber auf Speicheradresse 0 zeigen. In Zeile 29 weist du diesem Zeiger dann die Adresse eines temporären Rückgabewerts zu. Erstens ist es nicht erlaubt, Zeiger auf temporaries zu halten, und zweitens führt die Zuweisung zu Undefiniertem Verhalten. Gehst hier auf Nummer sicher, um ja keinen gültigen Code zu erzeugen :p
    Gleiches gilt für Zeile 53 und 59.
    Referenzen kennzeichnet man in C++ mit einem nachgestellten Kaufmannsund (&), nicht mit einem Sternchen (das sind Zeiger).



  • Ja ich weis das das & das Zeichen für ne Referenz is und der Stren eines für Zeiger nur in meinem Buch steht dass diese Variante das normale Call by Reference ist und zwar so:

    void callbyreference( int* a, int *b );
    
    //Funktionsaufruf
    callbyrefrence( &iwert1, &iwert2 );
    

    Und dies ist nur die NAchgebildete version des Call by Reference:

    void callbyreference2( int &a, int &b )
    
    //Funktionsaufruf
    callbyreference2( wert1, wert2 )
    

    oder hab ich da etwas falsch verstanden.


  • Mod

    Wirf das Buch in den Müll.

    Und rein Interesse halber: Ist der Autor des Buches Jürgen Wolf?



  • SeppJ schrieb:

    Wirf das Buch in den Müll.

    Und rein Interesse halber: Ist der Autor des Buches Jürgen Wolf?

    äh ja. Warum?



  • Made my day 😃



  • 🕶
    Immer dasselbe...



  • theta schrieb:

    🕶
    Immer dasselbe...

    Was denn. Klärt einen armen Anfänger bitte auf. 😞


  • Mod

    Dies hier dürfte Aufklärung verschaffen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-272350.html

    Jürgen Wolf ist hier schon eine Art Forenlegende.



  • SeppJ schrieb:

    Dies hier dürfte Aufklärung verschaffen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-272350.html

    Jürgen Wolf ist hier schon eine Art Forenlegende.

    Verstehe ich dass richtig, dass ich mir da ein sau teures Buch gekauft habe, dass bei Amazon super bewertet war aber dennoch nichts taugt?
    Könnt ihr mir dann vllt sagen welche bücher gut und verständlich sind und/oder mir ein paar links von guten Tuts schicken?



  • Honky schrieb:

    Verstehe ich dass richtig, dass ich mir da ein sau teures Buch gekauft habe, dass bei Amazon super bewertet war aber dennoch nichts taugt?

    Richtig.

    Könnt ihr mir dann vllt sagen welche bücher gut und verständlich sind und/oder mir ein paar links von guten Tuts schicken?

    In den FAQ hier zum C++-Bereich gibts eine recht umfassende Bücherliste...



  • Ok, danke euch. Dann werde ich mich halt mal schlau machen, was Tutorials und Bücher anbelangt und meine Basics nochmal überarbeiten.


  • Mod

    Honky schrieb:

    SeppJ schrieb:

    Dies hier dürfte Aufklärung verschaffen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-272350.html

    Jürgen Wolf ist hier schon eine Art Forenlegende.

    Verstehe ich dass richtig, dass ich mir da ein sau teures Buch gekauft habe, dass bei Amazon super bewertet war aber dennoch nichts taugt?

    Ja. Tut mir leid für dich.

    Könnt ihr mir dann vllt sagen welche bücher gut und verständlich sind und/oder mir ein paar links von guten Tuts schicken?

    Als gute Bücher werden hier immer der "C++ Primer" und "Thinking in C++" genannt. Ersteres ist aber so weit ich weiß in der deutschen Ausgabe vergriffen (wenn du einigermaßen gut englisch kannst, sollte das kein Hindernis sein), letzteres gibt es als freies Ebook, aber ebenfalls nur auf englisch.

    Wenn es deutsch sein soll, wird hier auch öfters "C++ lernen und professionell anwenden" genannt. Ein wenig anspruchvoller ist "Die C++ Programmiersprache", dafür sollte man aber zumindest ein paar Grundvorstellungen zum Programmieren haben.

    Gute Internettutorials gibt es soweit ich weiß leider keine. Denn Anfängertutorials werden meistens von gutmeinenden fortgeschrittenen Anfängern geschrieben, die selber nicht den vollen Durchblick haben. Wer sich besser auskennt, hat aber oftmals nicht den Mut ein Tutorial zu schreiben, weil man weiß, dass man vieles auch nicht weiß.
    Es gibt jedoch ein paar fachlich sehr gute Seiten, wo spezielle Spracheigenschaften diskutiert werden, zum Beispiel die "C++ FAQ Lite"(anfängerfreundlich) oder das "Guru of the Week"-Blog (fortgeschritten). Zum systematischen Lernen der Sprache sind diese jedoch nicht geeignet. Und natürlich alles auf Englisch. Wie du merkst, kommt man in der Programmierung sehr schnell nicht mehr mit Deutsch aus.



  • Englisch sollte für mich eigentlich kein problem sein. 😉



  • Honky schrieb:

    Ja ich weis das das & das Zeichen für ne Referenz is und der Stren eines für Zeiger nur in meinem Buch steht dass diese Variante das normale Call by Reference ist und zwar so:

    void callbyreference( int* a, int *b );
    
    //Funktionsaufruf
    callbyrefrence( &iwert1, &iwert2 );
    

    Und dies ist nur die NAchgebildete version des Call by Reference:

    void callbyreference2( int &a, int &b )
    
    //Funktionsaufruf
    callbyreference2( wert1, wert2 )
    

    oder hab ich da etwas falsch verstanden.

    Ich nehme an, dass der Grund, dass er so was schreibt, ist, dass es in C keine Referenzen gibt und call-by-reference dort über Zeiger nachgebildet werden muss (C ist ja schon recht alt). In C++ dagegen gibt es echte Referenzen, wodurch die Zeiger-Methode für call-by-reference überflüssig wird. In der Tat reicht man in C++ üblicherweise für alles außer Basistypen Referenzen herum (meistens Referenzen auf Konstanten); insbesondere im Zusammenhang mit Polymorphie ist alles andere völlig abwegig, und auch bei sonstigen komplexen Datentypen spart man sich damit eine Menge Kopieraufwand.

    Wie dem auch sei, es ist häufig so, dass der Compiler Referenzübergabe in Maschinensprache übersetzt, die das selbe macht wie die Zeigerübergabe, aber vom Standard vorgeschrieben ist das nicht. Vorgeschrieben ist lediglich die Semantik, nicht, wie diese erreicht wird - findet ein Compiler einen besseren Weg, darf er diesen benutzen.

    Was Jürgen Wolf angeht...für mich sieht es so aus, als habe er C "gelernt", wie man das von Webdesignern kennt - probieren geht über studieren, und wenn's bei mir läuft, wird's schon richtig sein. Eigentlich sollte er das oben verlinkte Buch "Grundkurs $MEIN_COMPILER" nennen, und selbst da ist es zweifelhaft, ob seine Beispiele in der nächsten Version noch funktionieren. Er ist ein anschauliches Beispiel des Dunning-Kruger-Effekts.


Anmelden zum Antworten