【问题标题】:Write values to a 3D array inside a struct in C将值写入 C 结构内的 3D 数组
【发布时间】:2021-10-05 20:12:47
【问题描述】:

我一直在用 C 语言编写一个执行 2D 卷积的函数,为此我需要向它导入三个不同的 3D 数组。所以我宣布,例如:

typedef struct {
    float img[6][6][1];
} input_6_t;

现在我需要将值写入结构。稍后我会将它作为指针传递给将进行卷积的函数。

我试过了:

input_6_t test_image;
test_image.img = { {1,2,3,4,5,6} , {2,1,1,1,2,2} , {3,1,1,1,2,2} , {4,1,1,1,2,2} , {5,2,2,2,2,2} , {6,2,2,2,2,2} };

但它返回一个语法错误。这样做的正确方法是什么?

提前谢谢你。

【问题讨论】:

  • 对,我刚注意到,让我编辑帖子
  • 将数组包装成结构使得可以制作非衰减数组。但是,将其传递给函数或按值返回需要制作副本,在这种情况下成本非常。你确定你真的需要它吗?
  • 我尝试将一个三维指针传递给函数,但它似乎不起作用。我看到的唯一选择是序列化 3d 数组以传递它,然后反序列化它,但这会占用大量资源。我认为在这个例子中我只会将数组的指针传递给函数,而不是复制它。
  • 通常最好使用指向多维数组的指针,C99 中的可变长度数组大大简化了它。考虑在单独的问题中发布原始问题

标签: c multidimensional-array


【解决方案1】:

你需要稍微调整一下初始化器:

input_224_t test_image = {
  .img = { {1,2,3,4,5,6} , ..., {6,2,2,2,2,2} }
};

尽管编译时可能会出现关于missing braces around initializer 的警告。

为了避免它: 在每个标量周围添加大括号(有点麻烦):

input_224_t test_image = {
  .img = { {{1},{2},{3},{4},{5},{6}} , ..., {{6},{2},{2},{2},{2},{2}} }
};

或从img 成员类型中删除最后一个[1] 维度:

typedef struct {
    float img[6][6];
} input_6_t;

【讨论】:

  • 该语法似乎适用于声明,谢谢。后来当我将它导入卷积函数时,当我使用test_image[0][0][0] = 3; 之类的东西时出现错误,这也是不正确的语法吗?
  • @Ricardo,你需要使用test_image.img[0][0][0] = 3;
  • 这似乎对我不起作用。我在卷积中使用的具体示例是:P.img[a][b][k] += N.img[ii][jj][p] * M.img[m][n][k];,其中 P、N 和 M 是不同的结构,格式相同但维度不同。所有其他变量都是在此之前的 for 链中使用的索引。
  • @Ricardo,添加有关原始问题的更多详细信息。使用数组作为结构成员并不是处理多维数组的最佳方式。
  • 我会照你说的做,就更大的问题写一个不同的问题。非常感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多