views:

66

answers:

2

what is wrong with the following code?
parseCounter1() and parseCounter1() below are two functions.
I put their pointers in const OptionValueStruct so that
they can be called accordingly when each element of option_values[]
are gone through:

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);  
}  
+3  A: 

You have declared your counter_func member to be a pointer to an int, not a function pointer , while you have something resembling a function pointer declaration in your option values. Here's what you want (assuming your return type is 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..
}
nos
Thanks a lot for the answer
A: 

If you are compiling as C code (as your tag suggests), then you should change the type of option_values[] and option to OptionValueStruct_t. In C++, however, this is OK.

Alternatively, you can eliminate the trailing _t from the custom type name.

ysap
Thanks for the answer. the type of option_values[] is already OptionValueStruct_t andthe type of option is OptionValueStruct_t *. as I show in the original post. do you mean I should use struct OptionValueStruct{...}, then use declaration struct OptionValueStruct option_value[]?
@lilili08 - at the time of writing this comment, the type of the two variables is `const OptionValueStruct` and not `const OptionValueStruct_t`. However, `OptionValueStruct` is the **tag** of the struct definition and not the name of the custom type (at the `typedef` statement). In C, a struct tag is NOT a new type. In C++, though, it is. Now, the tag and the custom type name can be the same, so you can remove the `_t` characters from the `typedef` statement and have the newly defined type to be `OptionValueStruct` so you can use it in further variable declarations.
ysap
@lilili08 - If you are using the Visual C++, most probably the compilation is done as C++ code, so the compiler does not warn you about this. You can change the `Project Properties`/`Configuration Properties`/`C/C++`/`Advanced`/`Compile As` to `Compile as C code` so you know for sure you are C compliant.
ysap