Variablen aktuallisieren?



  • ElGreco schrieb:

    ich weis nicht was das soll jetzt hier eine ellenlange funktion zu posten aber bitte:

    Zum Beispiel, damit ich dir sagen kann, dass da 1. doch ein Fehler drin ist und 2. du die Funktion viel kürzer und fehlerunanfälliger schreiben kannst.

    Zu 1.: rand() gibt Zahlen zwischen 0 und RAND_MAX (typischerweise sehr groß) zurück. Wenn du das modulo 52 nimmst (mit dem 😵 kommen Zahlen zwischen 0 und 51 raus, nicht zwischen 1 und 52. Modulo ist der Teilerrest beim ganzzahligen Teilen, in dem Fall durch 52, der kann nie 52 werden.

    Zu 2.: Codewiederholungen sind schlechter Stil, da schlecht lesbar und fehleranfällig, das sollte man immer vermeiden! Ich würde den Körper des if-Blocks mit //If the mouse is over the button , also alles zwischen Z. 89 und Z. 524 einschl. folgendermaßen umschreiben (Bereich der Zufallszahlen sind schon angepasst (siehe 1.)):

    if ( ! bGeklickt ) {
        int rand = rand() % 52;
        <Typ für Karten> card;
        if ( rand >= 39 ) card = card_Kreuz;
        else if (rand >= 26) card = card_Pik;
        else if (rand >= 13) card = card_Caro;
        else card = card_Heart;
        if ( (rand + 1) % 13 == 0 ) *iZeiger = 11;
        else if ( (rand + 1) % 13 >= 9 && (rand + 1) % 13 <= 12 ) *iZeiger = 10;
        else *iZeiger = rand % 13 + 2;
    
        Button myButton1(610, 512, 300, 500);
        apply_Surface(610, 512, card, screen, &clipOpen[rand % 13]);
        bGeklickt = true;
        return 1;
    }
    
    if(Mix_PlayChannel(-1, cardFlip, 0) == -1) {
        return 1;
    }
    

    416 Zeilen Code gespart - nicht schlecht oder? Und der Code ist vermutlich auch schneller, weil er sich bei hohen Zufallszahlen nicht durch die ganzen if-else-Zweife hangeln muss.

    Auf das andere, was ich geschrieben habe, gehst du gar nicht ein. Und den Code von der ganzen Funktion, wo du den Fehler vermutest (der main()-Funktion, wenn ich das richtig verstanden habe), hast du auch nicht gepostet.

    edit: Und was sollt eigentlich das Button myButton1(610, 512, 300, 500); ?
    Das ist eine lokale Variable, die ist nur innerhalb dieses if-Blocks gültig, und da wird sie nicht benutzt.. Ist das so beabsichtigt?



  • Mir fällt gerade noch ein, dass das Vergleichen der Zufallszahl bei dir auch nicht richtig ist. Denn anstatt einmal eine Zufallszahl zu generieren und diese dann zu verwenden (siehe mein Code, Z. 2), rufst du in jeder if- bzw. else-if-Abfrage rand() neu auf. Somit wird in jeder Abfrage eine neue Zufallszahl mit dem entsprechenden Wert verglichen. Evtl. liegt da sogar der Fehler, denn wenn bei keiner der Abfragen zufällig der passende Wert von rand() zurückgegeben wird, sodass die Bedingung erfüllt ist, wird dein ganzes Konstrukt erfolglos durchlaufen und am Schluss 0 zurückgegeben.

    Wenn du dann noch den Zufallsgenerator nicht geseedet hast (am Anfang musst du einmalig srand(time(NULL)) aufrufen, sonst kommen immer die gleichen Zufallszahlen) tritt das Problem bei jedem Programmdurchlauf in gleicher Weise auf.



  • Ok, vielen vielen Dank schonmal für die Sache mit der code Gestaltung und der Sache mit dem Modulo Operator...man merkt ich bin Anfänger.

    Also das mit dem Zufallsgenerator kann gut möglich sein, wenn der jetzt fehlerhaft ist und desshalb 0 zurück gibt, kein Wunder, dass dann nicht die if Anweisung für " == 1 " durchlaufen wird. Ich überarbeite den Code mal und melde mich nochmal.

    Mfg ElGreco


Anmelden zum Antworten