私はLeibnizの和をpthreadを使って近似するように並列化しようとしています。私はグラムの最新バージョンでこのコードを実行すると++これらの2つのエラーが表示され、私は本当に理由を理解し、私はこのようなコンパイルしてるいけない:ここに私のコードがある G ++ pi2.cpp -o PI2 -lpthreadg ++エラー 'void *'から 'info *'への無効な変換[-fpermissive]、エラー: '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);
}
Cとは異なり、C++は、あなたは、単にあなたが欲しいものを '' void *型を割り当てることができません。あなたは本当にそれを意味し、それをキャストすることによって恐ろしい間違いをしていないことをコンパイラに伝えなければなりません。 – user4581301