C 相同结构不同尺寸

标签 c arrays pointers embedded structure

我的问题与此有关: 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/

相关文章:

c - libexpect 程序在 CentOS7 上使用 SEGV 立即崩溃,在 CentOS6 上没有发生

objective-c - 每次将对象添加到队列或堆栈时是否都需要创建对象的新实例? Objective-C

c - 如何为二维 float 组重新分配内存?

c - 结构体可以包含的成员数量或变量类型是否有大小限制?

python - 如何将 Keras Sequential CNN 的训练数据转换为正确的张量形状?

arrays - 在go中创建异构json数组

c++ - 将 Vector * 转换为 char *

c++ - 从 vector 的元素成员方法插入 vector 元素 destroys *this

c - 绑定(bind)()错误: Cannot assign requested address

c++ - 在一行中初始化 STL valarray