【问题标题】:Convert void* to double将 void* 转换为双精度
【发布时间】:2012-09-23 21:39:26
【问题描述】:

我正在尝试使用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 还是我做错了?

【问题讨论】:

    标签: c pointers pthreads type-conversion


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      您可以将void* 转换为double*

      double *p = (double *)num;
      

      然后你取消引用它:

      double n = *p;
      

      或者在一行中:

      double n = *(double *)num;
      

      【讨论】:

      • 是的,就是这样。我总是忘记在不同指针类型之间进行转换的微妙之处。
      【解决方案3】:

      您无法将 double 移植到指针 - 首先,指针类型可能没有足够的位。

      如果在调用pthread_createmain 中的n 不会改变,则可以在main 本身中传递一个指向n 变量的指针(即(void*)&n,然后在里面使用*(double*)num calc_fib)。

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

      【讨论】:

        猜你喜欢
        • 2015-09-13
        • 2010-10-16
        • 2021-09-12
        • 2019-02-24
        • 2011-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-11
        相关资源
        最近更新 更多