将void *转换为double

时间:2012-10-03 00:32:49

标签: c pointers pthreads type-conversion

我正在尝试使用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

我无法在C中从void*转换为double,或者我只是做错了吗?

3 个答案:

答案 0 :(得分:12)

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

您可以将void*投射到double*

double *p = (double *)num;

然后你取消引用它:

double n = *p;

或者在一行中:

double n = *(double *)num;

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

您无法将double移植到指针 - 对于开始,指针类型可能没有足够的位。

如果在调用nmainpthread_create不会更改,则可以在n本身传递指向main变量的指针(即(void*)&n,然后在*(double*)num内使用calc_fib

如果n可能会改变 - 也许你有一个循环计算各种n值以传递给你产生的不同线程 - 那么你必须避免竞争条件,其中新线程可能没有读过之前的值主线程替换它。你可以使用一个互斥量 - 它意味着需要一个固定数量的内存而不管线程数 - 但代码相对冗长,它进一步串行化并减慢了线程的启动速度。通常更好的方法是将每个值放入单独的内存地址中。您可以使用具有与新线程一样多的值的数组,或者为每个double在堆上分配内存然后让线程读取然后释放该内存....