2017-02-23 25 views
0

私は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); 
} 
+1

Cとは異なり、C++は、あなたは、単にあなたが欲しいものを '' void *型を割り当てることができません。あなたは本当にそれを意味し、それをキャストすることによって恐ろしい間違いをしていないことをコンパイラに伝えなければなりません。 – user4581301

答えて

1

エラー1:「情報*」Cとは異なり

に「無効*」からエラー無効な変換は、C++を使用すると、単にあなたが欲しいものにvoid *を割り当てることができません。コンパイラにあなたが本当にそれを意味していることを伝える必要があります。そして、あなたはそれをキャストすることによって恐ろしい間違いをしているわけではありません。

ので

ap = static_cast<info*>(ap2); 

エラー2:エラー:「void *型()(空)」から「無効*」

全く同じ問題から無効な変換が、ここでは簡単です。 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 - >無効情報へ* *

R =のpthread_create(& hilos [i]は、NULL、(void *型)ライプニッツ、&配列[i])と - > void〜void(*)()

pthread_create第3引数として関数へのポインタを取得します。

関連する問題