我有以下代码:
typedef struct
{
float K[6][3]; //Kalman gain ([row][column])
} FilterData;
void setFilterData(const FilterData *filterdata)
{
FilterData r;
int i;
int i1;
for (i = 0; i < 3; i++) {
for (i1 = 0; i1 < 6; i1++) {
r.K[i1 + 6 * i] = filterdata->K[i + 3 * i1];
}
}
}编译此代码会导致以下错误:
setFilterData.c: In function setFilterData :
setFilterData.c:25:23: error: assignment to expression with array type
r.K[i1 + 6 * i] = filterdata->K[i + 3 * i1];这里的替代方案是什么?
显式地使用memcpy也没有帮助。
FilterData r;
int i;
for (i = 0; i < 6; i++) {
memcpy(r.K + (3*i),filterdata->K + i,sizeof(float) );
memcpy(r.K + (3*i + 1),filterdata->K + (i+6),sizeof(float));
memcpy(r.K + (3*i + 2),filterdata->K + (i+12),sizeof(float));
}发布于 2020-11-27 11:20:46
您的问题是FilterData.K被定义为一个二维数组,但是setFilterData()却把它当作一个一维数组来处理。
最低限度的解决办法是
r.K[i1][i] = filterData.K[i1][i](这假设你的原始代码中的转置是一个错误,而不是一个特性,我必须阅读更多关于卡尔曼增益的知识才能知道)
但没有理由将for循环加倍并单独分配每个成员。你可以
memcpy(&r, filterData, sizeof(r))或者更好
r = *filterData发布于 2020-11-27 11:18:35
r.K是一个二维数组。这意味着r.K[n]是一个长度为3的float数组,不能为数组赋值。例如,问问你自己
int A[5];
A = 6;那就意味着。如果你想在一个二维(或多维)数组中指定一个特定的位置,你必须指定所有的索引。
for (i = 0; i < 3; i++) {
for (i1 = 0; i1 < 6; i1++) {
r.K[i1][i] = ... // I'm not sure what you actually want here.
}
}https://stackoverflow.com/questions/65031622
复制相似问题