如何实现可变长度的异构结构序列

时间:2016-12-04 19:26:52

标签: c data-structures

有两种不同大小的结构:

struct A{
    int x, y, z;
};

struct B{
    float x, y;
};

在运行时,程序会生成这两个结构的一系列实例。

手写的例子可能如下:

Struct A a0 = { ... };
Struct A a1 = { ... };
Struct B b0 = { ... };
Struct A a2 = { ... };
Struct B b1 = { ... };
Struct B b2 = { ... };

因此,在这种情况下,“序列”是a0, a1, b0, a2, b1, b2

我想将此序列“放置”到某个数据结构中。 (完整序列的长度仅在运行时已知,以及struct Astruct B的每个实例的外观顺序。)

最简单的方法是什么?

例如,在Python中,我会做类似的事情:

Class A:
    def __init__(self, x, y, z):
        self.x, self.y, self.z = x, y, z

Class B:
    def __init__(self, x, y):
        self.x, self.y = x, y

# Manual example
a0 = A(...)
a1 = A(...)
b0 = B(...)
a2 = A(...)
b1 = B(...)
b2 = B(...)

my_list = []

# The list gets updated as the program runs
my_list.append(a0)
my_list.append(a1)
my_list.append(b0)
my_list.append(a2)
my_list.append(b1)
my_list.append(b2)
# etc., etc.

如何在C中执行等效操作?

1 个答案:

答案 0 :(得分:1)

使用指针可以使异构数组成为可能。

typedef struct A {
    int x;
    int y;
    int z;
}*PA;

typedef struct B {
    float x;
    float y;
}*PB;

void main() {
    void * Instance[2];
    A a;
    B b;

    Instance[0] = &a;
    Instance[1] = &b;

    ((PA)(Instance[0]))->x = 2;
}

但是现在你可以有任何类型提出一个问题,你怎么知道在任何给定的索引中你应该知道什么类型?如果您决定只启动允许的编目类型,那么为什么不使用联合呢?