错误赋值给数组类型的表达式

Posted

技术标签:

【中文标题】错误赋值给数组类型的表达式【英文标题】:error assignment to expression with array type 【发布时间】:2019-03-20 07:49:27 【问题描述】:

我有一个名为 unpack 的函数,编译 C++ 代码会导致几个错误。代码如下:

static void unpack(void *v, ekf_t *ekf, int n, int m) 
    /* skip over n, m in data structure */
    char *cptr = (char *) v;
    cptr += 2 * sizeof(int);

    double *dptr = (double *) cptr;
    ekf->x = dptr;
    dptr += n;
    ekf->P = dptr;
    dptr += n * n;
    ekf->Q = dptr;
    dptr += n * n;
    ekf->R = dptr;
    dptr += m * m;
    ekf->G = dptr;
    dptr += n * m;
    ekf->F = dptr;
    dptr += n * n;
    ekf->H = dptr;
    dptr += m * n;
    ekf->Ht = dptr;
    dptr += n * m;
    ekf->Ft = dptr;
    dptr += n * n;
    ekf->Pp = dptr;
    dptr += n * n;
    ekf->fx = dptr;
    dptr += n;
    ekf->hx = dptr;
    dptr += m;
    ekf->tmp0 = dptr;
    dptr += n * n;
    ekf->tmp1 = dptr;
    dptr += n * m;
    ekf->tmp2 = dptr;
    dptr += m * n;
    ekf->tmp3 = dptr;
    dptr += m * m;
    ekf->tmp4 = dptr;
    dptr += m * m;
    ekf->tmp5 = dptr;

我得到这些错误传播到代码的每一行:

.../src/ekf.c:203:12: error: assignment to expression with array type
     ekf->x = dptr;
            ^
.../src/ekf.c:205:12: error: assignment to expression with array type
     ekf->P = dptr;

需要注意的是,代码unpack 是从C 库中获取的。我尝试过使用extern,但这似乎不太好用。现在,当我make 原始存储库(https://github.com/simondlevy/TinyEKF)时,它似乎编译没有问题。包含并使用此代码的 TinyEKF 的编译命令是:

gcc -Wall -I. -I../../src -o gps_ekf gps_ekf.c ../../src/tiny_ekf.c -lm

这可以在存储库的/extras/c/ 中找到,并且肯定使用unpack 函数。

【问题讨论】:

请提供类/结构ekf_t的定义。 只需将其编译为 C,而不是 C++ - 当然,您仍然可以将其与您的 C++ 代码链接。 确保xP 中的字段类型ekf_t 指向双精度double * 所有这些成员都是数组,你不能分配给数组。拿起一本好的初学者书籍。 不是minimal reproducible example... 【参考方案1】:

根据this,ekf.xdouble x[] 类型。正如错误所说,您不能只分配给ekf->x = dptr; 之类的数组。如果要将dptr的数据复制到ekf->x,可以使用memcpy

memcpy(&ekf->x, dptr, sizeof(ekf->x));

所有其他分配也是如此,其中大部分字段是double 数组。

【讨论】:

这是我不明白的。如果它适用于存储库中给出的示例,我只是在我的程序中重新创建整个相同的东西。它不应该工作吗? 我相信它们也将是原始代码中的数组,被分配给一个双精度数。这就是我感到困惑的原因。 这发生在哪个示例文件中?看看会很有趣。 如果你查看 /extras/c,有一个 GPS 示例使用它并且不会出现错误。 它编译,现在检查它是否以我们想要的方式运行。

以上是关于错误赋值给数组类型的表达式的主要内容,如果未能解决你的问题,请参考以下文章

为什么将短变量赋值给Integer引用会产生编译时错误?

Java赋值的错误

分配给具有数组类型的表达式并请求非结构或联合中的成员[关闭]

在C语言中赋值运算符有啥作用?

以前的笔记迁移__数组

以前的笔记迁移__数组