g ++错误从'void *'无效转换为'info *'[-fpermissive],错误:无效转换为'void *'到'void *(*)(void *)'[-fpermissive]

时间:2017-02-23 04:59:20

标签: c++ casting compiler-errors g++ pthreads

我正在尝试将Leibniz的总和并行化,以使用pthreads来近似PI。当我使用最新版本的g ++运行此代码时出现这两个错误,我真的不明白为什么,我正在编译这样: g ++ pi2.cpp -o pi2 -lpthread

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);
}

2 个答案:

答案 0 :(得分:1)

错误1:错误无效转换为'void *'到'info *'

与C不同,C ++不允许您简单地将void *分配给您想要的任何内容。你必须告诉编译器你真正的意思,并且你不会通过施放它而犯下一个可怕的错误。

所以

ap = static_cast<info*>(ap2);

错误2:错误:无效转换为'void *'到'void *()(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]);

答案 1 :(得分:0)

in tje begin:ap=ap2 - &gt; void * to info *

r = pthread_create(&amp; hilos [i],NULL,(void *) leibniz,&amp; array [i]) - &gt; void to void(*)()

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