Listenelement ansteuern



  • void name::display(unsigned long k)
    {
    	if(pel==0)
    	{
    		cout << "keine Liste vorhanden" << endl;
    	}
    
    	// wenn Liste existiert
    	else
    	{
    		int anz=0;
    		el* aktuell = pel;	//this->pel;
    
    		// Eintrag k bzw. Ende der Liste suchen
    		while ( aktuell!=0 ) 
    		{
    			anz++;
    			aktuell=aktuell->pe;
    		}
    
    		// test ob k < der gesamten Anzahl an Einträgen ist
    		if(k<anz)
    		{
    			cout << "Ausgabe des " << k << "-ten Elements: " << aktuell->pe << endl;
    		}									
    		else
    		{
    			cout << "Index-Eintrag nicht vorhanden" << endl;
    		}	
    	}
    }
    
    void main()
    {
    	name *p1 = new name();
    
    	p1->display();
    }
    

    Wo liegt der Fehler ?
    Ich bekomme eine Fehlermeldung, dass display keine 0 Argumente akzeptiert.
    Dummerweise muss die main so bleiben mit display() OHNE Argumente.
    D.h. display(1) ist falsch. Wie kann ich die Methode display anpassen ?
    display soll einen bestimmten Eintrag in der Liste anzeigen zB. den 7.ten



  • Der Fehler sollte offensichtlich sein, wenn Du die Fehlermeldung nochmal liest. Deine Funktion 'display' erwartet nunmal einen Parameter. Wenn Du die 'main'-Methode nicht ändern kannst, musst Du wohl 'display' ändern und entweder den Parameter entfernen oder ihm einen sinnvollen Standardwert geben.

    Der Code wird aber dann in *jedem* Fall crashen, weil Du durch den Code garantierst, dass auf ein Null-Element zugegriffen wird.



  • Ray-Kay schrieb:

    Wo liegt der Fehler ?
    Ich bekomme eine Fehlermeldung, dass display keine 0 Argumente akzeptiert.
    Dummerweise muss die main so bleiben mit display() OHNE Argumente.

    Wenn eine Methode Parameter erfordert gibt es auch kein Weg daran vorbei.

    Ray-Kay schrieb:

    D.h. display(1) ist falsch. Wie kann ich die Methode display anpassen ? display soll einen bestimmten Eintrag in der Liste anzeigen zB. den 7.ten

    Und wie soll display wissen welcher Eintrag angezeigt werden soll? Hellsehen kann die Funktion auch nicht.

    Ich würde dir zwar gerne mit meiner Glaskugel.dll aushelfen, aber die ist leider bei wilden Spekulationen in einem Logikwölkchen verschwunden 😉

    cu André



  • Das war ja genau meine Frage, die Methode verlangt die Übergabe eines Parameters. In der main wird aber nichts übergeben, das hab' ich schon erkannt.
    Nun ist die Frage, ob man in diesem Fall einen default-Parameter angeben kann, der bewirkt das eine Fehlermeldung ausgegeben wird (zB. dass kein Parameter übergeben wurde). Denn sowohl die main() als auch display(unsigned long k) soll lt. Aufgabe so bleiben. Oder geht das überhaupt nicht und da ist ein Fehler in der Aufgabenstellung.



  • Ray-Kay schrieb:

    Oder geht das überhaupt nicht und da ist ein Fehler in der Aufgabenstellung.

    Da wird ein Fehler in der Aufgabenstellung sein.

    Man kann zwar durchaus Standard-Parameter eingeben – aber erstens erscheint das hier wenig sinnvoll (Standardparameter sind *nicht* dafür da, um eine Fehlermeldung auszugeben, dass der Parameter vergessen wurde, denn das übernimmt ja bereits der Compiler für Dich).

    Und zweitens könnte man dann in der Funktion nicht unterscheiden, woher der Parameter kommt. Die Funktion denkt dann, dass sie einen ganz normalen Parameter übergeben bekommen hat.



  • Ray-Kay schrieb:

    ...der bewirkt das eine Fehlermeldung ausgegeben wird (zB. dass kein Parameter übergeben wurde). ..

    Da bereits der Compiler feststellen kann (und es auch tut), wenn kein Parameter übergeben wurde, und er sogar eine Fehlermeldung ausgibt, bist Du schon fertig. 👍

    Ich denke, was Du möchtest, ist eine Überprüfung, ob der übergebene Parameter fachlich korrekt ist - und das ist nicht dasselbe wie "... ob ein Parameter übergeben wurde....".
    Und dass dafür ein Parameter notwendig ist, sollte auch klar sein. Ohne Auto kannst Du auch nicht feststellen, ob es die richtige Farbe hat. 😉

    Gruß,

    Simon2.



  • Vielen Dank dafür. Jetzt brauch' ich mir wenigstens nicht mehr den Kopf zerbrechen, da die Aufgabenstellung nicht ganz korrekt zu sein scheint. Naja Professorensind auch nur Menschen 🙂



  • Nun ist die Frage, ob man in diesem Fall einen default-Parameter angeben kann, der bewirkt das eine Fehlermeldung ausgegeben wird (zB. dass kein Parameter übergeben wurde). Denn sowohl die main() als auch display(unsigned long k) soll lt. Aufgabe so bleiben. Oder geht das überhaupt nicht und da ist ein Fehler in der Aufgabenstellung.

    void foo::bar(int i=4){
    
    }
    

    Default 4, wenn kein wert mitgeegben wurde..



  • BorisDieKlinge schrieb:

    ...
    Default 4, wenn kein wert mitgeegben wurde..

    Du verlagerst die Fehler auch gerne an Stellen die dafür eigentlich nicht gedacht sind, oder? Es ist sehr innovativ Fehler über default-Werte zu implementieren... Wie wäre es z.B. wenn der std::vector beim Indexzugriff mit der "Magischen Zahl" 12345 einen Fehler bringt.

    Grundlegende Regeln:

    • Vermeide jegliche magische Zahlen im Programmcode
    • Um eine sinnvolle Codetrennung einzuhalten sollten Aus-/Eingaben (auch von Fehlermeldungen) von der Logik getrennt sein. Dann klappt es auch später wenn man mal die GUI wechselt.
    • Funktionsaufrufe sollte verständlich bleiben, auch wenn der Bezeichner k aus dem Originalpost schon Strafe genug ist (verwendet anständige, sprechende Bezeichner), handelt es sich hierbei um einen Index. Also kann man in deinen Beispiel nicht auf Index 4 zugreifen. Wie Intuitiv.
    • Boris: Lies Bücher! Und vermeide bitte sehr zweifelhafte Antworten.

    cu André


Anmelden zum Antworten