1

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);  
}  

2 Answers 2

10

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..
}
Sign up to request clarification or add additional context in comments.

2 Comments

Is the colon (instead of semicolon) at the end of int (counter_func)(char, char**) a typo? or some special syntax?
No it was a typo
0

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.

3 Comments

Thanks for the answer. the type of option_values[] is already OptionValueStruct_t and the 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.
@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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.