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

时间:2016-12-22 17:11:53

标签: c structure

我有4个数组代表:

  1. 颜色(r,g,b,y)
  2. 形状(A,B,C,D)
  3. 号码(1,2,3,4)
  4. 纹理(a,b,c,d)
  5. 并且每个数组也可以有4个值。 我希望在数组中包含所有这些元素的所有可能组合。 例如rA1a,rB1a,rC1a等。 我正在考虑创建一个结构,然后以某种方式创建这256个结构元素。 然而我完全不知道如何做到这一点 - 我的意思是创建256个元素!有人可以指点我正确的方向吗?

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

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

4 个答案:

答案 0 :(得分:1)

首先,在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);
}

答案 1 :(得分:1)

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

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

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

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

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

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

答案 2 :(得分:0)

您可以使用structure个数组!就这样做:

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

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

答案 3 :(得分:0)

您可以采用一系列结构并使用位操作来缩小尺寸: -

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

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

您可以使用(。)运算符或结构指针( - &gt;)运算符使用结构,以正常方式访问它们。