Kleiner Fehler im meinem Programm. Referenz



  • Kazumi schrieb:

    Weiß eine was ich falsch gemacht habe? >_<

    Ja, du hast vergessen anzugeben, was für ein Fehler dort gemeldet wird. Aber wenn ich raten müsste würde ich sagen, daß es in der Zeile eigentlich vec[i] heißen sollte.

    Inhaltlich solltest du die Referenz erst rauspicken, nachdem du sichergestellt hast, daß sie funktioniert. Und du hast vergessen, einen Rückgabewert (return) zu liefern.



  • okay, das mit der Todsünde hab ich behoben.
    Hab das bei einem meiner kommilitonen gesehen, dachte das wäre richtig.

    Warum ich define benutzt habe, das liegt an unserem Professor, der meinte wir sollen das mit #define lösen.

    Also wenn ich es mit vec[i]; kommt kein Fehler mehr.
    Jedoch wird das Programm sofort beendet, nachdem ich es gestartet habe, wie lässt sich dies umgehen?

    in C haben wir es immer mit "void main" und dann am ende mit zweimal "getchar();" gelöst.
    jetzt neue Prof neue Regeln, sagte man uns, mit "int main" und dann am Ende "return 0"

    habs probiert klappt aber leider nicht.

    Hab dir Funktion nun so umgeändert

    int &at(int* vec, unsigned len, unsigned i)
    {
    
       int &referenz = vec[i];
    
    	if (i<len-1)  
    	{
        cout << "index overflow";
    	exit (0);
    
    	}
    
    	else exit (-1);
    
    }
    

    Wenn ich ein exit mache, brauche ich keinen Wert zurückzugeben, richtig?



  • Kazumi schrieb:

    Wenn ich ein exit mache, brauche ich keinen Wert zurückzugeben, richtig?

    Ja, das ist richtig, aber vermutlich nicht der Sinn der Übung. Schließlich besteht die Aufgabe ja gerade darin, etwas zurückzugeben 😉
    (und bei einem exit() brauchst du dich auch nicht wundern, daß sich das Programm beendet - genau das ist die Aufgabe von exit())

    PS: Und falls du Mittel gegen das automatisch Beenden des Programms suchst, schau mal in die FAQs vom Konsolen-Board.



  • ja, aber in der Aufgabenstellung wird verlangt, wemm i einen ungültigen Wert hat soll das Programm beendet werden.



  • Kazumi schrieb:

    ja, aber in der Aufgabenstellung wird verlangt, wemm i einen ungültigen Wert hat soll das Programm beendet werden.

    Bei einem ungültigen Wert ja - bei einem gültigen Wert soll die Funktion normal zurückkehren (da ist exit() die falsche Lösung).



  • aso, okay

    ich glaube so müsste es sein,

    int &at(int *vec, unsigned len, unsigned i)
    {
    
       int &referenz = vec[i];
    
    	if (i<len-1)
    	{
        cout << "index overflow";
    	exit (0);
    	}
    	else return referenz;
    }
    

    aber ich bekomme es nicht hin, dass das Fenster am Ende stehen bleibt und nicht automatisch schließt.

    Hab auch die ganze FAQs gelesen und ausprobiert, auch mit cin.get(); klappts leider auch nicht

    //1. ist es überhaupt möglich, dass das Programm nicht beendet wird wenn man exit (0); stehen hat?

    //2. Es muss doch i>len-1 sein, oder?
    Weil wenn i=1 ist, soll ja die else funktion ausgeführt werden 😕 ⚠



  • Zu 1: Nein, in dem Moment, wo du exit() aufrufst, wird das Programm beendet, ohne daß du noch weitere Einflußmöglichkeiten hast (allerdings wird eine per atexit() registrierte Funktion noch aufgerufen, das wäre ein möglicher Ansatz).

    Zu 2: Du hast die Funktion doch selber geschrieben, also solltest du auch wissen, wie die korrekte Fehlerbedingung lautet 😉

    Ansonsten: Du hast immer noch die falsche Verarbeitungsreihenfolge. Du solltest ERST prüfen, ob der Index in Ordnung ist und DANACH die Referenz aus dem Array ziehen.

    PS: Und "else" ist keine Funktion 😉



  • aber sobald ich erst den Index prüfe und dann die referenz,
    dann erscheint immer ein Fehler "'referenz': nichtdeklarierter Bezeichner"

    int &at(int *vec, unsigned len, unsigned i)
    {
    
    	if (i> len-1)
    	{
        cout << "index overflow";
        cin.get();
    	cin.get();
    	}
    
    	else 
    
    		int &referenz = vec[i];
    		return referenz;
    
    }
    


  • Vegleiche mal dein if mit dem else, was fällt dir auf?



  • Wenn du an eine if- oder else-Anweisung mehrere Befehle anhängen willst, benötigst du auch geschweifte Klammern, um sie zusammenzufassen. In der letzten Version gehört (entgegen dem was die Einrückung sagt) nur die Definition von "referenz" zum else-Zweig.



  • CStoll schrieb:

    Wenn du an eine if- oder else-Anweisung mehrere Befehle anhängen willst, benötigst du auch geschweifte Klammern, um sie zusammenzufassen. In der letzten Version gehört (entgegen dem was die Einrückung sagt) nur die Definition von "referenz" zum else-Zweig.

    wow, danke.
    Auf die Klammer wäre ich jetzt nicht von alleine gekommen 🙂

    Das ist aber bei C++ im vergleich zu C neu, oder?

    Kann mir nicht wirklich daran erinnern, es so gemacht zu haben, ist aber auch schon mehrere Wochen her als ich noch C programmierte.



  • das war schon immer so und ist in allen (?) Sprachen, die geschweifte Klammern haben gleich.

    greetz KN4CK3R



  • Kazumi schrieb:

    CStoll schrieb:

    Wenn du an eine if- oder else-Anweisung mehrere Befehle anhängen willst, benötigst du auch geschweifte Klammern, um sie zusammenzufassen. In der letzten Version gehört (entgegen dem was die Einrückung sagt) nur die Definition von "referenz" zum else-Zweig.

    wow, danke.
    Auf die Klammer wäre ich jetzt nicht von alleine gekommen 🙂

    Das ist aber bei C++ im vergleich zu C neu, oder?

    Kann mir nicht wirklich daran erinnern, es so gemacht zu haben, ist aber auch schon mehrere Wochen her als ich noch C programmierte.

    Ist doch 'n Witz ?
    Das gehört zum Basiswissen.
    Wenn du da nicht selbst drauf gekommen wärst, hättest du echt noch Probleme gehabt (nicht nur hier).

    Außerdem, mehrere Wochen sind nicht mehrere Monate. Das ist keine Entschuldigung. Und wenn du auch in C nichts derartiges gemacht hast, ...


Anmelden zum Antworten