【发布时间】:2017-09-07 17:46:45
【问题描述】:
我的问题与此有关: c define arrays in struct with different sizes
但是,我不想使用动态分配(嵌入式目标)。
- 问题回顾:
在 C 中,我想要两个版本的相同结构,每个版本的 static 数组都有不同的大小。 两个结构都将通过指针参数被相同的函数使用。
typedef struct {
short isLarge; //set 0 at initialization
short array[SIZE_A];
//more arrays
} doc_t;
typedef struct {
short isLarge; //set 1 at initialization
short array[SIZE_B];
//more arrays
} doc_large_t;
void function( doc_t* document ) {
if ( document->isLarge ) {
//change document into doc_large_t* [1]
}
//common code for both doc_t and doc_large_t
}
- 问题:
(1) 上面的描述需要一种将指针doc_t*指针动态转换为doc_large_t*文档[1]的方法。那可能吗 ?怎么样?
(2) 我提出的另一个解决方案是为这两个结构提供一个通用的标头数据部分,不仅包括 isLarge 标志,还包括指向以下静态数组的指针。有多丑?
(3) 另外,您有什么好的技巧或解决方法吗?
编辑:
- 更多上下文:
我的应用程序是嵌入式 MCU 上的路径查找。
我有几何对象,例如多边形。多边形可以描述简单的矩形障碍物,也可以描述更复杂的形状(例如可到达的区域)。
复杂的多边形可以有大量的顶点,但数量很少。简单的多边形很常见。
两者都将使用相同的算法。 我提前知道哪个多边形需要更多的顶点。
我正在尝试做的是优化工作内存以使其适合 MCU。 (即小形状得到小数组;复杂的得到大数组)
【问题讨论】:
-
您可能想查看类似这个答案的内容,似乎您想用 c 中的结构做一些多态的事情(能够将不同的对象类型传递给同一个函数)stackoverflow.com/a/18422235/7299836
-
对于选项 2,您应该有足够行的矩阵来为固件上的所有结构提供数组,因此 UB 就在拐角处...
-
如果
SIZE_A和SIZE_B(我想)不同,使用c,你不能“转换”值,你必须编写一个转换函数。这意味着您必须为每种情况预先声明 2 个结构... -
顺便说一句,这似乎是XY problem。你想达到什么目标?描述您的目标并告诉我们所有限制条件。
-
您更喜欢如何分配这些结构?使用灵活的数组成员做你想做的事情相对简单,但是在使用
malloc()et al 的动态分配之外使用它并不容易。
标签: c arrays pointers embedded structure