最近在做故障保护试验,其中涉及到故障存储。逻辑是只要有新故障就存储一次,否则忽略。为了达到目的,我设计了两个结构体pre和current,开始认为代码应该如下,但是结构体内变量太多,如果逐个进行比较的话,可读性有太差,甚是苦恼。
if((pre!=current)||(current!=0))
{
EEP_WR();
pre = current;
}struct Student
{
int age;
double height;
};
struct s1 = { 12,26.5};
struct s2 = { 23,28.9};
struct *p1 = &s1;
struct *p2 = &s2;比较方法:
1,元素的话,一个个比咯:if(p1->age==p2->age)...有一个元素不等,即是两个实例不相等!
2,指针直接比较,如果保存的是同一个实例地址,则(p1==p2)为真!( 强力推荐哦 )第一种方法是被逼无奈的方法,尝试第二种。其中提到了“实例地址”,百度告诉我说这个是C++中类引用相关的概念,能使两个结构体中的地址相等。在C中没有这个概念。但是我也不死心,想进行了尝试,代码如下
typedef struct
{
int age;
double height;
}Student;
Student s1, s2;
Student *p1, *p2;
LED0 = 0;
s1.age = 15;
s1.height = 1600;
s2.age = 15;
s2.height = 1600;
// *p1 = s1;
// *p2 = s2;
p1 = &s1;
p2 = &s2;
while (1)
{
if (p1 != p2)
{
LED0 = 1;
delay_ms(10);
}
else
{
LED0 = 0;
delay_ms(10);
}
}需要注意*p1=s1是不能用的,因为s1并不代表结构体的地址。在实际的仿真过程中,在p1和和p2内存放的是s1和s2的地址,这两个地址是无论如何也不会相等的,所以尝试失败。
但还是不能让咱死心,百度又告诉我可以采取memcmp()函数的方式,主要是可以通过把结构体当做字符来出来,逐个比较数组地址中的所有字节。这个函数在<string.h>的标准库中。
这个函数可用来比较字符串、数组,但是比较结构体仍然不可行。经研究,结构体在声明开辟内存的时候会默认地址对地,当结构体中涉及不同数据类型,默认地址对齐后,那些未使用的内存中数值不确定,所以不能用来比较。
综上所述,还是老老实实的进行第一组逐个比较吧,VC还确实比较基础。
版权声明:本文为niushijia007原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。