Probleme avec la fonction MONOTONIC.

Icey

Membre confirmé
10 Septembre 2009
16
0
Bonjour,
Je débute l'informatique, et je dois compiler un programme que mon professeur m'a donné.
J'ai installé la librairie GTK+ car il y en avait besoin, mais une erreur subsiste :
"CLOCK_MONOTONIC was not declared in this scope"

D'apres ce que j'ai compris, cette fonction appelle des notions lié a Windows ou Linux.
Comment faire pour utiliser le programme, sans modifier le code ?
Bloc de code:
#ifdef _WIN32
#include <windows.h>

_LARGE_INTEGER frequency;
bool frequency_init=false;

double getCurrentTime(){
    if(!frequency_init)
    {
        QueryPerformanceFrequency( &frequency ) ;   
        frequency_init=true;                
    }
    _LARGE_INTEGER tps;
    QueryPerformanceCounter(&tps);
    return (double)tps.QuadPart/(double)frequency.QuadPart;
}
#else // on dira qu'on est sur un systeme POSIX a ce moment la...
#include <time.h> 
double getCurrentTime(){
    struct timespec tps;
    clock_gettime(CLOCK_MONOTONIC, &tps);
    return (double)tps.tv_sec  + (double)tps.tv_nsec / 1000000000.0;
}
#endif
 
Je n'ai jamais utilisé CLOCK_MONOTONIC sur un BDS mais il faut que tu regardes ce que la fonction clock_gettime() implémentée dans OSX supporte. Sur certains système MONOTONIC n'est pas supporté, c'est rare mais ça c'est déjà vu, certains ne supporte que CLOCK_REALTIME. :p :D :D

PS: il semblerait que ce soit le cas et qu'il faille se débrouiller autrement donc tu devras forcément modifier ton code semble-t-il pour utiliser un workaround qui ne remplacera malheureusement pas le vrai MONOTONIC. :p :D :D
 
le voie la plus simple, (tu pourrais te baser sur timespec au lieu des statics qui ne sont pas thread-safe), mais pour ton probleme je pense que cela ira, néanmoins je te laisse implementer CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID qui sont tout a fait emulables sous OSX en utilisant les mach primitives, ajoute cette source dans ton projet

Bloc de code:
gcc -c clock_gettime_stub.c
gcc -c myprogram.c
gcc clock_gettime_stub.o myprogram.o -l libgtk ... -o myProgram

Bloc de code:
//   
//  Copyright Cucurbita. All rights reserved.
//  FreeBSD License
//  clock_gettime_stub.c

#ifdef __APPLE__

#include <AvailabilityMacros.h>

#ifndef MAC_OS_X_VERSION_10_6

#include <sys/time.h>
#include <mach/mach.h>
#include <mach/mach_time.h>
#include <unistd.h>

typedef enum {
    CLOCK_REALTIME,
    CLOCK_MONOTONIC,
    CLOCK_PROCESS_CPUTIME_ID,
    CLOCK_THREAD_CPUTIME_ID
} clockid_t;

static int clock_gettime(clockid_t clk_id __unused, struct timespec *tp __unused) {    
    static long double cv;
    static uint64_t start_time = 0;
    uint64_t now_time;
    now_time = mach_absolute_time();
    if (start_time == 0) {
        mach_timebase_info_data_t tb_info;
        mach_timebase_info(&tb_info);
        cv = ((long double)tb_info.numer) / ((long double)tb_info.denom);
        start_time = now_time;
    } 
    return( (now_time - start_time) * cv / 1000000.0);
}

#endif // MAC_OS_X_VERSION_10_6
#endif // __APPLE__
 
better workaround trouvé

The clock_get_time function returns the current time kept by a clock. The value returned is a monotonically increasing value (unless tampered with via the clock_set_time function).

host_get_clock_service est la chose la plus proche

Bloc de code:
case CLOCK_REALTIME:
              if (0 == (retval = gettimeofday (&tv, NULL)) {
                __CLOCK_GETTIME_TIMEVAL_TO_TIMESPEC(&tv, tp);
            } else {
                errno = EINVAL;
                retval = -1;
            }
          break;

case CLOCK_MONOTONIC:
case CLOCK_PROCESS_CPUTIME_ID: // which represent the CPU-time clock of a given process. (opengroup)
case CLOCK_THREAD_CPUTIME_ID: // which represent the CPU-time clock of a given thread. (opengroup)

clock_get_time et mach_absolute_time balancé  avec pthread et getpid devraient
 faire l'affaire je mettrais a jour quand j'aurais fini de tester
 
  • J’aime
Réactions: [Vezøul]Numerø41
Je said bien que me forms que DES armees de peigne cup qui pensent que l'on apprendre a programmer a l'ecole ca ca nous encore un "Bon" java developeur windows :D c'est pour moi avant tout je touve la question interressante et les solutions proposes merdiques, donc j'ai creuse la question sachant que j'avais déjà bosse avec Mach clock, et en lisant me standard posix ca m'a rappele des trucs ce n'est bien sir pas parfait in syscall serait preferable maid on ne va pas pacher le kernel ici DSL pour l'autocorrection iPhone j'anandonne vraiment de la merde
 
Je said bien que me forms que DES armees de peigne cup qui pensent que l'on apprendre a programmer a l'ecole ca ca nous encore un "Bon" java developeur windows :D c'est pour moi avant tout je touve la question interressante et les solutions proposes merdiques, donc j'ai creuse la question sachant que j'avais déjà bosse avec Mach clock, et en lisant me standard posix ca m'a rappele des trucs ce n'est bien sir pas parfait in syscall serait preferable maid on ne va pas pacher le kernel ici DSL pour l'autocorrection iPhone j'anandonne vraiment de la merde

Mackie sort de ce corps :p :D :D