C 相同结构不同尺寸

2024-04-24

我的问题与此相关:c 在struct中定义不同大小的数组 https://stackoverflow.com/questions/17956697/c-define-arrays-in-struct-with-different-sizes

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

  • 问题回顾:

In 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) 另外,你有我可以使用的好技巧或解决方法吗?

EDIT :

  • 更多背景:

我的应用程序是在嵌入式 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,则您有一个小多边形,否则,您会在引用的结构中找到附加数据。承认,迭代大多边形的所有值有点令人讨厌......

If you can为每个对象类型使用预定义大小的全局数组(正如多米尼克·吉布森(Dominic Gibson)提出的那样 - 顺便说一句,这是一个很好的提议),您可以通过将 isLarge 标志替换为函数来节省 isLarge 标志:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 相同结构不同尺寸 的相关文章

随机推荐