今天组长临下班前给了个新任务,让我去消除代码测评中的5D警告,5D指的是Procedure contain UR data flow anomalies,翻译过来就是存在UR(变量未赋初值就使用)数据流异常。这个警告其实是测评网址的问题,未赋初值,但是在单片机清ram时,已经对存放在ram中所有的全局变量清零了,只是没有在代码中写出来,就报了这个警告。
因此我只需要把所有用到的全局变量在main函数开头进行清零即可,遇到了之前写过的问题,定义与声明之间重定义问题(定义并赋初值只能一次,声明可以多次且不能赋初值),我们之前把常量全放在一个.h文件里,定义并声明为全局变量,对extern进行宏定义,只在main函数中定义,其它调用该头文件只进行声明。如下所示
main.c
#include<demo.h>
#define MAIN_C
Ramextern unsigned char flag=0;
//这里等价于unsigned char flag=0;定义并赋初值0
demo.h
#ifdef MAIN_C
#define Ramextern
#else
#define Ramextern extern
Ramextern unsigned char flag;
//这里等价于extern unsigned char flag;
demo.c
#include<demo.h>
Ramextern unsigned char **flag=0**;
//这里会报错,声明不能赋值
今天还学到了如何对联合(union)类型的数据进行赋初值,不能直接等于0,需要加大括号{0};同时上网查阅资料了解到联合体和结构提的区别,联合体变量共用内存,更省空间;而结构体变量为独立内存
如:
union name
{
unsigned char a
unsigned int b
}name1
这里定义了一个联合体类型的数据name1,如果我对name1进行赋初值时,需要这样做,name1={0}
;此时的a=0,b=0(共用存储空间);首先对联合体数据的第一个变量赋初值;
typedef union
{
unsigned char a
unsigned int b
}name
name name1;
//与上面的union等价
typedef是为现有的类型起一个别名,使使用起来更加的方便,注意一点,它并没有产生新的类型。
如
typedef int Beet
Beet a;
//等价于int a;