2010-06-29 3 views
1

мне нужна помощь с предупреждением ССАГПЗ, похоже, им делать что-то здесь не таккуб.см, указатель на функцию (несовместимый тип указателя)

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) 

ответ

3

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

1

FUNC ЬурейеЕ уже указатель на функцию, так 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; 
     } 
    } 
Смежные вопросы