有没有办法使用for循环访问结构的成员? 我的程序为每个成员运行多个命令。除了每次更改成员外,命令都是相同的。
struct data
{
int recordID;
int idNumber;
char firstName[100];
char lastName[100];
int dateOfBirth;
char grade[2];
};
#define ACCOUNTS 100
struct data rec[ACCOUNTS];
我希望像
这样的东西const char *FIELDID[][6] =
{
{"recordID", "idNumber", "firstName", "lastName", "dateOfBirth", "grade"},
{"something else", "something else", "something else", "something else", "something else", "something else"},
{"something else", "something else", "something else", "something else", "something else", "something else"}
};
并致电
rec[count].FEILDID[0][0] = value;
答案 0 :(得分:3)
不,C中没有这样的支持。
意识到"设置"所需的实际代码值的变化与要设置的值的类型以及变量名在运行时不存在有关。
可以通过自己添加必要的元数据来完成,但它不会非常简单,当然/如果结构发生变化,则需要维护。
答案 1 :(得分:1)
这在C中是不可能的。在编译之后,每个变量仅由内存地址引用,并且不存储变量名。
答案 2 :(得分:0)
希望这段代码能回答你的问题......如果我理解你的问题
#include<stdio.h>
#include<string.h>
typedef struct Vehicle
{
int wheels;
char vname[20];
char color[10];
}Vehicles;
int main(){
Vehicles v[2];
v[0].wheels = 4;
strcpy(v[0].vname, "dsvdf");
strcpy(v[0].color, "bfdvsidvbi");
v[1].wheels = 4;
strcpy(v[1].vname, "dsvdf");
strcpy(v[1].color, "bfdvvfbdfsidvbi");
int i;
for ( i = 0; i < 2; ++i){
printf("Vehicle No of Wheels : %d\n",v[i].wheels);
printf("Vehicle Name : %s\n",v[i].vname) ;
printf("Vehicle Color : %s\n",v[i].color)
}
return(0);
}
答案 3 :(得分:0)
您可以使用函数指针来完成。由于C是强类型的,你仍然必须分别处理不同类型的字段。
示例:
/* setInt_type is a type for function pointers to a function that takes a struct data*, and an int as parameters and returns int */
typedef int (*)(struct data*, int) setInt_type;
/* Setter function, need one for each int field */
int setAccountIdNumber(struct data *account, int newValue) {
return account->idNumber = newValue;
}
int setAccountDateOfBirth(struct data *account, int newValue) {
return account->dateOfBirth = newValue;
}
/* Function that can operate on any int field */
int setAccountIntField(struct data *account, int newValue, setInt_type setField) {
setField(account, newValue);
}
然后你可以创建一个函数指针数组:
const setInt_type INT_FIELDS[] = { setAccountIdNumber, setAccountDateOfBirth }
最后在一个程序中使用它:
int main() {
setAccountIntField(&rec[3], 43, setAccountIdNumber); // Assigns 43 to rec[3].idNumber
setAccountIntField(&rec[3], 43, setAccountDateOfBirth); // Assigns 43 to rec[3].dateOfBirth
// or, using INT_FIELDS:
setAccountIntField(&rec[3], 43, INT_FIELDS[1]); // Assigns 43 to rec[3].dateOfBirth
return 0
}
正如你所看到的,它并不像人们想的那么整洁。