首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组类型“.Copying [3]”在C中不是可赋值的浮点型二维数组

数组类型“.Copying [3]”在C中不是可赋值的浮点型二维数组
EN

Stack Overflow用户
提问于 2020-11-27 11:10:00
回答 2查看 531关注 0票数 0

我有以下代码:

代码语言:javascript
复制
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];
    }
  }
}

编译此代码会导致以下错误:

代码语言:javascript
复制
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也没有帮助。

代码语言:javascript
复制
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));
  
 }
EN

回答 2

Stack Overflow用户

发布于 2020-11-27 11:20:46

您的问题是FilterData.K被定义为一个二维数组,但是setFilterData()却把它当作一个一维数组来处理。

最低限度的解决办法是

代码语言:javascript
复制
r.K[i1][i] = filterData.K[i1][i]

(这假设你的原始代码中的转置是一个错误,而不是一个特性,我必须阅读更多关于卡尔曼增益的知识才能知道)

但没有理由将for循环加倍并单独分配每个成员。你可以

代码语言:javascript
复制
memcpy(&r, filterData, sizeof(r))

或者更好

代码语言:javascript
复制
r = *filterData
票数 3
EN

Stack Overflow用户

发布于 2020-11-27 11:18:35

r.K是一个二维数组。这意味着r.K[n]是一个长度为3的float数组,不能为数组赋值。例如,问问你自己

代码语言:javascript
复制
int A[5];
A = 6;

那就意味着。如果你想在一个二维(或多维)数组中指定一个特定的位置,你必须指定所有的索引。

代码语言:javascript
复制
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.
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65031622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档