Предупреждение gcc в указателе на функцию (несовместимый тип указателя) - PullRequest
1 голос
/ 29 июня 2010

Мне нужна помощь с предупреждением gcc, похоже, я здесь что-то не так делаю

unsigned long convert_syslog(char *date,int year) {
    char withyear[1024];
    struct tm tm;
    time_t epoch = (time_t) NULL;

    snprintf(withyear,sizeof(withyear),"%s %i",date,year);
    if(strptime(withyear,"%b %d %H:%M:%S %Y",&tm)) {
            epoch = mktime(&tm);
            printf("%u\n",epoch);
    }
    return epoch;
}

unsigned long convert_tai64(char *date,int year) {
    char hex[16];
    unsigned long u;
    strcpy(hex,"0x");
    strcat(hex,strndup(date+8,8));
    return strtoul (hex,NULL,16);
}

unsigned long convert_nagios(char *date,int year) {
    return strtoul(date,NULL,10);
}

unsigned long convert_clf(char *date,int year) {
    struct tm tm;
    time_t epoch = (time_t)NULL;

    if(strptime(date,"%d/%b/%Y:%H:%M:%S",&tm)) {
            epoch = mktime(&tm);
    }
    return epoch;
 }




typedef unsigned long (*func)(char *data,int year);

func *convert_date(int pos) {
    switch(pos) {
            case 0: return &convert_syslog;
            case 1: return &convert_tai64;
            case 2: return &convert_clf;
            case 3: return &convert_nagios;
            default: return NULL;
    }
}

выдает мне предупреждения в convert_date

pcre_search.c:57: warning: return from incompatible pointer type  (case 0)  
pcre_search.c:58: warning: return from incompatible pointer type   (...)
pcre_search.c:59: warning: return from incompatible pointer type   (...)
pcre_search.c:60: warning: return from incompatible pointer type   (default)

Ответы [ 2 ]

3 голосов
/ 29 июня 2010

Вы должны вернуть func, а не func*.

1 голос
/ 29 июня 2010

Функция func typedef уже является указателем на функцию, поэтому convert_date можно объявить так:

func convert_date(int pos) { ...

Имена функций (в C) уже являются указателями, поэтому нет необходимости использовать оператор & в операторах возврата.Просто сделайте это:

func convert_date(int pos) {
       switch(pos) {
           case 0: return convert_syslog;
           case 1: return convert_tai64;
           case 2: return convert_clf;
           case 3: return convert_nagios;
           default: return (func)NULL;
       }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...