【问题标题】:How can I fill a Structure with values quickly?如何快速用值填充结构?
【发布时间】:2015-10-15 13:52:19
【问题描述】:

我正在使用带有标准 C 的 Visual Studios 2013。

我的程序需要四行 {"Analysis 1", "AN 1", 0, 0.0667}Fach[0]

我不想浪费这么多行来填充这个数组。

有没有更好的方法将这四行合二为一?

#define _CRT_SECURE_NO_WARNINGS
#include "header.h"
#include <stdio.h>
#include <string.h>

struct sFach
{
    char Mod[40];       //Modulbezeichnung
    char Ab[5];         //Abkürtzung
    int Note;           //Note
    double Gew;         //Gewichtungsfaktor
};

int main()
{
    struct sFach Fach[31];

    strcpy(Fach[0].Mod, "Analysis 1");
    strcpy(Fach[0].Ab, "AN 1");
    Fach[0].Note = 0;
    Fach[0].Gew = 0.0667;

    strcpy(Fach[1].Mod, "Algebra");
    strcpy(Fach[1].Ab, "AL");
    Fach[1].Note = 0;
    Fach[1].Gew = 0.0889;

    return 0;
}

【问题讨论】:

  • 使代码可读且易于维护;不浪费代码行。
  • 代码行数如何相关?如果你想用 4 个成员填充一个结构,你必须写 4 行来完成它。即使你能想出办法不这样做,那又有什么用呢?
  • 使用复合文字或带有指定初始化器的初始化器。
  • 这样的数据不应该来自文件而不是在程序中硬编码吗?
  • 然后创建一个将 4 个值传入的函数,并让该函数执行 strcpy 和赋值。但它并没有让它“更快”。

标签: c arrays structure


【解决方案1】:

你可以在定义的时候初始化整个数组:

struct sFach Fach[] = {
    {"Analysis 1",      "AN1",  0,  0.0667},
    {"Algebra",         "AL",   0,  0.0889},
    {"Kunst 1",         "K1",   0,  0.1},
    {"Kunst 2",         "K2",   0,  0.1},
    {"Kunst 3",         "K3",   0,  0.1},
    {"Heimatkunde",     "HK",   0,  0.05},
    ...
};

外大括号表示数组。如果初始化数组,则可以省略维度;否则剩余的数组条目为零。

内大括号表示结构。如果您觉得冗长,可以使用 Jack 向您展示的指定初始化程序。

如果要在初始化后分配整个结构,则必须使用 Basile 所示的复合字面量。

【讨论】:

  • 我也会推荐这个选项,因为它是迄今为止最易读的。
【解决方案2】:

在 C99 中,您指定了初始化程序,也指定了复合初始化程序(但我不记得它们是扩展还是标准支持):

struct sFach
{
    char Mod[40];       //Modulbezeichnung
    char Ab[5];         //Abkürtzung
    int Note;           //Note
    double Gew;         //Gewichtungsfaktor
};

int main()
{
    struct sFach foo = { .Mod = "foo", .Ab = "bar", .Note = 10, .Gew = 10.0 };   
    struct sFach foo2 = { "foo", "bar", 10, 10.0 }; 
    return 0;
}

【讨论】:

  • 但请注意,这不一定比原始代码更好。我个人觉得这有点难读,主要是因为单行格式。在我看来,将初始化列表分成 4 行会提高可读性。
  • 我个人觉得这很易读,所以品味就是品味。除此之外,我只是回答了他的要求。他有脑子,他能选择适合他的东西,我们不应该评判品味,只提供解决方案。例如,就个人而言,struct 的大写字段没有任何意义。
【解决方案3】:

使用最近的(符合 C11 的)编译器,您可以尝试:

Fach[0] = (struct sFach){"Analysis 1","AN 1",0,0.667};

等下一个条目...

(优化编译器会使代码非常高效)

另一种可能性是编写一些脚本(例如,在GNU awk、Python 等中),它会解析一些数据文件并(从该数据文件)生成一些包含上述行的 initialize_Fach.inc 文件,只需在您的 C 代码中添加 #include "initialize_Gach.inc" 即可。当然,您需要修改构建过程(例如,改进您的 Makefile 或一些 Microsoft .vproj 的东西)。

不要忘记 C 代码,特别是初始化代码,可以由其他东西生成。

【讨论】:

    猜你喜欢
    • 2011-03-13
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    相关资源
    最近更新 更多