Как вызвать указатель на функцию, определенную в структуре typedef - PullRequest
1 голос
/ 10 августа 2010

что не так со следующим кодом?
parseCounter1 () и parseCounter1 () ниже две функции.
Я поместил их указатели в const OptionValueStruct, чтобы
они могли вызываться соответственно, когда каждый элементзначения option_values ​​[]
пройдены:

typedef struct OptionValueStruct{  
    char counter_name[OPTION_LINE_SIZE];  
    int* counter_func;  
} OptionValueStruct_t;  

const OptionValueStruct option_values[] = {    
    {"Counter1", (*parseCounter1)(char*, char**)},  
    {"Counter2", (*parseCounter2)(char*, char**)},  
   };  

const OptionValueStruct *option = NULL;

for(int i = 0; i< sizeof(option_values)/sizeof(OptionValueStruct_t); i++){
    option = option_values + i ;  
    result = option->counter_func(opt_name, opt_val);  
}  

Ответы [ 2 ]

8 голосов
/ 10 августа 2010

Вы объявили, что ваш член counter_func является указателем на int, а не указателем на функцию, в то время как у вас есть что-то похожее на объявление указателя на функцию в вашем option values.Вот что вы хотите (при условии, что вы возвращаете тип int)

typedef struct OptionValueStruct{
  char counter_name[OPTION_LINE_SIZE];
  int (*counter_func)(char*, char**);
} OptionValueStruct_t;

const OptionValueStruct_t option_values[] = {
  {"Counter1", parseCounter1},
  {"Counter2", parseCounter2},
};

for(int i = 0; i< sizeof(option_values)/sizeof(OptionValueStruct_t); i++){
  result = option_values[i]->counter_func(opt_name, opt_val); 
  // don't know what you relly want to do with result further on..
}
0 голосов
/ 10 августа 2010

Если вы компилируете как код C (как подсказывает ваш тег), вам следует изменить тип option_values[] и option на OptionValueStruct_t. Однако в C ++ это нормально.

В качестве альтернативы вы можете исключить завершающий _t из имени пользовательского типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...