我正在尝试将Leibniz的总和并行化,以使用pthreads来近似PI。当我使用最新版本的g ++运行此代码时出现这两个错误,我真的不明白为什么,我正在编译这样: g ++ pi2.cpp -o pi2 -lpthread
error invalid conversion from ‘void*’ to ‘info*’ [-fpermissive]
error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’ [-fpermissive]
这是我的代码:
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define top 1000000000
struct info
{
int inicio;
int fin;
double pi;
};
int leibniz(void *ap2){
struct info *ap;
int start, end, i;
ap = ap2;
start = ap -> inicio;
end = ap -> fin;
double x = 0.0;
double deno = 2*start + 1.0;
double nume = 1.0;
int diff = end - start;
for (i = 0; i < diff; ++i)
{
x += nume/deno;
deno += 2;
nume = -nume;
}
ap -> pi = x*4.0;
}
int main(int argc, char const *argv[])
{
int i, cont, rango;
double pi;
int numHilos = 2;
char *check = "";
if (argc >= 2)
{
numHilos = (int)strtol(argv[1], &check, 10);
if (strcmp("", check) != 0)
{
printf("Entrada invalida\n");
}
}
rango = top/numHilos;
cont = 0;
struct info array[numHilos];
for (i = 0; i < numHilos; ++i)
{
array[i].inicio = cont;
array[i].fin = rango;
cont = rango;
rango = rango + (top/numHilos);
}
pthread_t hilos[numHilos];
int r, j, *retval;
for (i = 0; i < numHilos; ++i)
{
r = pthread_create(&hilos[i], NULL, (void *)*leibniz, (void *)&array[i]);
if (r != 0)
{
perror("Error al crear el hilo");
exit(-1);
}
}
for (j = 0; j < numHilos; ++j)
{
r = pthread_join(hilos[j], (void **)&retval);
}
for (i = 0; i < numHilos; ++i)
{
pi = pi + array[i].pi;
}
printf("pi: %2.12f \n", pi);
}
答案 0 :(得分:1)
错误1:错误无效转换为'void *'到'info *'
与C不同,C ++不允许您简单地将void *
分配给您想要的任何内容。你必须告诉编译器你真正的意思,并且你不会通过施放它而犯下一个可怕的错误。
所以
ap = static_cast<info*>(ap2);
错误2:错误:无效转换为'void *'到'void *()(void )'
完全相同的问题,但在这里它更容易。 pthread_create
expects void *(*start_routine) (void *)
,而不是void *
因此,一旦你修复了一个甚至还没有看到的更糟糕的错误,int leibniz(void *ap2)
声称要返回int
但是从来没有导致形成病态程序,所有的铸造困境都消失了。
int leibniz(void *ap2)
变为
void* leibniz(void *ap2)
并且必须返回一些东西。你不在乎什么,所以放置
return NULL;
在功能结束时。
leibniz
现在完全匹配void *(*start_routine) (void *)
,所以
r = pthread_create(&hilos[i], NULL, &leibniz, &array[i]);
答案 1 :(得分:0)
in tje begin:ap=ap2
- &gt; void * to info *
r = pthread_create(&amp; hilos [i],NULL,(void *) leibniz,&amp; array [i]) - &gt; void to void(*)()
pthread_create获取第三个参数指向函数的指针。