2024.4.15每日收穫之變數賦初值

小智001發表於2024-04-15

今天組長臨下班前給了個新任務,讓我去消除程式碼測評中的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;

相關文章