gpt4 book ai didi

C 相同结构不同尺寸

转载 作者:行者123 更新时间:2023-12-01 04:40:01 25 4
gpt4 key购买 nike

我的问题与此有关: c define arrays in struct with different sizes

但是,我不想使用动态分配(嵌入式目标)。

  • 问题回顾:

C 中,我想要相同结构的两个版本,每个版本的静态 数组大小不同。这两个结构将通过指针参数被相同的函数使用。

    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) 我提出的另一个解决方案是为两个结构设置一个公共(public)头数据部分,不仅包括 isLarge 标志,还包括指向以下静态数组的指针。这有多丑?

(3) 另外,你有我可以使用的好技巧或解决方法吗?

编辑:

  • 更多背景信息:

我的应用程序是在嵌入式 MCU 上寻找路径。

我有几何对象,比如多边形。多边形可以描述简单的矩形障碍物,也可以描述更复杂的形状(例如可达区域)。

复杂的多边形可以有大量的顶点,但数量很少。简单的多边形很常见。

两者都将使用相同的算法。我事先知道哪个多边形需要更多的顶点。

我正在尝试做的是优化工作内存以使其适合 MCU。 (即小形状得到小阵列;复杂的得到大阵列)

最佳答案

想法类似于您已经在问题中提到的(指向数组的指针),但只有一个指针:

typedef struct
{
short array[SIZE_B - SIZE_A];
// more arrays alike...
} Extension;
typedef struct
{
short array[SIZE_A];
//more arrays (all the small ones!)
Extension* extraData;
} doc_t;

如果 extraData 为 NULL,则您有一个小多边形,否则,您会在引用的结构中找到附加数据。承认,遍历大多边形的所有值有点讨厌......

如果您可以为每种对象类型使用预定义大小的全局数组(正如 Dominic Gibson 提出的那样 - 顺便说一下,这是一个很好的建议),您可以通过将 isLarge 标志替换为函数来节省它:

int isLarge(void* ptr)
{
return
(uintptr_t)globalLargeArray <= (uintptr_t)ptr
&&
(uintptr_t)ptr < (uintptr_t)globalLargeArray + sizeof(globalLargeArray);
}

当然,所有 多边形(在上述情况下:至少是大的多边形)必须存在于此数组中才能使其正常工作。如果您动态地或以其他方式在其他地方(堆栈,另一个全局变量)至少创建一个 - 我们就出局了......

关于C 相同结构不同尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43361176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com