2 dlx gd727 dlx_gd727 于 2016.01.13 13:19 提问

关于结构struct变量访问?

关于结构struct变量访问?两个问题
1.两个不同结构中有部分相同的变量,
typedef struct Code {
char symbol[8];

char name[32]; //中文名
int date_st;

short int id;

}CodeS;
typedef struct Code {
char symbol[8];

char name[32]; //中文名
int age;
int num;
int date_st;

short int id;

}CodeSver2;
有没有访问变量名或者指针将前一个结构的变量复制到第二个结构中,而不是一个一个的赋值拷贝,
由于自编程序经常升级一个一个的赋值转换实在太繁琐。
2.结构数组排序,结构的变量非常多,需要对不同的变量将数组排序,能否有一个通用的比较函数,通过序号或变量名访问
结构变量
之前的办法是针对每一个变量写一个比较函数
//按id排序
bool QS_comp_id(CodeSver2 a,CodeSver2 b)
{
return (a.id<=b.id);
}
共有几十个比较函数
求高人指教

6个回答

CSDNXIAOD
CSDNXIAOD   2016.01.13 13:21

内联汇编访问类或结构的private 成员变量
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

enpterexpress
enpterexpress   2016.01.13 13:23

写个排序类,然后继承就行了,何必那么麻烦呢

qq_27183003
qq_27183003   Ds   Rxr 2016.01.13 14:04

1、把两个结构体相同变量在定义时顺序相同,然后用memcpy将第1个变量内容,拷贝到第2个变量中。
2、用qsort函数排序,但是比较函数还是要自己写的。

dlx_gd727
dlx_gd727   2016.01.13 14:31

谢谢ysuwood
1.两个结构变量有增有减,顺序也不完全相同,有时候连续的多个变量可以用memcpy,有通用的方法就好了。
2.排序函数已经是通用的了,比较函数没办法通用,主要是变量的访问,

fk002008
fk002008   2016.01.13 14:53

你是用的C语言,好多面向对象的特性实现起来比较麻烦。
1--第一个问题这个需要辅助数组来进行。
a.首先你要将结构体的变量名字存入对应的数组中。name1[] ,name2[]
b.将这个结构体中各个成员在结构体中的偏移位置再做成数组。注意是偏移量,第一个成员是0,第二个成员地址是第一个
成员的大小sizeof可以获取。依次类推,这个去嗖嗖就有。 offset1[], offset2[]
c.通过name1[]和name2[]得到相同变量名的各自index 做成数组index1[]和index2[] ,分别存放各自在结构体中的index
index1和index2的长度一样
d.循环这个index1,(此处先暂定这个index1[i]角标对应的变量在结构体1中的类型是 Ti)
那么结构体1中index1[i]这个变量就是
Ti numi = (Ti)((char*)&CodeS + offset1[i]);
你看我们同样可以获取结构体2种该变量的地址
(Ti*)((char*)&CodeServ2 + offset2[i])

            这样就可以赋值了。
        对于这个Ti的处理你还要设置2个数组来放这个成员变量的类型字符串。
        然后根据index1[i]取出这个字符串然后依次判断是char,int的时候分别返回
         (char*)((char*)&CodeServ2 + offset2[i])
         (int*)((char*)&CodeServ2 + offset2[i])
        等等

2--第二个问题
在第一个问题的基础上我们已经知道如何根据名字或index来获取一个结构体中变量的值
这个时候你还是要象你以前那样写出各个类型的比较函数
然后你效仿那个Ti的获取方式一样根据当前变量类型的字符串来调用相应的比较函数

希望对你有帮助。

fk002008
fk002008   2016.01.13 14:56

补充
有一处写错了
错误写法
Ti numi = (Ti)((char*)&CodeS + offset1[i]);

正确写法
Ti numi = (Ti)((char)&CodeS + offset1[i]);

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!