鱼C论坛

 找回密码
 立即注册
查看: 4285|回复: 8

c语言中,如何比较两个结构体是否有相同的成员变量

[复制链接]
发表于 2019-9-10 13:58:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
麻烦各位,请教一个问题

现在有2个结构体,A和B,分别如下:

Struct {
     UINT8 Var1;
     UINT8 Var2;
     UINT8 Var3;
     ...
  }A;

Struct {
     UINT8 Var1;
     UINT8 Var2;
     UINT8 Var3;
     UINT8 Var4;
     ...
  }B;

通过什么方法才能知道: 结构体A和结构体B 有相同的成员变量 Var1、 Var2、 Var3(换句话说就是,已经两个结构体A和B,如何知道他们之间的成员变量是否有交集)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-10 14:48:50 | 显示全部楼层
A的成员变量是固定的,B的成员变量是动态的,这一次是Var1、Var2、Var3和Var4,下一次也许就是Var1和Var2。之前有想过,通过将变量名转化为字符串后再进行对比,但是这种方法有一个局限性,就是一旦B的成员变量名多一个字符,或者少一个字符(比如变成Var11或Va1),那这种通过匹配字符串的方式就不行了(对于程序升级来说,Var1和Var11或Va1来说,是用做同一个用途的),所以求助广大网友,看看还有没有别的方式可以知道结构体A和结构体B 有相同的成员变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-10 15:50:55 | 显示全部楼层
        很可笑的问题,A  .  Var1 = 0 , B . Var8 = 0  这两个成员算不算有交集,请问,楼主?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-10 17:57:02 | 显示全部楼层
jackz007 发表于 2019-9-10 15:50
很可笑的问题,A  .  Var1 = 0 , B . Var8 = 0  这两个成员算不算有交集,请问,楼主?

不算,要的是成员变量一样,或者相似,跟具体的数值没关系
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-10 18:12:26 | 显示全部楼层
jackz007 发表于 2019-9-10 15:50
很可笑的问题,A  .  Var1 = 0 , B . Var8 = 0  这两个成员算不算有交集,请问,楼主?

假如A.var1用作一个flag标志位去if判断,升级程序后,B.va11 有同样的作用,那var1和va11就可以理解为同一个成员变量,所以,不知道用什么方法判定A.var1和B.va11是同一个成员变量。之前想过通过把var1转化为“var1”,但是有局限性,一旦B里面不是var1(比如变成va11),那转化字符串这个方法就不适用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-10 19:29:01 | 显示全部楼层
不是个省油的灯 发表于 2019-9-10 18:12
假如A.var1用作一个flag标志位去if判断,升级程序后,B.va11 有同样的作用,那var1和va11就可以理解为同 ...

        如果程序是你在写,哪个成员怎么使用还不是你在规划和安排,何须这样猜测?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-11 09:20:55 | 显示全部楼层
jackz007 发表于 2019-9-10 19:29
如果程序是你在写,哪个成员怎么使用还不是你在规划和安排,何须这样猜测?

程序不是我在写,实际的项目中,新旧程序可能会有不同的人来做,成员变量名会有细微的差别,毕竟是不同的人来写来维护,结构体多一个变量少一个变量,成员变量名多个字母少个字母,这情况是有可能出现的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-11 16:49:04 | 显示全部楼层
我也不是很懂,变量名只是相当于助记符,编译之后都是些地址,交集是指 值还是地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-11 18:42:39 | 显示全部楼层
本帖最后由 不是个省油的灯 于 2019-9-11 19:25 编辑
flamer 发表于 2019-9-11 16:49
我也不是很懂,变量名只是相当于助记符,编译之后都是些地址,交集是指 值还是地址


举个例子,比如APP软件程序升级,旧程序只支持一个用户登录,然后有个结构体
StructA{
UINT32 UserID;
}
用UserID来存放用户名ID(身份证号,手机号什么的)

现在升级APP,新程序支持多个用户登录,然后有个结构体
StructB{
UINT32 UserIDOne;
UINT32 UserIDTwo;
......
}
(我要用UserIDOne来存放旧程序的UserID)

对于我自己一个用户来说,我希望APP升级后,自动获取到旧程序的ID,不需要我自己手动输入,那我是不是要取得StructA.UserID的数据,然后赋值给StructB.UserIDOne,这样升级程序后,用户就不再需要输入ID了。那么问题来了,我怎么知道StructA.UserID要赋值给StructB.UserIDOne,而不是赋值给StructB.UserIDTwo?。

如果结构体换成
StructB{
UINT32 UserIDTwo;
UINT32 UserIDOne;
......
}呢?

所以我的问题就是,如何把StructA.UserID和StructB.UserIDOne对应起来?或者说怎么去匹配StructA.UserID和StructB.UserIDOne?

因为项目中有上万个文件,所以有大量的结构体和大量的成员变量,我不可能在新程序中用到哪个成员变量就把旧程序的取出来再赋值,现在是有办法可以一次性获取到新旧程序的成员变量,所以想在某个地方写一个函数,一次性的去匹配然后新旧成员变量赋值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-4 09:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表