5

我正在尝试使用该pthread库来计算可以来自 range的n斐波那契数。当我尝试将我的类型转换为.n0-1000void*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*to进行类型转换,double还是我做错了?

4

3 回答 3

12

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

您可以投射void*double*

double *p = (double *)num;

然后你取消引用它:

double n = *p;

或者在一行中:

double n = *(double *)num;
于 2012-10-03T00:37:37.630 回答
2

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

void *calc_fib( void *num)
{
    double n;
    n = *(double*)num;
    ...
于 2012-10-03T00:35:27.113 回答
1

您不能将 可移植double地转换为指针 - 首先,指针类型可能没有足够的位。

如果 调用后n不改变 in ,则可以将指针传递给变量本身(即,然后使用inside )。mainpthread_createnmain(void*)&n*(double*)numcalc_fib

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

于 2012-10-03T01:06:43.907 回答