C语言——结构体
C語言——結構體
宗旨:技術的學習是有限的,分享的精神是無限的。
1、結構體的作用:個人理解,結構體就是把一堆相關的數據打包成一個結構,使其放在一塊內存區域。——項目之中盡量使用結構體,而不要單獨使用數組。
?
2、結構體的聲明與定義
規范:
(1)如果此結構體在多個文件中使用就放在頭文件中(.h文件中);如果此結構體只在本文件中使用,則放在源文件中(.c文件中),并加以static限定。
(2)如果是用typedef起別名,則以_t作為后綴;如果是用static限定的則不用_t后綴。
typedef __packed struct {uint8_t datetime[6]; // 年月日,時分秒 (BCD) -- 連續駕駛開始/結束時間int16_t altitude; // 海拔int32_t longitude; // 經度int32_t latitude; // 緯度 } gbt19056_fatigue_info_t;// __packed表示一字節對齊,單片機編程中常用 // gbt19056_fatigue_info_t相當于類型名,類似于int,float之類的static struct {rtc_timer_t timer_check;uint16_t attr; // 區域屬性ca8gps_event_data_t event; } t808_area;結構體聲明的時候一定要注意字節對齊的問題,加上__packed為了一字節對齊,否則默認是4字節對齊的。
定義和聲明:定義分配內存,聲明不分配內存。
?
3、結構體的初始化接口
規范:函數名大寫的是對外接口,函數名全小寫加下劃線的是對內接口。
typedef重命名的要先定義一個變量,然后再使用,如下:
gbt19056_fatigue_info_t info1; // 訪問則是info1.altitude = 0x012;
gbt19056_fatigue_info_t *info2; // 訪問則是info2->altitude = 0x012;
static限定的則直接使用,t808_area. attr = 0x55;
一般項目中要寫初始化函數:
void gbt19056_fatigue_init(void) {memset(&info, 0, sizeof(gbt19056_fatigue_info_t));memcpy(info2->datetime, date, sizeof(info2->datetime));info2->altitude = 0;info2->longitude = 0x7FFFFFFF;info2->latitude = 0x7FFFFFFF; }
4、結構體訪問接口
比較大型一點的項目之中,多個文件會用到一些結構中的成員,因此寫成接口形式。
規范:一般少使用全局變量,需要某些值的時候以函數接口形式給予。
uint16_t T808AreaAddr(void) {return t808_area. attr; }void GBT19056FatigueTime(char *data) {memcpy(data, info2->datetime, sizeof(info2->datetime)); }
5、結構體中一些技巧
處理批量類似事情:
// 一個命令字對應一個處理函數,用for循環掃描 // 命令字有的用枚舉, 有的用宏 typedef enum {T808_CUSTOM_CAMERA_COUNT = 1,T808_CUSTOM_DISTANCE_TYPE = 2,T808_CUSTOM_OIL = 3,T808_CUSTOM_VERSION = 4 } t808_t; // 再三強調,起別名的類型一定要加_t后綴以示區分 typedef uint8_t (*handler_t)(char *data, uint8_t length);typedef struct { // 變量類型和函數參數隨機應變uint8_t cmd;uint8_t length;handler_t hander; } t808_custom_entry_t ;static uint8_t t808_custom_camera_count(char *data, uint8_t length); static uint8_t t808_custom_disdance _type(char *data, uint8_t length); static uint8_t t808_custom_oil(char *data, uint8_t length); static uint8_t t808_custom_version(char *data, uint8_t length);//=========================================================== // 定義好結構之后,用數組裝載整個命令及其處理函數 static const t808_custom_entry_t t808_custom_entries[] = {{T808_CUSTOM_CAMERA_COUNT, 1, t808_custom_camera_count},{T808_CUSTOM_DISTANCE_TYPE, 1, t808_custom_disdance _type},{T808_CUSTOM_OIL, 22, t808_custom_oil},{T808_CUSTOM_VERSION, 14, t808_custom_version}, };// 在一個函數中用for循環掃描 static void custom_setting(client_t*client, t808_hdr_t *request, uint16_t length) {t808_custom_entry_t*entry;for(entry = t808_custom_entries; entry->handler; ++entry){if(entry->cmd == request->cmd){entry->handler(data, length); // 只是一個輪廓,僅供參考break;}} }?
總結
- 上一篇: 转:LACP详解
- 下一篇: 人工智能动物识别系统C语言代码,人工智能