2010-08-09 11 views
0

에 정의 된 함수에 대한 포인터를 호출하는 방법 다음 코드에 무엇이 잘못 되었습니까?
아래의 parseCounter1() 및 parseCounter1()은 두 가지 기능입니다.
나는 그래서 const OptionValueStruct에서 자신의 포인터를 넣어 그
option_values의 각 요소는 []
통해 사라 졌어요 때 그에 따라 호출 할 수 있습니다 : 당신은 선언 한typedef struct

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

답변

7

당신의 counter_func 회원의 int에 대한 포인터가 될 , 함수 포인터가 아니며 함수 포인터 선언과 비슷한 것을 가지고있는 동안 option values. 다음은

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

답변을 많이 주셔서 감사합니다 – user399517

+0

int (* counter_func) (char *, char **) 오타가 콜론 (세미콜론 대신)에 있습니까? 또는 일부 특수 구문? – Nathan

+0

아니 오타되었습니다 – nos

0

당신이 (당신의 태그에서 알 수 있듯이) C 코드로 컴파일하는 경우, 당신은 OptionValueStruct_toption_values[]option의 유형을 변경해야합니다 (당신의 반환 유형을 가정하는 것은 INT가) 원하는입니다. 그러나 C++에서는 괜찮습니다.

또는 사용자 지정 형식 이름에서 후행 _t을 제거 할 수 있습니다.

+0

답변 주셔서 감사합니다. option_values ​​[] 유형은 이미 OptionValueStruct_t이고 옵션 유형은 OptionValueStruct_t *입니다. 내가 원래의 게시물 에 표시합니다. 당신은 구조체 OptionValueStruct {...}을 사용해야한다는 것을 의미합니까? 다음 OptionValueStruct option_value []를 사용하여 선언 구조체를 사용합니까? – user399517

+0

@ lilili08 -이 주석을 쓰는 시점에서 두 변수의 유형은'const OptionValueStruct_t'가 아니라'const OptionValueStruct'입니다. 그러나,'OptionValueStruct'는 구조체 정의의 ** tag **이며, (typedef' 문에) 커스텀 타입의 이름이 아닙니다. C에서 struct 태그는 새로운 유형이 아닙니다. C++에서는 그렇습니다. 이제 태그와 사용자 정의 유형 이름이 같을 수 있으므로'typedef' 문에서'_t' 문자를 제거하고 새로 정의 된 유형을'OptionValueStruct'로 설정하여 추가 변수 선언에 사용할 수 있습니다. – ysap

+0

@ lilili08 - Visual C++를 사용하는 경우 대부분 컴파일이 C++ 코드로 수행되므로 컴파일러에서 이에 대해 경고하지 않습니다. 'Project Properties' /'Configuration Properties' /'C/C++'/'Advanced' /'Compile As'를'C code as Compile '로 바꿀 수 있습니다. – ysap