【问题标题】:Create a function pointer which takes a function pointer as an argument创建一个函数指针,它将函数指针作为参数
【发布时间】:2011-02-21 09:10:42
【问题描述】:

我正在尝试创建一个将函数指针作为参数的函数指针,但不知道如何去做...有人建议我尝试对我的一个函数指针进行类型定义,但得到同样的错误。有人可以帮助我正确的语法吗?

    int
186 main(int argc, char **argv)
187 {
188   int             i;

194   typedef int   (*search_alg) (int *, int, int);
195   typedef int   (*search) (search_alg);
196   set_t         (*intersect_alg) (list_t *, (search));
197
198   clo_t          *iopts = parse_args(argc, argv);
199
200   /* select interstion algorithm */
201   switch (iopts->imode) {
202   case SVS:
203     fprintf(stdout, "ALGORITHM : SvS\n");
204     intersect_alg = svs;
205     break;
206   case SEQ:
207     fprintf(stdout, "ALGORITHM : Sequential\n");
208     intersect_alg = sequential;
209     break;
210   case ADP:
211     fprintf(stdout, "ALGORITHM : Adaptive\n");
212     intersect_alg = adaptive;
213     break;
214   default:
215     fprintf(stdout, "ALGORITHM : Unknown\n");
216     return (EXIT_FAILURE);
217   }
218
219   /* select fsearch algorithm */
220   switch (iopts->mode) {
221   case LIN:
222     fprintf(stdout, "F-SEARCH : Linear\n");
223     search = linear_fsearch;
224     break;
225   case BIN:
226     fprintf(stdout, "F-SEARCH : Binary\n");
227     search = binary_fsearch;
228     break;
229   case INP:
230     fprintf(stdout, "F-SEARCH : Interpolation\n");
231     search = interpolation_fsearch;
232     break;
233   case EXP:
234     fprintf(stdout, "F-SEARCH : Exponential\n");
235     search = exponential_fsearch;
236     break;
237   default:
238     fprintf(stdout, "F-SEARCH : Unknown\n");
239     return (EXIT_FAILURE);
240   }
241

244
245   /* perform intersection and run timings */
246   for (i = 0; i < iopts->runs; i++) {
248     /* perform intersect search */
249     intersect_alg (iopts->data_files, search);
252   }

我正在尝试的线路是 249,我最初尝试过

int (*search_alg) (int *, int, int);
set_t (*intersect_alg) (list_t *, (*) (int *, int, int);

如果可能的话,可能更愿意这样做。我得到的错误是:

main.c:204: warning: assignment from incompatible pointer type
main.c:208: warning: assignment from incompatible pointer type
main.c:212: warning: assignment from incompatible pointer type

我指的功能是:

     22   /** Finger Search Operations for array sets **/
 23   int             linear_fsearch(int *set, int len, int key);
 24   int             binary_fsearch(int *set, int len, int key);
 25   int             interpolation_fsearch(int *set, int len, int key);
 26   int             exponential_fsearch(int *set, int len, int key);
 27
 28   /** Intersect Algorithms **/
 29   set_t          *svs(list_t * list, int (*srch_alg) (int *, int, int));
 30   set_t          *sequential(list_t * list, int (*srch_alg) (int *, int, int    ));
 31   set_t          *adaptive(list_t * list, int (*srch_alg) (int *, int, int));

谁能看到我做错了什么?我想不通。 谢谢!

里斯。

【问题讨论】:

    标签: c function pointers function-pointers


    【解决方案1】:

    intersect_alg 需要的声明是

    set_t *(*intersect_alg)(list_t *, int (*)(int *, int, int));
    

    【讨论】:

    • 啊,这似乎奏效了! (没有编译错误)非常感谢。但我不确定我是否理解其背后的逻辑。为什么是额外的星号?
    • 哦,等等,我明白了……太明显了。干杯。
    • 为了创建它,我简单地声明了svs,删除了参数名称并将svs替换为(*intersect_alg)
    • 考虑到这些声明会变得多么混乱,我经常使用typedef 函数指针,以便将这种事情简化为set_t *(*intersect_alg)(list_t*, func_ptr*);。从来没有必要,但我发现它更容易阅读。 YMMV。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2011-02-04
    • 2012-03-07
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多