gpt4 book ai didi

c++ - g++ 错误从 ‘void*’ 到 ‘info*’ 的无效转换 [-fpermissive],错误 : invalid conversion from ‘void*’ to ‘void* (*)(void*)’ [-fpermissive]

转载 作者:行者123 更新时间:2023-11-28 05:17:06 28 4
gpt4 key购买 nike

我正在尝试使用 pthreads 将 Leibniz 的总和并行化以近似 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);
}

最佳答案

错误一:错误从‘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]);

关于c++ - g++ 错误从 ‘void*’ 到 ‘info*’ 的无效转换 [-fpermissive],错误 : invalid conversion from ‘void*’ to ‘void* (*)(void*)’ [-fpermissive],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42407390/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com