funktion nur einmal ausführbar... nix wissen warum :-/



  • Hi again...

    Ich habe nun folgendes problem: Ich hatte die idee ein funktion zu schreiben, welche den selben sinn hat wie _sleep(int millisekunden), also den programmablauf für eine bestimmte anzahl an millisekunden zu stoppen. Das habe ich auch hinbekommen, nur eins, das kapier ich nicht:

    In der main-funktion habe ich eine schleife erstellt, welche genau 10 mal abläuft, und mit der 10 mal ein bestimmter text ausgegeben werden soll. Ok, nun möchte ich, das zwischen den den einzelnen ausgaben für 1 sekunde, also 1000 millisekunden, das programm gestoppt wird. Ok, das tuts auch nach der ersten ausgabe, aber danach scheint die funktion nie wieder aufrufbar, was heisst das die restlichen 9 ausgaben ohne zeitliche verzögerung geschehen!!!????

    [EDIT]
    was ich mittlerweile weiß ist, das die funktion doch 10 mal aufgerufen wird, nur das die schleife in der funktion _delay() bei erneutem aufruf, nur noch einmal abläuft, obwohl der counter wieder auf 0.0 gesetzt wird 😕
    [/EDIT]

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <conio.h>
    #include "conio.c"
    
    // Function _delay(n) - stoppt das Programm für n Sekunden.
    void _delay(int msec){
    
         double ismsec=(double)msec/1000; /* rechnet den Integer msec in double um,
                                           * und dividiert das Ergebnis durch 1000
                                           * (z.B: msec=125; ismsec hat nun den
                                           * double-Wert 0.125)
                                           */
         double counter=0.0;
    
         while(counter<=ismsec){
    
             counter=(double)clock()/1000; /* definiert einen inkrementiellen
                                            * milisekunden-counter
                                            */
         }
    }
    
    int main()
    {
    int i=1;
    while(i<11){
        printf("%d. Sekunde!",i);
        _delay(1000);
        i++;
    }
    getchar();
    }
    

    grüße duke



  • Hast du bedacht, dass clock absolute Zeiten liefert?



  • hmm.. und warum ist die funktion dann nur einmal aufrufbar? 😕



  • sorry meine ausdrucksform, bin bisserl dicht 🙂 ich verbesser mich:

    und warum funktioniert die schleife dann beim ersten funktionsaufruf wie sie funktionieren soll? 😕



  • clock gibt dir die Zeit seit Systemstart in ms zurück.



  • Weil clock beim Programmstart mit 0 losläuft. Deine Funktion wartet, bis clock den Wert CLOCK_TICKS (oder so) hat, und kehrt dann zurück. clock läuft derweil weiter, aber du wartest immer nur bis CLOCK_TICKS ... logischerweise bricht die Schleife dann sofort ab.

    EDIT: Sorry, kleiner Denkfehler meinerseits. clock arbeitet so, dass eine Sekunde CLOCKS_PER_SEC "Ticks" hat, das müsstest du noch berücksichtigen, sonst wartest du nicht 1000 ms, sondern 1000 Ticks



  • MaSTaH schrieb:

    clock gibt dir die Zeit seit Systemstart in ms zurück.

    Ersetze Systemstart durch Programmstart und ich bin happy.



  • ok danke jetz dürfte das kein problem mehr sein, demnach wäre das die lösung folgende:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <conio.h>
    #include "conio.c"
    
    // Function _delay(n) - stoppt das Programm für n Sekunden.
    double _delay(int msec){
    
         double ismsec=(double)msec/1000; /* rechnet den Integer msec in double um, und dividiert
                                           * das Ergebnis durch 1000
                                           * (z.B: msec=125; ismsec hat nun den double-Wert 0.125)
                                           */
         double counter=(double)clock()/CLOCKS_PER_SEC;
         double c_dummi=counter;
    
         while((counter-c_dummi)<=ismsec){         // hier der edit :))
    
             counter=(double)clock()/CLOCKS_PER_SEC; //definiert einen inkrementiellen milisekunden-counter
         }
    
    }
    
    int main()
    {
    int i=1;
    while(i<11){
        printf("%d. Sekunde!\n",i);
        _delay(1000);
        i++;
    }
    getchar();
    }
    

    :)) danke an alle, und dir basha


Anmelden zum Antworten