无法解决如何将函数作为参数传递

Can't get around to how to pass a function as a parameter

我正在尝试传递此函数:void* checkMatrix(); 作为此函数的参数:void createThreads(void*(*f));.

我在这里读了一篇 post 所以我上面的声明就是这个的结果。

我是这样调用函数的:createThreads(checkMatrix); 但它警告我类型不兼容 [void** 和 void*()]。我可以通过快速转换解决问题,但它不会解决问题。

最后我这样写函数(简单初始化):

void createThreads(void* (*f)) {
    pthread_t* a;
    int i;

    a = (pthread_t*) malloc(*arr.l * sizeof(pthread_t));
    if (a == NULL) {
        fprintf(stderr, "ERROR!\n");
        exit(1);
    }

    for (i = 0; i < *arr.l; i++) {
        if (pthread_create((a + i), NULL, (void*) &f, NULL)) {
            fprintf(stderr, "ERROR IN THREAD CREATION!\n");
            exit(2);
        }
    }

    for (i = 0; i < *arr.l; i++)
        pthread_join(*(a + i), NULL);
}

总而言之,问题是由于内存问题它停止了,但原因是线程的创建,特别是在第三个参数中,我指定了线程将处理的函数。我想我在打电话时做错了什么。我找不到答案,也绕不过去。

感谢您的宝贵时间!

void* (*f) 只是 void **f 加上一组多余的括号。您可能想将其用于参数类型:

void* (*f)()

但是,不是 pthread_create 所期望的。线程的主要功能应该return void* 并接受一个void* 参数。所以你真正想要的可能是这样的:

void createThreads(void* (*f)(void*)) {
  /* ... as before ... */
          if (pthread_create((a + i), NULL, f, NULL)) {
  /* ... as before ... */
}

void* checkMatrix(); 开头的样式已过时,不应使用。其次,pthread 回调函数以void* 作为参数。因此,请改用 void* checkMatrix(void*);

要将其传递给函数,只需执行

void createThreads (void* (*f)(void*))

使用函数指针时的推荐做法是使用 typedef,以提高可读性。例如,您可以制作类似

的内容
typedef void* pthread_callback (void*);

void createThreads (pthread_callback* f)

尝试将函数签名更改为 void createThreads(void* (*f)(void *)) 并将 pthread_create 函数调用更改为 pthread_create((a + i), NULL, f, NULL)