2017-02-23 5 views
0

저는 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 처음에
+1

C는 달리, void *(*start_routine) (void *) 일치, 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

지금 정확히 그렇게

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

: ap=ap2 - 정보에 *> 공극 *

R =는 pthread_create (보이드 & hilos [I], NULL, (*) 니츠, & 배열 [I]) - > 무효 to void (*)()

pthread_create 세 번째 매개 변수로 함수에 대한 포인터를 가져옵니다.