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   Rxr 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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
深入理解访问结构体成员的方法
如果定义是结构体变量,使用 . 运算符访问结构体的成员变量。 如: struct student { char* name; int age; }; struct student stud1; struct student * pstud = &stud1; 访问成员变量age 的方法分别为: 1. stud1.age 2. pstud1->age 3.
C语言struct结构类型定义和结构变量说明
   在实际问题中,一组数据往往具有不同的数据类型。例如, 在学生登记表中,姓名应为字符型;学号可为整型或字符型; 年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。 因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构”。 它相当于其它高级语言中的记录。  “结构”是一种构造类型,它是由
有关结构体的一些题目
1、设有下面的结构体和结构变量定义: struct student { int id; char *name; int math; };关于结构体类型变量赋值正确的是() A、 studl.id=1001; studl.name=”Tom”; B、 id=1001; *studl.name=”Tom”; C、
【Struct(结构体)杂谈之六】无既是有---没有成员变量的Struct(结构体)
没有成员变量的Struct(结构体)        在开始本篇之前,想问大家一个问题:        ---0是什么?        ---呵呵,就是没有呗!        ---那好,这5块钱拿去,就当抵我上次向你借的500块钱。        ---什么?这哪和哪啊!这不一样        ---可是你自己说的, 0就是“没有”。        ----我说不清,反正
请教关于结构体数组的引用出错
定义结构体数组 var.c: struct StructDisData { unsigned int AddrDisData; unsigned int TypeDisChar; unsigned int TypeDisUnit; unsigned char LengthDisData; }; const struct StructDisData StrDisData[254
C/C++ 中访问结构体成员的方法
先看例子:    1#include     2void main(){    3    typedef struct {    4     int int_field;    5     char char_field;    6   } my_struct;    7    m
与struct相关的宏定义(成员变量偏移和获取struct起始地址)
学过C语言的人都知道,我们可以通过struct定义自己的数据集合,从而实现对数据的封装功能。 在实际的项目实践中,struct定义的结构随处可见。使用struct并不难,网上也有很多介绍struct的文章。 从如构定义到如何使用,讲得很详细。在此我就不多讲。 这里主要介绍在struct中如何获取成员变量的偏移以及通过成员变量的地址获取struct的起始地址。 第二个问题是紧密依赖第一个问题
C语言 struct结构体的变量声明加冒号
本文详细介绍了结构体中位域相关使用说明。有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来。
结构体成员的访问(->和 . )
结构体成员的访问(->和 . )
关于C#中 struct使用new 初始化
C#中对于struct我们进行初始化时可以使用new 语句 例如有一个结构体Point struct Point { float  x; float y; } 我们将其实例化时可以使用语句: Point p = new Point(); 这不同于类使用new 语句,我们知道对一个类使用new语句会在托管堆上分配空间,而struct是值类型所以应该在栈上为其分配空间。 实际上,以