如何快速用值填充结构?
How can I fill a Structure with values quickly?
我正在使用带有标准 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;
}
在 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;
}
使用最新的(符合 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 代码,特别是用于初始化的代码,可以由其他东西生成。
您可以在定义时初始化整个数组:
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 所示。
我正在使用带有标准 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;
}
在 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;
}
使用最新的(符合 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 代码,特别是用于初始化的代码,可以由其他东西生成。
您可以在定义时初始化整个数组:
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 所示。