while Schleife "auslagern"



  • Hallo!
    Da ich leider noch ein Anfänger in C++ bin brauch ich eure Hilfe.
    Ich schreibe derzeit eine längere Konsolenanwendung, bin bei der 250 Zeile im Quelltex, und langsam wirds schwer wenn mal wo was auszubessern ist.
    Ich habe folgendes "Problem":
    Im Programm kommt eine while Schleife vor die ich gerne öfter benutzen würde.
    Im Internet habe ich von einer goto Funktion gelesen, mit der wird der Quelltext aber nicht leichter zum lesen 😉
    Mir ist klar, dass ich die Schleife im Quelltest "minimieren" kann, bin damit dennoch nicht zufrieden.
    Gibt es nicht die Möglichkeit, dass ich diese Schleife in eine zweite Datei verschiebe und diese Datei dann mittels Befehl im Hauptprogramm ausführe?
    Ich drücke mich vielleicht falsch aus mit Datei meine ich kein txt Dokument sondern zb. Schleife.cpp oder Schleife.h
    Würde mir sehr helfen da ich vielleicht am Schluss draufkomme, dass bei der Schleife eine Funktion fehlt.

    MFG



  • ja die while-schleife kannst du z.b. auch in eine (inline-) funktion auslagern.

    die verwendung zusätzlicher dateien geht natürlich auch.



  • Das was du suchst, nennt sich Funktion.

    Die kannst du aber auch in derselben Datei definieren.

    Früher (damals im letzten Jahrtausend) sagte man, eine Fuktion sollte nicht länger als eine Bildschirmseite sein. Das waren ca. 25 Zeilen.
    main ist auch eine Funktion.

    250 Zeilen für eine Datei sind eher wenig, für eine Funktion doch eher viel.

    goto gilt als böse, und wird sehr, sehr, sehr selten verwendet und gilt für Anfänger als verboten. 😉
    (du hast ja schon gemerkt warum)



  • Ein Minimalbeispiel wäre hilfreich.



  • Danke für eure Antworten.
    Minimalbeispiel:

    Bei mir geht es um die Vergabe von Skillpunkten.

    Hier zeigt er nur an wieviele Punkte der Charakter bereits besitzt und wieviele Punkte noch verfügbar sind.

    cout << "Sie haben noch " << skillPunkte << " Skill-Punkte uebrig.\n";
    	cout << "Gesundheit= " << character.gesundheit << "\n";
    	cout << "Ausdauer= " << character.ausdauer << "\n";
    	cout << "Abwehr= " << character.abwehr << "\n";
    	cout << "Mana= " << character.mana << "\n";
    	cout << "Staerke= " << character.staerke << "\n";
    	cout << "Wissen= " << character.wissen << "\n";
    	cout << "Geschick= " << character.geschick << "\n";
    	cout << "Krit= " << character.krit << "\n";
    	cout << "Glueck= " << character.glueck << "\n";
    

    Danach startet die while Schleife:

    while (skillPunkte > 0)
    	{
    
    		if (skillPunkte > 0)
    		{
    
    			cout << "Erhoehen Sie nun Ihre Gesundheit: (0 für keine Erhoehung)\n";
    			cin >> zwischenspeicher;
    			if (zwischenspeicher > 10)
    			{
    				cout << "Sie können nicht mehr Skill Punkte verwenden als Sie haben! \n";
    			}
    			else
    			{
    
    				character.gesundheit = character.gesundheit + zwischenspeicher * 10;
    				skillPunkte = skillPunkte - zwischenspeicher;
    				zwischenspeicher = 0;
    				cout << "Gesundheit ist nun auf " << character.gesundheit; cout << "\n";
    			}
    		}
    

    Danach geht es mit Ausdauer weiter. Wenn alle Punkte verteilt sind zeigt er das Inventar an. Hier kann man Waffen ausrüsten usw.
    Diese komplette Funktion hätte ich eben gerne mit einem Befehl ausgeführt.
    Ich würde dann gerne (wenn ich dann später wieder Punkte zu verteilen habe) einen Befehl eingeben damit er diesen Abschnitt startet und wenn er fertig ist an der richtigen Stelle mit dem Programm weiter macht.

    Die inline Funktion habe ich mir schon angeschaut. Komme aber mit der nicht zurecht. Kann ich sie für diese Aufgabe benutzen?



  • inline bedeutet ja nur, dass der compiler freundlich darum gebeten wird, diese funktion in den fertigen code zu schreiben, wodurch dann irgendwelche sprünge vermieden werden.

    ab einer gewissen größe, die bei dir überschritten sein dürfte, lohnt es sich einfach nicht mehr, funktionen als inline zu deklarieren, weil der programmcode dann unnötig aufgebläht wird und die zeitersparnis vernachlässigt werden kann.

    also nimm am besten eine einfache void-funktion.



  • @HansKlaus

    funktionen als inline zu deklarieren, weil der programmcode dann unnötig aufgebläht wird und die zeitersparnis vernachlässigt werden kann.

    fast alle (welcher nicht?) heutigen Kompilern (gcc,clang,cl) ignorieren inline um genau solche Micro-Falsch-Optimierung seitens des Entwicklers zu vermeiden

    @new001

    was du suchst sind einfach "Funktionen" (https://de.wikibooks.org/wiki/C-Programmierung:_Funktionen)

    ansonsten stell doch einfach deine 250 Zeilen hier rein (Code-Tags nicht vergessen sonst wirst du erschossen...)



  • ich dachte immer, dass inline eine empfehlung an den compiler ist, und dass der compiler dann irgendwie die zeilen der funktion zählt ö.ä. und dann darüber entscheidet, ob er der empfehlung folgt.

    wäre schon ziemlich doof, wenn wirklich kleine funktionen, die oft aufgerufen werden und die ich daher gerne als inline haben möchte, nicht auch so umgesetzt werden würden.



  • wäre schon ziemlich doof, wenn wirklich kleine funktionen, die oft aufgerufen werden und die ich daher gerne als inline haben möchte, nicht auch so umgesetzt werden würden.

    Empfehlung heißt eben nicht - wenn zu Gross dann trotzdem, oder immer inline - sondern - in den meisten Fällen macht der Kompiler das was er für sinnvoll hält

    mit inline kann man nicht mehr so viel Einfluss nehmen wie zu DOS Zeiten



  • new001 schrieb:

    while (skillPunkte > 0)
    	{
    		if (skillPunkte > 0)
    		{
    ...
    

    Das ist doppelt gemoppelt.

    void sP( int skillPunkte )
    {
    	if( skillPunkte <= 0 )
    		return;
    	else
    	...
    }
    

Log in to reply