无法解决如何将函数作为参数传递
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)
我正在尝试传递此函数: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)