【发布时间】:2020-04-10 08:53:18
【问题描述】:
我有一个项目,其中涉及为我公司使用的一些软件编写 C 程序。我希望它尽可能高效,但是软件引用我正在使用的信号的方式有点不稳定。我正在使用 4 组 96 个信号;这些信号分为 32 个组,每组 3 个成员。自动生成的头文件为每个组定义了一组宏(我认为),而不是使用这些信号的通用函数(存在通用函数,但没有关于它们如何工作的文档)。
每个组的定义如下...
typedef struct {
//struct members
} AB_A_Group_A_Network
每个结构都有一组宏(?)定义如下...
void AB_A_Group_ZF_Network_Init(AB_A_Group_A_Network *pAbc)
{
double values[6]
...
pAbc->Member_1 = values[3] //array positions vary
pAbc->Member_2 = values[4]
pAbc->Member_3 = values[5]
}
该软件的技术支持建议我执行以下操作,但我希望有更好的方法来执行此操作。当然这是一个很长的方法,但如果需要,我可以用 python 脚本编写它。这 250 多行代码将在我的应用程序中为每个数据集每秒运行一次。
AB_A_Group_A_Network GroupA;
AB_A_Group_B_Network GroupB;
//...and so on
AB_A_Group_ZF_Network GroupZF;
AB_A_Group_A_Network_Init(&GroupA);
AB_A_Group_B_Network_Init(&GroupB);
//...and so on
AB_A_Group_ZF_Network_Init(&GroupZF);
CD_Array_Set(0,GroupA.Member_1); //a custom array function meant to interface with the software
CD_Array_Set(1,GroupA.Member_2);
//...and so on
CD_Array_Set(95,GroupZF.Member_96);
//...Repeat 3 times for 4 sets of data (Data sets A-D), with checks to see if that data exists
我想过做这样的事情,但我不确定你是否可以以这种方式使用 char 数组。我将添加免责声明,对 C 语言没有太多经验,所以这看起来/听起来真的很愚蠢。这不是工作代码,只是意识流。如果可能的话,我也不确定这样做是否会最终失去效率。我对其他方法完全开放。
char groupName[70] = "AB_*_Group_*_Network";
char dataset = 'A';
char group = 'A';
char member = '1';
char groupInit[70]
//write a loop to increment dataset alphabetically
//check if dataset exists
groupName[3] = dataset;
//write a sub-loop to increment group alphabetically (each set has 32 groups)
groupName[27] = group;
//use groupName in place of struct name (not sure how or if this is possible with my current methods)
groupInit = strncat(groupName, "_Init", 5);
//use groupInit in place of _init macro name
//write a sub-loop to increment member numerically (each group has 3 members)
char member[10] = "Member_*";
member[7] = member;
CD_Array_Set(i,groupName.member);
长方法真的是最好的方法吗?感谢您提供任何建议!
【问题讨论】:
-
您不能从字符串中动态引用变量和类型。这些名称都是在编译时解析的。
-
您可以查看带有标记粘贴的宏,因此您不必重复每个变量声明和初始化的所有公共部分。
-
AB_A_Group_A_Network到AB_A_Group_B_Network到AB_D_Group_ZF_Network等有何不同?typedef和struct你只使用一次似乎很奇怪。一个相同结构的数组(根据需要使用函数指针和unions)可以将问题简化为几个循环。 -
"
CD_Array_Set(95,GroupZF.Member_96);" 与“信号分为 32 个组,每个组 3 个成员”相矛盾。应该是95%3=2,即CD_Array_Set(95,GroupZF.Member_2);? -
@LegendofPedro 他们每个人都几乎完全相同,每个成员在 values[] 中的确切位置有所不同。我的项目中的支持文件是计算机生成的,文件中的结构看起来不像这样;我假设开发人员只是让软件尽可能灵活。结构通常可以很好地放入数组吗?