2017-02-23 82 views
0

i'm пытаясь распараллелить сумму Лейбница для приближения PI с использованием pthreads. Когда я запускаю этот код с последней версией г ++ появляются эти 2 ошибки и я действительно не понимаю, почему, и я компиляции, как это: г ++ 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); 
} 
+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, & array [i]); – RemedialGuns

+0

@RemedialGuns Durp. Починю. – user4581301

+1

должно быть 'void * leibniz (void * ap2)' –

0

в TjE начала: ap=ap2 -> пустота * к информации *

г = pthread_create (& Hilos [I], NULL, (недействительными *) Лейбниц & массив [I]) - > void to void (*)()

pthread_create получает в качестве третьего параметра указатель на функцию.