【问题标题】:A value of type "void *" cannot be assigned to an entity of type "double *"“void *”类型的值不能分配给“double *”类型的实体
【发布时间】:2020-11-09 22:18:53
【问题描述】:

我无法编写一个必须使用梯形方法计算积分的 OpenMP 程序。

编译器对这些行尖叫:

x = calloc(n, sizeof(double));
y = calloc(n, sizeof(double));

错误 - “void *”类型的值不能分配给一个实体 输入“双 *”

我使用的是 Visual Studio 15,是的,我在属性中启用了 OpenMP 支持。

这是程序出现错误的部分:

#define N 4
double start_time, end_time, time;
float f(float x)
{
    return(pow(x, 3));
}
void main() {
    start_time = omp_get_wtime();
    int i, n;  double *x, *y;
    double x0, xn, h, so, ans;
    x0 = 0;
    xn = 2;
    h = 0.1;
    n = (xn - x0) / h;
    if (n % 2 == 1)
    {
        n = n + 1;
    }
    x = calloc(n, sizeof(double));
    y = calloc(n, sizeof(double));

【问题讨论】:

  • 那是 C,你应该使用 x = new double[n];在 C++ 程序中。如果它真的,真的需要零初始化(是吗?)那么你需要一个演员。并且有点担心二进制零也意味着 0.0。好吧,不要为此担心太多,C++ 编译器确实倾向于喜欢 IEEE 754-2008
  • std::vector 可能更适合这里。它会自动为您管理内存。如果您发现自己需要 vector 中的数组,您可以使用 data 方法获得它。
  • 注意:在 C++ 中,您的 main 应该是 int main()(而不是 void)。

标签: c++


【解决方案1】:

错误信息很清楚,解决方法也很简单。您需要在 C++ 中显式转换 calloc 的返回值(与 C 不同)。也就是说,如果你真的需要在 C++ 中使用这种“基于 C”的例程......

    x = static_cast<double*>(calloc(n, sizeof(double)));
    y = static_cast<double*>(calloc(n, sizeof(double)));

【讨论】:

  • 不应该是static_cast吗?
  • @Kevin 是的! (我有点得意忘形了)。
  • 是否有机会在没有 static_cast 的普通 C 中做同样的事情?
  • @coderodde 在 C 中,您不需要演员表:Do I cast the result of malloc?
  • @AdrianMole 我的意思是将 void 指针中的所有位复制到 double 类型的变量。不是双 * a = void*
猜你喜欢
  • 2014-03-23
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 2019-03-27
相关资源
最近更新 更多