Anfängerfrage- Was ist Überprüfungscode?



  • Hallo,

    ich habe den untenstehenden Code (lern gerade C++ mit einem Buch von Stroustrup) und es funktioniert nicht. Ich erhalte als Ausgabe nur Nullen, aber ich versteh nicht, warum. Das Buch sagt mir: "Der Überprüfungscode fehlt."
    Was soll das heißen? Ich kapier's einfach nicht.

    //Flächenberechnung, x = Länge, y = Weite
    int area(int x, int y)
    {
    	if(x <=0 || y <=0)
    	{
    		error("ungültige Argumente");
    	}
    	return x*y;
    }
    
    //Funktion, die Fehler erzeugen soll mit der Flächenberechnung
    int f(int x, int y, int z)
    {
    	int area1 = area(x,y);
    	if (area1<=0) error("negative Fläche");
    	int area2 = area(1,z);
    	int area3 = area(y,z);
    	double ratio= double(area1)/area3;
    	return area1, area2, area3, ratio;
    }
    
    int main()
    {
    	int x, y, z;
    	int area1=0, area2=0, area3=0, ratio=0;
    
    	x = 7; //erstmal irgendwelche Werte
    	y = 7;
    	z = 8;
    
    	f(x,y,z);
    
    	cout << area1 << ' ' << area2 << ' ' << area3 << ' ' << ratio << endl;
    	cout <<"\n\n";
    	system("pause");
    	return 0;
    }
    

  • Mod

    Soll das ein Programm sein, in dem du die Fehler suchen sollst? Da sind viel mehr als ein Fehler drin und ziemlich krasse noch dazu. Zeile 19 ist Unsinn, Zeilen 25-33 kompletter Unfug und selbst bei der Rechnung 14-18 wird zwar irgendwas berechnet, aber nichts was mir Sinn zu machen scheint. Was ist das Ziel dieser Übung? Oder hast du das selber programmiert?

    Zu der Frage nach "Überprüfungscode": Kontext? Das wird irgendeine furchtbare Übersetzung eines englischen Fachbegriffes sein, die man als Fachmann nicht einmal mehr erkennen kann 👎 . Das wird sicherlich vorher irgendwo erklärt.



  • Der Grund warum du Nullen angezeigt bekommst, ist, dass Du die Variablen area1, 2 und 3 mit 0 initialisierst und dann ausgibst.

    int area1=0, area2=0, area3=0, ratio=0;
    

    und

    cout << area1 << ' ' << area2 << ' ' << area3 << ' ' << ratio << endl;
    


  • 😮 Na gut, doch so schlimm. Wo die Nullen herkommen, weiß ich, aber warum nichts anderes passiert... naja, ich bekomm langsam eine Ahnung.

    Bis Zeile 18 steht's im Buch, der Rest ist von mir.

    Die Initalisierungen mit 0 habe ich gemacht, weil der Compiler immer gemeckert hat, das sie nicht initalisiert werden.

    Der Kontext zum Überprüfungscode (das Wort stammt aus einer deutschen Ausgabe) ist folgender: f ruft die Funktion area auf, vergisst aber die Überprüfung des zurückgelieferten Fehlerwerts. Zeile 6 ist dabei falsch abgeschrieben:

    //Flächenberechnung, x = Länge, y = Weite
    int area(int x, int y)
    {
        if(x <=0 || y <=0)
        {
            return -1;
        }
        return x*y;
    }
    

    Die Aufgabe ist die area1-3 und ratio ausgeben zu lassen und weiter Tests einzufügen, bis alle Fehler weg sind (wenn man negative Zahlen eingibt zB). Naja, wie gibt man denn überhaupt mehrere Werte zurück?



  • Lieschen Müller schrieb:

    Naja, wie gibt man denn überhaupt mehrere Werte zurück?

    Hier solltest du dir eine eigene Datenstruktur definieren.


  • Mod

    Sone schrieb:

    Lieschen Müller schrieb:

    Naja, wie gibt man denn überhaupt mehrere Werte zurück?

    Hier solltest du dir eine eigene Datenstruktur definieren.

    Nein, die Aufgabe ist höchstwahrscheinlich ganz anders gemeint. Es soll vermutlich nur ratio zurück gegeben werden. Das Hauptaugenmerk der Übung besteht in dem Auswerten von Funktionsrückgabewerten.



  • SeppJ schrieb:

    Sone schrieb:

    Lieschen Müller schrieb:

    Naja, wie gibt man denn überhaupt mehrere Werte zurück?

    Hier solltest du dir eine eigene Datenstruktur definieren.

    Nein, die Aufgabe ist höchstwahrscheinlich ganz anders gemeint. Es soll vermutlich nur ratio zurück gegeben werden. Das Hauptaugenmerk der Übung besteht in dem Auswerten von Funktionsrückgabewerten.

    Kann sein, hab' mir den Code nicht wirklich angesehen.

    Edit: Jup, hast Recht.
    Naja, war auch eher als allgemeiner Ratschlag für solchen Fälle in denen es nicht anders geht als mehrere Werte zurückzugeben gemeint...



  • Hm, also im Buch steht wirklich drin, dass alle 4 berechneten Werte zurückgegeben werden sollen. Irgendwie denk ich mir, ich hätte die Funktion f auch einfach weglassen können und alles in main() ausrechnen. Naja, nun habe ich das wie von sone vorgeschlagen gemacht (hat halt bisschen gedauert, weil ich es erstmal nachlesen musste)

    int area(int x, int y)
    {
    	if(x <=0 || y <=0)
    	{
    		error("ungültige Argumente");
    		//return -1;
    	}
    	return x*y;
    }
    
    typedef struct
    {
      int area1, area2, area3;
      double ratio;
    } Werte;
    
    Werte f(int x, int y, int z)
    {
    	Werte berechnen;
    
    	berechnen.area1 = area(x,y);
    	if (berechnen.area1<=0) error("negative Fläche");
    	berechnen.area2 = area(1,z);
    	berechnen.area3 = area(y,z);
    	berechnen.ratio= double(berechnen.area1)/berechnen.area3;
    
    	return berechnen;
    }
    
    int main()
    {
    	int x, y, z;
    
    	x = 7;
    	y = 7;
    	z = 8;
    
    	Werte berechnen = f(x,y,z);
    
    	cout << berechnen.area1 << ' ' << berechnen.area2 << ' ' << berechnen.area3 << ' ' << berechnen.ratio << endl;
    	cout <<"\n\n";
    	system("pause");
    	return 0;
    }
    

    Das klappt jetzt herrvoragend und ich werde beginnen, ungültige Argumente einzusetzen.

    Vielen Dank euch allen fürs Draufgucken und Hinweise geben. Das mir weitergeholfen.


  • Mod

    Sone schrieb:

    Naja, war auch eher als allgemeiner Ratschlag für solchen Fälle in denen es nicht anders geht als mehrere Werte zurückzugeben gemeint...

    Selbst da finde ich das einen doofen Ratschlag. Entweder gehören die Werte logisch zusammen, dann sollten sie sowieso gemeinsam in ein Objekt, oder nicht, dann wäre das künstliche Zusammenbinden zwecks Rückgabe aus einer Funktion verkehrt. Es gibt schließlich genügend andere Methoden, angefangen bei Referenzen, hin zu den coolen C++11-Tupeln mit std::tie.



  • Nur mal so als Frage, bin ich hier eigentlich richtig mit meinen Fragen oder habt ihr da eine andere Abteilung extra für nervige Anfängerfragen?

    @SeppJ: Das mit den Referenzen habe ich irgendwie nicht verstanden. Darauf war ich bei meinen Recherechen schon gestoßen. Ich nehme an, es wird noch vieles erklärt, wenn ich erstmal weiter bin im Buch.



  • Lieschen Müller schrieb:

    Das Buch sagt mir: "Der Überprüfungscode fehlt."
    Was soll das heißen? Ich kapier's einfach nicht.

    Das soll schlicht heißen, dass die Funktionen area() und framed_area() einen bestimmten Wert für den Fehlerfall zurückgeben und man das Ergebnis daraufhin prüfen muss um einen Fehler auszuschließen. Wenn man das nicht tut, fehlt der "Überprüfungscode" und das Programm rechnet mit Werten weiter die eigentlich als Fehlermeldung vorgesehen waren.

    Desweiteren ist wohl nicht gemeint, dass f() die vier Werte zurückgeben soll und main() sie dann in die Konsole schreibt. Es reicht wenn du sie in f() einfach gleich auf der Konsole ausgibst.

    Den Umweg über diese komische struct-Konstruktion kannst Du weglassen.
    In c++ würde man es auch nicht so hinschreiben wie Du es getan hast, sondern vielleicht eher so:

    struct Werte
    {
      int area1, area2, area3;
      double ratio;
    };
    

    Lieschen Müller schrieb:

    Nur mal so als Frage, bin ich hier eigentlich richtig mit meinen Fragen oder habt ihr da eine andere Abteilung extra für nervige Anfängerfragen?

    Da es sich eindeutig um C++ handelt bist Du hier richtig. Wen solche Fragen nerven braucht sie ja nicht zu beantworten. 😉



  • Ah, cool, vielen Dank. Gleich noch mehr gelernt. Die Aufgabe hab ich jetzt verstanden.

    Da es sich eindeutig um C++ handelt bist Du hier richtig.

    Na dann gibt's noch öfter so geistreiche Sachen von mir.


Anmelden zum Antworten