如何初始化包含多个元素中的唯一项的结构

我有4个数组代表:

  1. 颜色(r,g,b,y)
  2. 形状(A,B,C,D)
  3. 数字(1,2,3,4)
  4. 纹理(a,b,c,d)

并且每个数组也可以有4个值。 我希望在数组中包含所有这些元素的所有可能组合。 例如rA1a,rB1a,rC1a等。 我正在考虑创建一个结构,然后以某种方式创建这256个结构元素。 但是我完全不知道如何做到这一点 – 我的意思是创建256个元素 ! 有人可以指出我正确的方向吗?

我想的结构是这样的,但结构可能不是我需要的结构? 接下来我打算做的是随机选择这些256个元素中的一些,并将选中的元素放入2d数组中以进一步操作它们。 但首先要做的事情!

typedef struct { char colour; char shape; char nr; char texture; }ST1; 

该解决方案建立在每个元素有四种可能性的想法之上。 如果我们得到2位来表示每个元素,则可以使用位域结构,并且作为8位值,256个值表示所有可能性。 为了使初始化更容易,我把它们放在一个union

而不是使用项目描述本身,而是留给输出翻译。

如果你想更直接地使用它们,你可以设置enum ,如enum colours { col_r, col_g, col_b, col_y }等。

请注意,描述符'b'在问题语句中重复。

 #include  #include  #include  typedef union { unsigned char val; struct { unsigned char colour: 2; unsigned char shape: 2; unsigned char nr: 2; unsigned char texture: 2; } bits; } ST1; const char colch [4] = { 'r', 'g', 'b', 'y' }; // descriptions const char shpch [4] = { 'A', 'B', 'C', 'D' }; const char numch [4] = { '1', '2', '3', '4' }; const char texch [4] = { 'a', 'b', 'c', 'd' }; void show(ST1 rec) { printf("%c%c%c%c\n", colch[rec.bits.colour], shpch[rec.bits.shape], numch[rec.bits.nr], texch[rec.bits.texture]); } int main(void) { ST1 feature[256]; int i; for(i = 0; i < 256; i++) { feature[i].val = i; // initiliase all perms } srand((unsigned)time(NULL)); for(i = 0; i < 5; i++) { show(feature[ rand() % 256 ]); } } 

节目输出:

 rD4a
 bC4d
 RB2C
 bB4b
 BD3A

首先,在C中,如果要将结构作为ST1访问,则需要像下面这样定义它:

 typedef struct ST1 { char colour; char shape; char nr; char texture; } ST1; 

其次,这是一个很好的方法。 但您可能更喜欢使用枚举来获取颜色,形状,数量和纹理的值。 定义这样的枚举:

 enum colour_t { COLOUR_R, COLOUR_G, COLOUR_B, COLOUR_Y }; 

并像这样使用它:

 enum colour_t c = COLOUR_R; 

在回应您的评论时,我认为没有必要实例化所有256种可能性,而是根据需要创建它们。 像这样:

 ST1 MakeST1FromOrdinal(char n) { ST1 retval; retval.colour = n & 0x03; retval.shape = (n & 0x0C) >> 2; retval.nr = (n & 0x30) >> 4; retval.texture = (n & 0xC0) >> 6; return retval; } void main() { char ordinal = random() % 256; ST1 randomResult = MakeST1FromOrdinal(ordinal); } 

你可以采取一系列structure ! 这样做:

  struct abc { char colour; char shape; char nr; char texture; } ST1[256]; 

如果要访问第5个数组的shape ,请写入: ST1[4].shape

你可以采用一系列结构并使用位操作来减小尺寸:

 struct abc { int colour : 2; int shape : 2; int number : 2; int texture : 2; } S[256]; 

因为每个变量只有4个值,每个变量只有2位就足够了。

您可以使用(。)运算符或结构指针( – >)运算符使用结构时以正常方式访问它们。