由其成员选择随机结构

时间:2017-01-05 15:04:29

标签: c arrays pointers struct c99

我必须在C中为一个教育软件项目建模周期表(它基本上是一个测验)。

我已经创建了一个结构并声明了所有元素。现在我必须编写一个随机选择一个元素的函数。

这是我的结构:

typedef struct{
        char name[15];
        char shortname[3];
        int group;
        int period;
}element;
element hydrogen={"hydrogen", "H", 1, 1}, helium={"Helium", "He", ...

我已经尝试将它们组合在一个数组中,然后生成一个随机索引:

element elements[118];
elements[1] = {"hydrogen", "H", 1, 1};

但这只是给了我错误:(

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

这种方法应该有效。 设置一个结构数组,然后取index = rand()%118。你设置结构列表的语法就是问题所在。尝试

public mutating func round(_ rule: FloatingPointRoundingRule) {
    switch rule {
    case .toNearestOrAwayFromZero:
        _value = Builtin.int_round_FPIEEE${bits}(_value)
    case .toNearestOrEven:
        _value = Builtin.int_rint_FPIEEE${bits}(_value)
    case .towardZero:
        _value = Builtin.int_trunc_FPIEEE${bits}(_value)
    case .awayFromZero:
        if sign == .minus {
            _value = Builtin.int_floor_FPIEEE${bits}(_value)
        }
        else {
            _value = Builtin.int_ceil_FPIEEE${bits}(_value)
        }
    case .up:
        _value = Builtin.int_ceil_FPIEEE${bits}(_value)
    case .down:
        _value = Builtin.int_floor_FPIEEE${bits}(_value)
    }
}

答案 1 :(得分:0)

您可以使用指定的初始值设定项:

element elements[118] =
{
  [0] = {"hydrogen", "H", 1, 1},
  [1] = {"helium", 18, 1},
  ...
};

更好的是,你可以摆脱"魔术数字"使用枚举:

typedef enum
{
  ELEMENT_H,
  ELEMENT_He,
  ELEMENT_Li,
  ...

  NUMBER_OF_ELEMENTS
} element_t;

element elements[] =
{
  [ELEMENT_H]  = {"hydrogen", "H", 1, 1},
  [ELEMENT_He] = {"helium", 18, 1},
  ...
};

_Static_assert(sizeof(elements)/sizeof(elements[0]) ==  NUMBER_OF_ELEMENTS, 
               "Missing elements!");

虽然请注意,与周期表不同,这将是零索引。因此,您要打印周期表编号,打印时必须使用+1。 (或者你可以在数组的开头留下一个垃圾项,但这是一个草率的编程。)

答案 2 :(得分:-4)

您在C名称空间内使用C ++ =运算符心态。那是你的错。你在命名空间“C”。

C中不存在

:: =运算符,它隐式地将所有成员元素从一个复制到另一个。

相反,您必须逐元素地显式复制所有成员。

所以:

strncpy (elements[1].name, "hydrogen", strlen("hydrogen"));
strncpy (elements[1].shortname, "H", strlen("H"));
elements[1].group =  1;
elements[1].period = 1;

将是正确的方法。内联函数或#define可以让以后更容易执行和忘记。