Programm läuft sich nur manchmal "tot".



  • Hi,

    randomize();
    

    darf nur einmal im Programm aufgerufen. Jedes weitere mal ist schlicht weg falsch.

    2. Dein Programm hängt in der Schleife, wei die Bedingung:

    if ( (Timerzeit > intervall_min) && (Timerzeit < intervall_max) )
    

    immer true ist...



  • Original erstellt von AndreasW:
    [...]immer true ist...

    Nein, nur wenn Timerzeit != intervall_min (o; ist aber trotzdem schlecht, damit hast du recht.

    -junix



  • @AndreasW, hab ein Beispiel, daß ich für RGB-Random-Farben verwende:

    rb=random(255),gb=random(255),bb=random(255);
    

    Hier wird ja gem. Hilfe nicht der Zufallszahlengenerator initialisiert (wie bei randomize()). Es funktioniert auch wie vorgesehen. Wäre das die Lösung für @Sensei's zweites Problem oder fällt es auch unter deinen Warnhinweis? Da die Hilfe ja nicht immer präzise ist, stellt sich hier Unsicherheit ein.



  • Mein lieber Omega-X: Diese Frage hat nichts mit diesem Thread zu tun. Also bitte nicht den Thread auf ein anderes Thema leiten.

    Um doch noch zu Antworten: Nein random kann man auf jeden fall mehrfach aufrufen. AndreasW hat ja deutlich geschrieben randomize. Lesen...

    -junix



  • Mir ist noch nicht ganz klar geworden, warum die If-Bedingung immer true ergibt.

    Wenn Timerzeit beispielsweise den Wert 33 ermittelt hat, dann ist zwar

    33 < intervall_max
    

    (wenn ich zunächst einmal vom Default 60 ausgehe), aber dann ist

    33 > intervall_min
    

    nicht mehr true und somit ergibt die ganze Bedingung false, weil die einzelnen Bedingungen mit AND verknüpft sind.

    Oder mache ich da einen Denkfehler?



  • @junix, ich wollte @Sensei empfehlen, randomize() in den Constructor oder ins OnCreate zu packen und innerhalb der App nur random() zu benutzen. Bin aber nicht sicher, ob das so richtig ist und wollte es abklären. - Für meine Situation brauch ich die Frage nicht stellen, ich hab ja eine Lösung. Will sie aber nur weitergeben, wenn sie richtig ist. Also sie ist, Dank dir. 🙂



  • Hi,
    ich glaube, da gibt es einen Denkfehler in der Schleife:
    wenn Timerzeit zwischen intervall_min und intervall_max liegt, ist die bedingung true und du bleibst in deiner Schleife.

    Danach wird Timerzeit nicht mehr geändert, du kommst also aus deiner Schleife nicht mehr raus.

    Solange dein Random einen Wert unterhalb intervall_min zurückliefert (bei deinen Vorgabewerten geht ja >intervall_max gar nicht) läuft dein Proggi im ersten anlauf durch die Schleife, ansonsten bleibt es immer drin.



  • Dann muss ich die Schleife noch einmal arg überdenken.

    Aus

    int Timerzeit = random(60);
    

    mache ich erst einmal

    int Timerzeit = random(intervall_max);
    

    , dann erübrigt sich schon die Prüfung der zweiten Bedingung, denn der Rahmen, in dem die Zufallswerte liegen sollen, macht IMHO nur Sinn bis höchstens intervall_max.

    Wie ist es denn hiermit:

    void TMainForm::TimerIntervall()
    {
        if (Timer->Enabled != false) {
            Timer->Enabled = false;
        }
    
        int Timerzeit = 0;
    
        while (Timerzeit < intervall_min) {
              Timerzeit = random(intervall_max);
        }
    
        Timerzeit = Timerzeit * 6000;
        Timer->Interval = Timerzeit;
        Timer->Enabled = true;
    }
    
    // randomize(); wird in den Konstruktor verschoben
    

    Die WHILE-Schleife durchlaufe ich nun mindestens einmal, da mindestens im ersten Durchlauf
    tatsächlich Timerzeit < intervall_min ist. Sobald Timerzeit >= intervall_min ist, wird die Schleife beendet.
    Damit spare ich mir sogar noch die BOOL-Variable.

    randomize(); verschwindet aus der Funktion und wandert in den Konstruktor.

    Ansonsten bleibt alles wie gehabt. Ist das so besser?

    [ Dieser Beitrag wurde am 22.05.2003 um 19:58 Uhr von Sensei editiert. ]



  • Original erstellt von Sensei:
    **```cpp
    if (Timer->Enabled != false) {
    Timer->Enabled = false;
    }

    wofür brauchst du das?
    reicht nicht einfach ein einzelnes Timer->Enabled = false; ?
    wenn die Eigenschaft Enabled !=false (also true is), wird Enabled auf false gesetzt, ansonsten ist sie eben schon vorher false...



  • Ich wollte in den Block später noch etwas mehr Funktionalität einfügen, die eben anhängig vom Zustand des Timers wäre. Da ich aber noch an bekannter Stelle meine Probleme hatte, kam ich bisher nicht dazu.

    Ein Schritt nach dem anderen. 🙂

    Da ich bisher noch keinen weiteren Widerspruch mehr bekommen habe, gehe ich erst einmal davon aus, dass mein letzter Vorschlag zumindest eine Verbesserung darstellt. Ansonsten meldet Euch bitte!

    Herzlichen Dank an alle Beteiligten!


Anmelden zum Antworten