Proßzeß beenden und Zeit messen



  • --------------------------------------------------------------------------------
    Hallo zusammen,

    a)Wie kann ich in C die CPU Zeit starten/beenden und ausgeben lassen?

    b) wie baut man am besten in C eine "sollbruchstelle ein", so das z.b. bei falschen eingaben nicht nur ein definiertes fenster ausgeben wird, sondern auch das Programm sofort beendet wird. (bei fehlerhafte eingabe gibt der compiler bisher nur ein warning debug error fenster automatisch aus)

    danke schön

    m.



  • Die einzige in den Standard-Bibliotheken definierte Funktion ist time(), gibt aktuelle Zeit seit (guck nach wann) in Sekunden zurück.

    Ansonsten mußt du halt im OS nachsehen...

    Für eine "Sollbruchstelle" - so du dir den sofortigen Programmabbruch leisten kannst, ein "aufgebohrtes assert:

    void rassert_impl(int condition, char * conditionText, char * msg, char * file, int line)
    {
      if (condition != 0)
        return;
    
      printf("ASSERT FAILED: [%s] at %s(%i) %s\n",
              conditionText ? conditionText : "",
              file ? file : "", line,
              msg ? msg : "");
      exit(-1);  // terminate app
    }
    
    #define RAssert(cond) rassert_impl((cond), #cond, NULL, __FILE__, __LINE__)
    #define RAssertE(cond, msg) rassert_impl((cond), #cond, (msg), __FILE__, __LINE__)
    
    // usage:
    int Foo(int * pPointerThaMustBeAllocatedbCallerOrBadThingsWillHappen)
    {
      RAssert(pPointerThaMustBeAllocatedbCallerOrBadThingsWillHappen != NULL);
    
      // oder auch
      RAssertE(pPointerThaMustBeAllocatedbCallerOrBadThingsWillHappen != NULL, "Ey! Keine Null-Zeiger bitte!");
    
      // ...
    
    }
    


  • irgendwie habe ich den code nicht verstanden.
    Bei einer falschen Eingabe von var soll er z.b. abbrechen.

    vor dem main habe ich dies vereinbart;

    void rassert_impl(int condition, char * conditionText, char * msg, char * file, int line);

    #define RAssert(cond) rassert_impl((cond), #cond, NULL, __FILE__, __LINE__)
    #define RAssertE(cond, msg) rassert_impl((cond), #cond, (msg), __FILE__, __LINE__)

    Im Hauptprogramm folgt dann:

    printf("Eingabe Wert:");
    scanf("%i",&var);
    RAssert(var!= NULL);

    es passiert aber nichts. Wie kann ich die Fkt. rassert_impl sinnvoll aufrufen.
    Verstehe das mit dem define nich*g*.
    Gruß m.



  • Naja, der Quellcode ist unter vorbehalt von Fehlern 😉

    Hast du mal mit dem Debugger nachvollzogen, was passiert?? ist var wirklich == 0? usw.



  • also ich möchte es jetzt mit #error machen.

    #if var==0 //beliebige Bedingung
    #error fehlermeldung
    #endif

    int var;

    void main(){
    printf("Eingabe Wert:");
    scanf("%i",&var);}

    anscheinend habe ich das mit den Makros noch nicht verstanden. Wie erreiche ich mit #error, das wenn var 0 eingegeben wird, der Präprozessor abbricht und entsprechend fehlermeldung ausgibt.



  • anscheinend habe ich das mit den Makros noch nicht verstanden

    richtig 😉

    Der Präprozessor läuft vor der eigentlichen Kompilierung, und erlaubt mehr oder weniger nur textersatz und das ein/ausblenden von bestimmten textabschnitten.

    der Wert von val ist ja aber erst zur Laufzeit bekannt.

    Gib doch vor dem RAssert mal den Wert von val und von 'val!=NULL' aus.



  • Hier ist mal der ganze Quelltext,
    a)Fehlermeldung : exit nicht deklarierter Bezeichner. warum?
    b) könntest du mal ein beispiel angeben, wo einfach nur eine Eingabe überprüft wird?

    #include<iostream.h>
    #include<stdio.h>

    #define RAssert(cond) rassert_impl((cond), #cond, NULL, __FILE__, __LINE__)
    #define RAssertE(cond, msg) rassert_impl((cond), #cond, (msg), __FILE__, __LINE__)

    void rassert_impl(int condition, char * conditionText, char * msg, char * file, int line);

    int var;

    void main(){
    printf("Wert:");
    scanf("%i \n",&var);

    RAssert(var!= NULL); };

    void rassert_impl(int condition, char * conditionText, char * msg, char * file, int line)
    {
    if (condition != 0)
    return;

    printf("ASSERT FAILED: [%s] at %s(%i) %s\n",
    conditionText ? conditionText : "",
    file ? file : "", line,
    msg ? msg : "");
    exit(-1); // terminate app
    }



  • exit nicht deklarierter Bezeichner. warum?

    #inclue <stdlib.h>

    steht in der MSDN 😉

    Ich würde ein Assert nicht für eine Eingabeüberprüfung verwenden (es sei denn, das teil ist strikt nur für mich)

    ansonsten war dein ursprünglicher code schon ok.



  • peterchen schrieb:

    ansonsten war dein ursprünglicher code schon ok.

    sicher? Was wenn der Benutzer "Alle lieben scanf" eingibt?`
    Ist dann die Eingabe = NULL ?

    [edit]
    fragen über fragen..
    was wenn der Benutzer -1 oder 0
    eingeben möchte? Auch dies wären gültige Int-Werte...
    [/edit]



  • sicher? Was wenn der Benutzer "Alle lieben scanf" eingibt

    IIRC ja.

    (Allerdings solltest du auf 0 vergleichen - NULL nimmt man eigentlich nur für NULL-Zeiger)

    ja was hättest du denn gern als "gültige" Werte?



  • peterchen schrieb:

    IIRC ja.
    (Allerdings solltest du auf 0 vergleichen - NULL nimmt man eigentlich nur für NULL-Zeiger)

    Den NULL-Irrtum habe ich absichtlich weggelassen.. sonst müsste man z.B.
    "void main" auch noch ankreiden u.s.w.....

    Und was das "!= 0" angeht... rate welcher Wert "var" hat, wenn der Anwender
    beim Code

    int var = 42; 
    scanf("%i \n",&var);
    

    z.B. "zeigwiescanffunzt" eingibt ....



  • Nö, ratespiele spiel ich nicht.. 😉

    Icmuß zugeben, hab scanf so nie benutzt. selber einlesen und umwandeln macht schlank 😉


Log in to reply