Inversiver Code in der Switch Anweisung



  • Hallo,

    ich probiere folgenden Code zu verstehen:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    string fun(int i)
    { 
    	static int QS=0;
    	switch(QS){case 0: goto Q0; case 1: goto Q1; case 2: goto Q2; case 3: goto Q3;
    	}
       Q0:;
       while(i != 2)
       {
    	QS=1; return "no two yet"; Q1: ; 
       }
       QS=2; return "two"; Q2:;
       while(true)
       {
    	QS=3; return "there was a two"; Q3: ;
       }
    }
    
    int main()
    {
       int in;
       cout << "Input whole numbers:" << endl;
       cin >> in;
    
       while(in != 99){
    		cout << fun(in) << endl << "Next?" <<endl;
    	cin >> in;
       }
    }
    

    Also das Programm liest Integers ein und prueft ob es eine zwei ist. Ist eine Zwei gefunden, dann wird dies ausgegeben. Wenn keine zwei gefunden wurde, dann wird dies auch ausgegeben.
    Waerdend es kompletten Ablaufs der While Schleife (Ende wenn 99 eingegeben wird) merkt sich das Programm ob eine zwei gefunden wurde.

    Was ich nicht verstehe, wie das mit den Sprungmarken funktioniert. So wie ich das sehe, wird "QS" immer mit dem Wert 0 initializiert, also wir kommen zu der Sprungmarke Q0, was vor der ersten while Schleife ist. Wenn ich eine zwei eintippe, dann ueberspringe ich die Schleife und QS wird auf 2 gesetzt.
    Was hat die fuer einen Zweck? QS=2; return "two"; Q2:; Wo komme ich als naechstes hin? Ich dachte einfach weiter aber das ist wohl nicht der Fall?

    Kann mir jemand helfen dies zu verstehen?
    Danke!



  • Hanne schrieb:

    So wie ich das sehe, wird "QS" immer mit dem Wert 0 initializiert, also wir kommen zu der Sprungmarke Q0, was vor der ersten while Schleife ist.

    Beachte, dass QS static ist und seinen Wert nach verlassen der Funktion behält.

    Der Code ist gruseliger Müll und hoffentlich nur ein Rätsel oder so was.



  • Hanne schrieb:

    So wie ich das sehe, wird "QS" immer mit dem Wert 0 initializiert,

    Nein!
    QS ist eine statische (static int) Variable. In einer Funktion statisch deklarierte Variablen werden nur einmal - wenn das Programm das erste Mal 'dran vorbeikommt', initialisiert. Sie behalten ihren Wert nach Funktionsende.

    void funk()
    {
       static int i = 0;
    
       ...
    
       i = 1;
    }
    

    Wenn diese Funktion zum zweiten Mal ausgeführt wird, wird i NICHT mehr mit 0 initialisiert, sondern hat den Wert 1 vom ersten Funktionsaufruf.



  • oh Danke fuer den Tip. Das habe ich uebersehen. Dann macht es mehr Sinn. Es ist leider kein Raetsel, es ist das Beispiel anhand ich lernen soll wie Inverse Funktionsaufrufe funktionieren(von meinem Universitaetsprof.)

    Wenn jemand ein Link zu einem anderen Beispiel hat, andem ich das besser verstehen kann, dan waere ich Dankbar fuer einen Link.

    Vielen Dank nochmals fuer den Hint!



  • Hanne schrieb:

    oh Danke fuer den Tip. Das habe ich uebersehen. Dann macht es mehr Sinn. Es ist leider kein Raetsel, es ist das Beispiel anhand ich lernen soll wie Inverse Funktionsaufrufe funktionieren(von meinem Universitaetsprof.)

    Wenn jemand ein Link zu einem anderen Beispiel hat, ..

    anderes Beispiel für was? Es gibt keine 'inversen Funktionsaufrufe'. Wenn man das bei Google eingibt bekommt man genau einen Treffer, wo die beiden Worte so benutzt werden - und das ist dieser Thread.

    Welche Uni ist denn das wo man so einen Müll lernt. Lernt Ihr auch wie man ein paar Zahlen in eine Datei schreibt und wieder daraus liest? das wäre wirklich wichtiger.



  • Ich glaube, das soll sowas wie die Emulation einer Coroutine sein. Aber irgendwie ist das furchtbar und kann so auch nicht funktionieren.



  • Hanne schrieb:

    Es ist leider kein Raetsel, es ist das Beispiel anhand ich lernen soll wie Inverse Funktionsaufrufe funktionieren(von meinem Universitaetsprof.)

    Wie habt ihr denn "Inverse Funktionsaufrufe" definiert?
    Was soll das sein?



  • Tachyon schrieb:

    Ich glaube, das soll sowas wie die Simulation einer Coroutine sein. Aber irgendwie ist das furchtbar und kann so auch nicht funktionieren.

    Also abgesehen von der Verwendung einer static-Variable, was wirklich furchtbar ist, ist das keine Simulation einer Coroutine, es *ist* eine Coroutine. Und abgesehen von der static-Variable und den unnötigen "gotos" in der switch Anweisung (man könnte den ganzen Code ins switch reinschreiben) finde ich es auch nicht furchtbar.

    OK, dass der Returnwert der Funktion verwendet wird ist etwas seltsam, normalerweise würde man sich hier einer kleinen struct bedienen die sowohl "QS" als auch den dann jeweils auszugebenden String enthält.

    Also OK, insgesamt ist es doch furchtbar 😃

    Der von Compilern für Coroutines generierte Code sieht übrigens meist nicht viel anders aus, also auch die typischen "switch (stateVariable)" Orgien.

    Inverse Funktionsaufrufe

    Hab ich auch noch nie gehört/gelesen. Wieder ein schönes Beispiel für Uni = weltfremd.



  • hustbaer schrieb:

    Der von Compilern für Coroutines generierte Code sieht übrigens meist nicht viel anders aus, also auch die typischen "switch (stateVariable)" Orgien.

    Aber da ist die Syntax zum Erzeugen der Coroutine wenigstens verständlich. Bei dem Zeugs hier muss man erstmal ne Weile draufgucken um erkennen zu können, was das sein soll. Ind wenn das dann noch als "Inversiver Funktionsaufruf" bezeichnet wird, geht einem der Kontext erstmal völlig flöten...

    Simulation sollte Emulation heißen...


Anmelden zum Antworten