標(biāo)題: C語(yǔ)言的模塊化編程的再次總結(jié) [打印本頁(yè)]
作者: liuyy 時(shí)間: 2015-1-12 19:25
標(biāo)題: C語(yǔ)言的模塊化編程的再次總結(jié)
假如要設(shè)計(jì)一個(gè)系統(tǒng),包含多個(gè)功能模塊,比如,數(shù)碼管顯示,射頻模塊,或是液晶屏顯示模塊、按鍵、溫度檢測(cè)模塊、超聲波測(cè)距模塊、紅外線收發(fā)模塊,而單片機(jī)又涉及到,端口定義,定時(shí)器,PWM,EEPROM,軟件延時(shí),相信代碼量肯定小不了。當(dāng)把這些功能代碼放在一起是,你就會(huì)發(fā)現(xiàn)程序的調(diào)試查錯(cuò)將會(huì)是一件多么頭疼的事,自己都會(huì)把自己搞暈。怎么辦,按照功能劃分成不同的模塊。進(jìn)行模塊化編程是很好的解決辦法。
可以一個(gè)模塊一個(gè)模塊的進(jìn)行加載,加載一個(gè)編譯一次,這樣就很容易進(jìn)行查錯(cuò)。同時(shí)要修改的位置也很好確定。但是在進(jìn)行模塊化編程的常出現(xiàn)錯(cuò)誤的地方是數(shù)據(jù)類型的定義和程序段之間的數(shù)據(jù)的傳遞與調(diào)用。下面就這個(gè)問題重點(diǎn)的說一下。
1、根據(jù)不同的模塊制作頭文件
防重復(fù)包含
#ifndef __XXX_H__
#define __XXX_H__
#endif
在編寫頭文件時(shí),可能要定義一些數(shù)據(jù),如果是使用unsigned int 或unsigned char這樣定義的,編譯時(shí)不會(huì)出現(xiàn)什么問題。
如果是使用已經(jīng)進(jìn)行過宏定義的uint 或uchar 進(jìn)行定義,那么編譯的結(jié)果就會(huì)出現(xiàn)錯(cuò)誤,常見的錯(cuò)誤如下:
error C129: missing ';' before 'txData'
也就是在你定義的第一個(gè)變量前缺少了分號(hào)。這樣的報(bào)錯(cuò)常讓人覺得莫名其妙。
即使是對(duì)應(yīng)的C文件中進(jìn)行了#define uint unsigned int #define uchar unsigned char這樣的宏定義了,依然會(huì)報(bào)錯(cuò)。
如果在不同的H文件中,都進(jìn)行了如下的宏定義,
#define uint unsigned int #define uchar unsigned char
那么程序不會(huì)報(bào)錯(cuò)。
如果將數(shù)據(jù)類型的宏定義設(shè)置成一個(gè)頭文件。比如
#ifndef __TYPEDEF_H
#define __TYPEDEF_H
typedef unsigned char uchar;
typedef unsigned int uint;
#endif
那么,如果這個(gè)頭文件無論是包含在H文件中,還是包含在C文件中,都一樣不會(huì)報(bào)錯(cuò)。
并且無論包含在哪里對(duì)編譯后的文件大小均無影響。
對(duì)于數(shù)據(jù)類型的定義,無論在那個(gè)C文件模塊中都有可能要用到,那么最好的辦法是將數(shù)據(jù)類型的宏定義,制作成一個(gè)頭文件。如上所示。然后在不同的模塊中包含這個(gè)頭文件即可。
推薦包含在不同的.H文件中。
對(duì)于要在不同的模塊中都使用的變量,推薦的處理方式是:
在H文件中使用extern 聲明成外部變量,只進(jìn)行聲明不進(jìn)行定義,否則報(bào)錯(cuò)。如:
extern uchar txData[32] ;
extern uchar rxData[32] ;
extern uchar TX_ADDRESS[5];
extern uchar RX_ADDRESS[5];
在要使用這些變量的C文件中,進(jìn)行定義。如
uchar txData[32]={0x00} ;
uchar rxData[32]={0x00} ;
uchar TX_ADDRESS[5]={0x00};
uchar RX_ADDRESS[5]={0x000};
2、制作相應(yīng)的.C文件,注意和頭文件的名稱相同,然后包含上面定義的頭文件即可。
#include”xxx.h”;
注意,模塊中用到的頭文件,既可以放在.H文件中也可以放在.C文件中編譯時(shí)不會(huì)因位置的不同而報(bào)錯(cuò)。推薦還是包含在.H文件中。
在不同的C文件中,只要是包含了申明為外部變量的H文件,都可以對(duì)變量進(jìn)行賦值,當(dāng)然這個(gè)值可以是數(shù)據(jù)類型內(nèi)的任何不同值。
比如先在XXX.H文件中聲明外部變量,
extern uchar txData[32] ;
extern uchar rxData[32] ;
extern uchar TX_ADDRESS[5];
extern uchar RX_ADDRESS[5];
可以再xxx.c文件中進(jìn)行初始化
uchar txData[32]={0x00} ;
uchar rxData[32]={0x00} ;
uchar TX_ADDRESS[5]={0x00}; // Define a static TX address
uchar RX_ADDRESS[5]={0x000};
而在主函數(shù)中進(jìn)行真正的賦值
if (KEY1==0)
{
txData[0] = 0;//清零
txData[0] = 0xAA; // 如果按下K1 則將數(shù)據(jù)置為0xAA
keycnt++ ;//按鍵計(jì)數(shù)加1
if(keycnt>5)
{keycnt=1;}
TX_ADDRESS[0] =keycnt;
RX_ADDRESS[0] =keycnt;
}
前段時(shí)間遇到了這個(gè)問題,一發(fā)現(xiàn)有編譯錯(cuò)誤就將程序放在一起然后再查錯(cuò),沒有錯(cuò)誤了也就那樣了,少了以前那種韌勁,得過且過了。有些問題并不會(huì)因?yàn)橥俗專匀唤鉀Q。它一直在哪里,一次次的遇到它,在真正解決它之前,不得不一次次的繞道而行。
回頭一想十年一揮間。最近一年突然感覺老了,一下子變空了。如果說10年前是一個(gè)激情的水手,駕駛著小舢板不斷的找尋下一塊陸地。無論中間經(jīng)歷著什么,小舢板還是倔強(qiáng)的航向下一個(gè)目標(biāo)。而今小舢板換成了渡輪,卻靠不了岸,動(dòng)力不足也不知道岸在哪里,水手把舵交給了上天。船大了承載了更多的東西,事情不在那么單純,有些刻在心上的,歲月似乎也難以磨平。水手在甲板上靜靜的躺著,只是靜靜的躺著,什么也沒想,隨波飄蕩,期待找到曾經(jīng)的激情和力量再次揚(yáng)帆啟航。
借用別人的一段話,自勉一下。
如果你不能飛,就奔跑,如果你不能奔跑,就走,如果你不能走,就爬,但無論你做什么,你得一直前行。千萬不要放縱自己,給自己的止步不前找借口。對(duì)自己嚴(yán)格一點(diǎn)兒,時(shí)間長(zhǎng)了,自策自律便成為一種習(xí)慣,一種生活方式,你的人格和智慧會(huì)因此變得更加完美,你的事業(yè)家庭會(huì)因此變更加美滿。
作者: 知識(shí)閱覽者 時(shí)間: 2016-3-1 10:35
太好的總結(jié)資料了!!!
作者: tyj000 時(shí)間: 2016-11-25 22:33
學(xué)習(xí)中.................
作者: luotechnically 時(shí)間: 2017-9-18 20:29
今天再看老哥你的總結(jié),突然有了一樣的心境。很多東西失去了以往的激情,變得生活少了期待。
作者: 青青梓衿 時(shí)間: 2019-6-20 14:26
受教了,以前也用過模塊化編程老出錯(cuò),一些細(xì)節(jié)很重要。
作者: wcs1668 時(shí)間: 2019-8-24 14:04
總結(jié)的很好
了!!!
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |