2012-10-03 37 views
5

我试图使用pthread库来计算n斐波那契数,其中n可以从范围0-1000。当我尝试将我的void*转换为double时,我遇到了一个奇怪的错误。转换无效*翻番

在这里我主要是我的电话给我的计算斐波那契功能:

pthread_create(&tid, &attr, calc_fib, (void *)n); 

在我calc_fib功能我试图与以强制转换:

void *calc_fib(void *num) 
{ 
    double n; 
    n = (double)num; 
    ... 

然而,当我试图做到这一点我收到以下错误:

In function ‘calc_fib’: 
error: pointer value used where a floating point value was expected 
In function ‘main’: 
error: cannot convert to a pointer type 

我不能pecast从void*double C或我只是做错了吗?

回答

11

void *num是一个指针。 double n是一个变量。

你可以施放void*double*

double *p = (double *)num; 

然后你取消对它的引用:

double n = *p; 

或者在同一行:

double n = *(double *)num; 
+0

是的,就是这样。我总是忘记了在不同指针类型之间进行投射的细微之处。 –

2

首先您要将void *转换为double *。然后,您需要取消引用指针以将其分配给double。

void *calc_fib(void *num) 
{ 
    double n; 
    n = *(double*)num; 
    ... 
1

不能可移植性投的double到一个指针 - 一开始,指针类型可能没有足够的位。

如果n将不调用mainpthread_create改变,则可以将指针传递到n变量main本身(即(void*)&n,然后使用*(double*)num内部calc_fib)。

如果n可能会改变 - 也许你已经计算了各种n值来循环到你生成的不同线程的循环 - 那么你必须避免一个竞争条件,即新线程可能没有读取主线程之​​前的值取代它。你可以使用一个互斥体 - 这意味着有一个固定数量的内存需要独立于线程的数量 - 但代码相对冗长,它进一步串行化并减缓启动线程。通常更好的方法是将每个值放入单独的内存地址中。您可以使用具有多个值的阵列,因为您将拥有新线程,或者在堆上为每个内存分配double,然后让线程读取,然后释放该内存....