我的问题与此有关:
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)我附带的另一个解决方案是为这两种结构都具有一个公共的头数据部分,不仅包括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 - C相同结构不同尺寸,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43361176/

10-12 15:04
查看更多