2017-02-23 269 views
0

i'm试图将莱布尼兹的总和并行化,以使用pthread来逼近PI。当我运行这段代码相克的最新版本++这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); 
} 
在TJE开始
+1

不像C,C++不会让你只需要给'无效*'你想要的任何东西。你必须告诉编译器你确实是这个意思,并且你没有通过强制转换来犯一个可怕的错误。 – user4581301

回答

1

错误1:从“无效*”错误无效转换到“信息*”

与C,C++不会让你简单地分配给void *任何你想要的。你必须告诉编译器你确实是这个意思,并且你没有通过强制转换来犯一个可怕的错误。

所以

ap = static_cast<info*>(ap2); 

错误2:错误:从“无效*”到“无效*()(无效)”

完全相同的问题无效的转换,但在这里更容易。 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]); 
+0

它的工作,但与此变化r = pthread_create(&hilos [i],NULL,&leibniz,&数组[i]); – RemedialGuns

+0

@RemedialGuns Durp。将解决。 – user4581301

+1

应该是'void * leibniz(void * ap2)' –

0

ap=ap2 - >无效*到信息*

R =在pthread_create(& hilos [I],NULL,(无效*)莱布尼茨,&阵列[I]) - >空洞 void(*)()

pthread_create获取第三个参数指向函数的指针。

相关问题