저는 pthread를 사용하여 Leibniz의 합계를 PI와 근사하게 평행하게하려고합니다. 내가 g의 최신 버전이 코드를 실행하면 ++이이 오류가 나타나고 난 정말 이유를 이해 해달라고, 나는 다음과 같이 컴파일 해요 : g ++ pi2.cpp -o PI2 -lpthread 여기 g ++ 오류가 'void *'에서 'info *'로 잘못 변환되었습니다. 오류 : 'void *'에서 'void * (void)'로의 변환이 잘못되었습니다 [-fpermissive]
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);
}
tje 처음에
C는 달리,
void *(*start_routine) (void *)
일치, C++은 단순히 당신이 원하는 무엇이든에''무효 * 할당 할 수 없습니다. 당신은 컴파일러에게 당신이 정말로 그것을 의미하고 당신이 그것을 캐스팅함으로써 끔찍한 실수를 범하지 않는다고 말해야합니다. – user4581301