C語言軟件編程經(jīng)驗交流_第1頁
C語言軟件編程經(jīng)驗交流_第2頁
C語言軟件編程經(jīng)驗交流_第3頁
C語言軟件編程經(jīng)驗交流_第4頁
C語言軟件編程經(jīng)驗交流_第5頁
已閱讀5頁,還剩62頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、C語言軟件編程經(jīng)驗交流C語言軟件編程經(jīng)驗交流C 語言,不會講太多其他高級語言比如 C+, JAVA, PYTHON 等等,剛進(jìn)實驗室的學(xué)生我的建議是先學(xué)好 C 語言,掌握項目開發(fā)中軟件的開發(fā)目的,開發(fā)流程,測試流程等。 注意,做這個報告的目的是希望大家能夠開發(fā)出高效的 C 程序,而不是讓大家開發(fā)出復(fù)雜高難度高技巧的 C 報告目的提綱一、C 語言基礎(chǔ)二、內(nèi)存管理三、常用技巧四、調(diào)試五、示例開發(fā)軟件工欲善其事,必先利其器 -論語牢牢打好基礎(chǔ),緊緊抓住核心,真正實現(xiàn)目的 -深入學(xué)習(xí)科學(xué)發(fā)展觀編輯軟件:,VS20XX 編程輔助軟件:msdn功能性輔助軟件:vc assistant,numega bou

2、nds checker, intelvtune,source insight推薦的資料: 高質(zhì)量 C/C+ 編程指南(林銳)、 Windows 核心編程、linux 高級程序設(shè)計一、C語言基礎(chǔ)在 C 語言中使用的詞匯分為六類:標(biāo)識符,關(guān)鍵字,運算符,分隔符,常量,注釋符。1.1.1 C 語言詞匯標(biāo)識符只能是字母、數(shù)字、下劃線組成的字符串,并且其第一個字符必須是字母或下劃線。以下標(biāo)識符是合法的:a, x, _3x, BOOK_1, sum5以下標(biāo)識符是非法的:3s 以數(shù)字開頭; s*T 出現(xiàn)非法字符*; -3x 以減號開頭;(1)標(biāo)識符一、C語言基礎(chǔ)在使用標(biāo)識符時注意以下幾點:標(biāo)準(zhǔn) C 不限制標(biāo)

3、識符的長度,但它受各種版本的 C 語言編譯系統(tǒng)限制,同時也受到具體機器的限制;在標(biāo)識符中,大小寫是有區(qū)別的。例如 BOOK 和 book 是兩個不同的標(biāo)識符;標(biāo)識符雖然可由程序員隨意定義,但標(biāo)識符是用于標(biāo)識某個量的符號。因此,命名應(yīng)盡量有相應(yīng)的意義,以便閱讀理解,作到“顧名思義”。 int ImgWidth;(1)標(biāo)識符一、C語言基礎(chǔ)1、匈牙利命名法:開頭字母用變量類型的縮寫,其余部分用變量的英文或英文的縮寫,要求單詞第一個字母大寫。int iMyAge; “i”是int類型的縮寫;char cMyName10; “c”是char類型的縮寫;float fManHeight; “f”是floa

4、t類型的縮寫;2、駝峰規(guī)則:又叫小駝峰式命名法。第一個單詞首字母小寫,后面其他單詞首字母大寫。int myAge;char myName10;float manHeight;3 . 帕斯卡命名法:又叫大駝峰式命名法。每個單詞的第一個字母都大寫。int MyAge;char MyName10;float ManHeight;一、C語言基礎(chǔ)關(guān)鍵字是由 語言規(guī)定的具有特定意義的字符串,通常也稱為保留字。用戶定義的標(biāo)識符不應(yīng)與關(guān)鍵字相同。C 語言的關(guān)鍵字分為以下幾類:(2)關(guān)鍵字一、C語言基礎(chǔ)類型說明符 用于定義、說明變量、函數(shù)或其它數(shù)據(jù)結(jié)構(gòu)的類型。如 char,short,int,double 等語

5、句定義符 用于表示一個語句的功能。如 for, if, else, while, switch 等。預(yù)處理命令字 用于表示一個預(yù)處理命令。如 #define #pragma 等。C 語言中運算符與變量,函數(shù)一起組成表達(dá)式,表示各種運算功能。運算符由一個或多個字符組成,如 ,=,& 等。(3)運算符(4)分隔符在 C 語言中采用的分隔符有逗號和空格兩種。一、C語言基礎(chǔ)(5)常量C 語言中使用的常量可分為數(shù)字常量、字符常量、字符串常量、符號常量、轉(zhuǎn)義字符等多種。比如 char *p = “hello world”; C 語言中的常量是不接受程序修改的固定值。(6)注釋符C 語言的注釋符是以

6、“/*”開頭并以“*/”結(jié)尾的串,C+ 中使用“/”注釋所在行。一、C語言基礎(chǔ)什么是字節(jié)對齊,為什么要字節(jié)對齊?1.1.2 字節(jié)對齊一、C語言基礎(chǔ)(1)什么是字節(jié)對齊?現(xiàn)代計算機中內(nèi)存空間都是按照 byte 劃分的,從理論上講對任何類型的變量的訪問可以從任何地址開始,但實際情況是在訪問特定變量的時候經(jīng)常在特定的內(nèi)存地址訪問,這就需要各類型數(shù)據(jù)按照一定的規(guī)則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。一、C語言基礎(chǔ)(2)為什么要字節(jié)對齊?對齊的作用和原因:各個硬件平臺對存儲空間的處理上有很大的不同。一些平臺對某些特定類型的數(shù)據(jù)只能從某些特定地址開始存取。其他平臺可能沒有這種情況, 但

7、是最常見的是如果不按照適合其平臺的要求對數(shù)據(jù)存放進(jìn)行對齊,會在存取效率上帶來損失。比如有些平臺每次讀都是從偶地址開始,如果一個 int型(假設(shè)為 32 位)如果存放在偶地址開始的地方,那么一個讀周期就可以讀出,而如果存放在奇地址開始的地方,就可能會需要 2 個讀周期,并對兩次讀出的結(jié)果的高低 字節(jié)進(jìn)行拼湊才能得到該int數(shù)據(jù)。一、C語言基礎(chǔ)(3)大小端(例程) 在計算機系統(tǒng)中,我們是以字節(jié)為單位的,每個地址單元都對應(yīng)著一個字節(jié),一個字節(jié)為 8bit。對于位數(shù)大于 8 位的處理器,由于寄存器寬度大于一個字節(jié),那么必然存在著一個如何將多個字節(jié)安排的問題。 所謂的大端模式,是指數(shù)據(jù)的低位保存在內(nèi)存的

8、高地址中,而數(shù)據(jù)的高位,保存在內(nèi)存的低地址中;所謂的小端模式,是指數(shù)據(jù)的低位保存在內(nèi)存的低地址中,而數(shù)據(jù)的高位保存在內(nèi)存的高地址中一、C語言基礎(chǔ)(3)大小端(例程)寫一個 C 函數(shù),若處理器是 Big_endian 的,則返回 0;若是 Little_endian的,則返回 1int checkCPU三 union w int a; char b; c; c.a = 1; return (c.b = 1); 一、C語言基礎(chǔ)(3)大小端(例程)采用 Little-endian 模式的 CPU 對操作數(shù)的存放方式是從低字節(jié)到高字節(jié),而 Big-endian 模式對操作數(shù)的存放方式是從高字節(jié)到低字節(jié)

9、序是所有成員都從低地址開始存放。聯(lián)合體 union 的存放順序是所有成員都從低地址開始存放。一、C語言基礎(chǔ)/ 作者版權(quán)版本說明,頭文件聲明,全局變量,函數(shù)聲明,預(yù)處理塊#include #include ”global.h”void output三; / 子函數(shù)聲明int main(int argc, char *argv)int i,j;unsigned char *data; /定義局部變量/ 分配數(shù)據(jù)空間,分配在堆上data = (unsigned char *)malloc(1000*sizeof(unsigned char);for(i) / 調(diào)用子函數(shù)output三;/ 釋放分配空

10、間free(data);data=NULL;void output三一、C語言基礎(chǔ) #ifndef GRAPHICS_H (作用:防止被重復(fù)引用)#define GRAPHICS_H#include. (作用:引用標(biāo)準(zhǔn)庫的頭文件)#include. (作用:引用非標(biāo)準(zhǔn)庫的頭文件)void Function1(.); (作用:全局函數(shù)聲明)class Box (作用:類結(jié)構(gòu)聲明);#endif1.2.1 頭文件一、C語言基礎(chǔ)在頭文件中,用 ifndef/define/endif結(jié)構(gòu)產(chǎn)生預(yù)處理塊,用 #include 格式來引用庫的頭文件。頭文件一般由三部分內(nèi)容組成:1.2.1 頭文件頭文件開頭處

11、的版權(quán)和版本聲明;預(yù)處理塊;函數(shù)和類結(jié)構(gòu)聲明等。一、C語言基礎(chǔ)頭文件的主要作用在于調(diào)用庫功能,對各個被調(diào)用函數(shù)給出一個描述,其本身不包含程序的邏輯實現(xiàn)代碼,它只起描述性作用,告訴應(yīng)用程序通過相應(yīng)途徑尋找相應(yīng)功能函數(shù)的真正邏輯實現(xiàn)代碼。用戶程序只需要按照頭文件中的接口聲明來調(diào)用庫功能,編譯器會從庫中提取相應(yīng)的代碼。1.2.1 頭文件一、C語言基礎(chǔ) 注意:1) 在 .h文件中聲明的函數(shù),如果在其對應(yīng)的 .c 文件中有定義,那么我們在聲明這個函數(shù)時,不使用 extern 修飾符, 如果反之,則必須顯示使用 extern 修飾符; 2) 不要在 .h 文件中編寫實現(xiàn)代碼,不要 #include “.c

12、”文件。1.2.1 頭文件一、C語言基礎(chǔ)所有全局變量盡量以 g_ 開頭,并且盡可能聲明成 static 類型;盡量杜絕跨文件訪問全局變量.如果的確需要在多個文件內(nèi)訪問同一變量,應(yīng)該由該變量定義所在文件內(nèi)提供 GET/PUT 函數(shù)實現(xiàn);全局變量必須要有一個初始值,全局變量盡量放在一個專門的函數(shù)內(nèi)初始化;如調(diào)用全局變量的函數(shù)少于三個,考慮改為局部變量實現(xiàn)。1.2.2 謹(jǐn)慎使用全局變量一、C語言基礎(chǔ)在實際的軟件項目中,每個人負(fù)責(zé)的可能只是一個模塊,對全局變量的使用沒有小程序那樣簡單,在使用全局變量的時候更要謹(jǐn)慎,跨模塊調(diào)用的全局變量使用時都需要申請,而且定義必須明確。1.2.2 謹(jǐn)慎使用全局變量一、

13、C語言基礎(chǔ)void main(int argc, char *argv)1.2.3 main函數(shù)一、C語言基礎(chǔ)命令行界面的程序,通常都需要輸入命令行參數(shù)幫助程序執(zhí)行。假定有一個可執(zhí)行程序名為 。運行該程序的的命令行如下:帶命令行參數(shù)是同一行中的附加項: c TEST其中 c 和 TEST 就是命令行參數(shù)。C程序通過使用 main三 的參數(shù)來讀取這些附加參數(shù)。main(int argc, char*argv) 這個函數(shù)中兩個參數(shù)的意義:argc 記錄的是命令行中輸入?yún)?shù)的數(shù)目; argv 是一個擁有 argc 個元素的字符串?dāng)?shù)組,每個元素保存一個命令行中輸入的參數(shù)。1.2.3 main函數(shù)一、C

14、語言基礎(chǔ)#include int main(int argc, char * argv) int i; for (i=0; i argc; i+)printf(Argument %d is %s.n, i, argvi); return 0; 1.2.3 main函數(shù)一、C語言基礎(chǔ)下面的程序演示 argc 和 argv 的使用: Argument 0 is hello.exe. Argument 1 is a. Argument 2 is b. Argument 3 is c. Argument 4 is d. Argument 5 is e. 1.2.3 main函數(shù)一、C語言基礎(chǔ)運行結(jié)果:

15、假如上述代碼編譯為 ,那么運行:hello.exe a b c d e 1.2.3 main 函數(shù)一、C語言基礎(chǔ)在這個例子中,argc 的值為 6,命令行一共輸入了六個參數(shù):“hello.exe”、“a”、 “b” 、 “c” 、 “d” 、“e” 對應(yīng)程序輸入為: ,argv1:a, argv2: b , argv3:c ,argv4:d argv5:en需要注意的是若輸入?yún)?shù)作為數(shù)值使用時,使用 atoi atof進(jìn)行字符轉(zhuǎn)換 看例程一、C語言基礎(chǔ)1.3 代碼編寫規(guī)范從書寫清晰,便于閱讀,理解,維護(hù)的角度出發(fā),在書寫程序時應(yīng)遵循以下規(guī)則:一個說明或一個語句占一行。if,for,while,

16、do占一行,執(zhí)行語句放后面并且使用大括號,多用對齊。用 括起來的部分,通常表示了程序的某一層次結(jié)構(gòu)。一般與該結(jié)構(gòu)語句的第一個字母對齊,并單獨占一行。低一層次的語句或說明可比高一層次的語句或說明縮進(jìn)若干格后書寫。以便看起來更加清晰,增加程序的可讀性。在編程時應(yīng)力求遵循這些規(guī)則,以養(yǎng)成良好的編程風(fēng)格。多寫注釋,合理的使用注釋可以讓你的程序可讀性更高。一、C語言基礎(chǔ)另外一些編程風(fēng)格說明:程序塊要采用縮進(jìn)風(fēng)格編寫,縮進(jìn)少使用空格鍵;對齊多使用TAB鍵,少使用空格鍵;逗號、分號只在后面加空格。 int a, b, c; 比較操作符, 賦值操作符“=”,“+=”,算術(shù)操作符“+”,“%”,邏輯操作符“&a

17、mp;”,“&”,位域操作符“”,“.”前后不加空格。 p-id = pid; /“-”指針前后不加空格 if、for、while、switch等與后面的括號間應(yīng)加空格,使if等關(guān)鍵字更為突出、明顯。 if (a = b & c d) 一、C語言基礎(chǔ)一、C語言基礎(chǔ)1.4 命名規(guī)則使用匈牙利命名法,標(biāo)識符應(yīng)直觀意思明確盡量使用縮寫,如 int iImgWidth; 不要使用大小寫來區(qū)分變量,如 int x,X; 局部變量不要與全局變量同名; 常量使用大寫字母,合理使用前綴,靜態(tài)變量加前綴s_,全局變量加前綴 g_。一、C語言基礎(chǔ)1.5 表達(dá)式 注意優(yōu)先級的的高低以及結(jié)合順序,多使

18、用括號確定優(yōu)先級一、C語言基礎(chǔ)1.5 表達(dá)式注意if常用的條件判斷情況: 布爾變量 if(flag) if(!flag) 整型變量 if(flag=0) if(flag!=0) 浮點變量 if( abs(x-0) 1e-5) 指針變量 if(p=NULL)if(p!=NULL) if 語句一、C語言基礎(chǔ)1.5 表達(dá)式注意以下幾點:多重循環(huán)中,盡量將循環(huán)少的放在外層循環(huán)for(i=0; iN;i+),循環(huán)執(zhí)行 N 次,最大執(zhí)行到 i=N-1,i最后執(zhí)行完等于Nswitch 的每個 case 都加上 break,最后加上 default 盡量少用 goto 循環(huán)語句從靜態(tài)存儲區(qū)域分配,在程序編譯的

19、時候就已經(jīng)分配好,整個運行期都存在。如全局變量和 static 變量。從棧上創(chuàng)建,從函數(shù)創(chuàng)建開始存在,函數(shù)結(jié)束就釋放,效率高,但是分配大小有限。如函數(shù)內(nèi)部變量。從堆上分配,也稱動態(tài)內(nèi)存分配。使用 malloc 分配,需要手動 free 釋放。使用靈活,容易出問題。C語言中內(nèi)存分配區(qū)域:二、內(nèi)存管理二、內(nèi)存管理2.1 常見內(nèi)存錯誤沒有分配直接使用或者分配未成功卻使用了它;沒有初始化或者歸零就直接使用(分配內(nèi)存后系統(tǒng)默認(rèn)值不一定是 0);使用時內(nèi)存訪問越界,使用完忘記釋放內(nèi)存,造成內(nèi)存泄漏;對已分配內(nèi)存的指針進(jìn)行賦值操作,原來分配內(nèi)存區(qū)域丟失,內(nèi)存泄漏;釋放了內(nèi)存卻繼續(xù)使用,指針在釋放后并不是變?yōu)?/p>

20、 NULL,仍然指向原來地址,成為“野指針”。二、內(nèi)存管理2.2 指針與數(shù)組數(shù)組在棧上和靜態(tài)存儲區(qū)域創(chuàng)建,其地址與容量分配后不可改變,但內(nèi)容可以改變;指針的特征是“可變”,用于分配動態(tài)內(nèi)存區(qū)域;不能直接對數(shù)組名進(jìn)行復(fù)制和比較,使用 strcpy 和 strcmp;指針存儲的是動態(tài)內(nèi)存區(qū)域的地址,可以直接傳遞地址,當(dāng)對兩塊動態(tài)內(nèi)存區(qū)域復(fù)制或比較時使用memcpy 和 memcmp;數(shù)組的大小,需要加上最后面的0,可以使用 sizeof 獲得;指針使用 sizeof 獲得的是指針變量的字節(jié)數(shù);需要注意的是當(dāng)數(shù)組作為函數(shù)參數(shù)傳遞時,自動退化為該類型的指針。二、內(nèi)存管理2.2 指針與數(shù)組例子:二、內(nèi)存

21、管理2.3 指針指針的本質(zhì)是地址,指針變量本身作為普通寄存器變量被存儲,特別是該寄存器地址內(nèi)存儲的是另一個寄存器地址,該寄存器地址內(nèi)存儲的數(shù)據(jù)是指針指向的數(shù)據(jù)。棧mainint i=200;char *p;0 x123456假設(shè)已給p分配空間0 x12 3456p=0 x123456i=2000 x1234560 x123452100*p=1000 x20XX120 x20XX16&p=0 x20XX16&i=0 x20XX20200棧二、內(nèi)存管理2.3 指針malloc 在堆上分配動態(tài)內(nèi)存區(qū)域,需要指定分配區(qū)域的大小,以字節(jié)作為單位。 p = (char *)malloc(1

22、*sizeof(char);/分配到0 x123456,存儲在棧地址0 x20XX16的內(nèi)存地址中 *p=100;/修改0 x123456中數(shù)值為100/free將分配的動態(tài)內(nèi)存區(qū)域釋放free(p);/雖然0 x123456該地址被標(biāo)志為已釋放,但是p內(nèi)存儲的仍然是 0 x123456,p成為野指針p=NULL;/將0 x20XX16內(nèi)數(shù)據(jù)改為0 x00,該地址不可訪問 malloc 與 free:二、內(nèi)存管理當(dāng)子函數(shù)中使用指針時,子函數(shù)執(zhí)行結(jié)束指針沒有 free 掉,此時指針變量釋放了,不代表它所指向的內(nèi)存自動釋放了。當(dāng)內(nèi)存被釋放時,不代表指針不存在了或者指針成為 NULL 指針。需要查找

23、程序內(nèi)存泄漏。2.3 指針 需要注意的幾點:三、常用技巧3.1 宏的使用#define ceil_div(x, y) (x + y - 1) / y宏執(zhí)行的是簡單的替換作用,需要注意由操作符優(yōu)先級引起的問題,多加括號。那么 a = ceil_div( b & c, sizeof(int) );將被轉(zhuǎn)化為: a = ( b & c + sizeof(int) - 1) / sizeof(int);由于+/-的優(yōu)先級高于&的優(yōu)先級,那么上面式子等同于:a = ( b & (c + sizeof(int) - 1) / sizeof(int);為了避免這種情況發(fā)生,應(yīng)

24、當(dāng)多寫幾個括號:#define ceil_div(x, y) (x) + (y) - 1) / (y)三、常用技巧3.1 宏的使用 函數(shù)變宏每行代碼最后都加行連接符“”,即使是空行也要加“”,最后一行代碼后面不需要加“”,每行“”最后不能有多余字符或者空格,返回的是最后一條語句的執(zhí)行結(jié)果??梢栽诤旰瘮?shù)內(nèi)定義變量,可以使用if等語句,可以在宏內(nèi)調(diào)用其他宏,可以使用指針。函數(shù)變宏可以加快程序運行速度。看例子三、常用技巧3.2 運行時間測量程序運行過程中,我們經(jīng)常需要統(tǒng)計程序運行時間。下面給出示例:#include main三clock_t begin,end;begin = clock三;end=

25、 clock三;double duration; duration = (double)(end - begin ) / CLOCKS_PER_SEC; printf( “Time is %2.1f secondsn, duration ); / #define CLOCKS_PER_SEC 1000/ 事實上end begin獲得的是毫秒計數(shù)三、常用技巧3.2 運行時間測量Time三 函數(shù)是獲得當(dāng)前系統(tǒng)時間用的,一般不用于計時。當(dāng)程序運行時間太短時,可以使用多次執(zhí)行的辦法來獲得。可以使用更精確的運行時間計數(shù)函數(shù):“QueryPerformanceCounter三”“QueryPerforma

26、nceFrequency三”三、常用技巧 隨機數(shù)生成:#include #include #include void main( void ) int i; /* Seed the random-number generator with current time so that * the numbers will be different every time we run. */ srand( (unsigned)time( NULL ) ); /* Display 10 numbers. */ for( i = 0; i 10;i+ ) printf( %6dn, rand三 ); S

27、rand是產(chǎn)生偽隨機序列的種子,種子一樣產(chǎn)生的偽隨機序列一樣。 RAND_MAX0 x7fffffff j=(int)(*rand三/(RAND_MAX+1.0) 產(chǎn)生一個0到之間的隨機數(shù)三、常用技巧3.3 文件操作 文件的打開與關(guān)閉 文件在進(jìn)行讀寫操作之前要先打開,使用完畢要關(guān)閉。打開文件實際上是建立文件的各種有關(guān)信息,并使文件指針指向該文件,以便進(jìn)行其它操作。關(guān)閉文件則斷開指針與文件之間的聯(lián)系,也就禁止再對該文進(jìn)行操作。 在語言中,文件操作都是由庫函數(shù)來完成的。fp = fopen(“filename”,“r”); 三、常用技巧 對于文件使用方式有以下幾點說明: 文件使用方式由r,w,a,

28、b,t,+六個字符拼成,各字符的含義是: r(read): 讀 w(write): 寫 a(append): 追加 b(binary): 二進(jìn)制文件 +: 讀和寫 凡用“r”打開一個文件時,該文件必須已經(jīng)存在,且只能從該文件讀出。 用“w”打開的文件只能向該文件寫入。若打開的文件不存在,則以指定的文件名建立該文件,若打開的文件已經(jīng)存在,則將該文件刪去,重建一個新文件。 三、常用技巧if(fp=fopen(“readme.txt,rb)=NULL) printf(nerror on open c:hzk16 file!); exit(1); 若要向一個已存在的文件追加新的信息,只能用“a”方式打

29、開文件。但此時該文件必須是存在的,否則將會出錯。在打開一個文件時,如果出錯,fopen將返回一個空指針值NULL。在程序中可以用這一信息來判別是否完成打開文件的工作,并作相應(yīng)的處理。三、常用技巧 文件的讀寫對文件的讀和寫是最常用的文件操作。在語言中提供了多種文件讀寫的函數(shù): 字符讀寫函數(shù) :fgetc和fputc 字符串讀寫函數(shù):fgets和fputs 數(shù)據(jù)塊讀寫函數(shù):fread和fwrite 格式化讀寫函數(shù):fscanf和fprinf行操作。 三、常用技巧 文件的讀寫在文件內(nèi)部有一個位置指針,用來指向文件的當(dāng)前讀寫字節(jié)。在文件打開時,該指針總是指向文件的第一個字節(jié)。使用fgetc 函數(shù)后,該

30、位置指針將向后移動一個字節(jié)。應(yīng)注意文件指針和文件內(nèi)部的位置指針不是一回事。文件指針是指向整個文件的,文件內(nèi)部的位置指針用以指示文件內(nèi)部的當(dāng)前讀寫位置,每讀寫一次,該指針系統(tǒng)自動向后移動。三、常用技巧 計算文件長度的程序示例long filesize(FILE *stream) long curpos, length; curpos = ftell(stream); fseek(stream, 0L, SEEK_END); length = ftell(stream); fseek(stream, curpos, SEEK_SET); return length;進(jìn)行二進(jìn)制文件讀寫時,打開方式后

31、面加“b”四、調(diào)試編程出現(xiàn)error時,從第一個error處開始解決錯誤,可能是很小的書寫錯誤引起的。warning也需要關(guān)注,有時候會導(dǎo)致程序運行錯誤發(fā)生。程序出現(xiàn)BUG時,單步跟蹤,查看變量,查看內(nèi)存,查看棧調(diào)用,可以邊編輯邊跟蹤。加入合適的斷點,使用條件斷點。程序調(diào)試結(jié)束后需要查找內(nèi)存泄露,規(guī)范代碼書寫。使用assert,只有條件滿足才繼續(xù)向下執(zhí)行,在release下不會編譯該語句。程序編寫完成不一定是完全正確的,需要進(jìn)行測試并進(jìn)行跟蹤調(diào)試。四、調(diào)試4.1 條件斷點我們在調(diào)試的時候希望程序在某個斷點處只有在滿足一定的條件下中斷,在不滿足條件的時候正常運行,可以為程序調(diào)試帶來極大的便利。

32、示例四、調(diào)試4.2 內(nèi)存泄漏查找 養(yǎng)成好的代碼寫作規(guī)范,掌握內(nèi)存管理概念,減少不規(guī)范代碼內(nèi)存泄漏可能性。是否內(nèi)存泄露:運行可執(zhí)行文件,使用任務(wù)管理器查看內(nèi)存占用情況是否一直增加。比較簡單但是顯示不一定精確。使用NumegaBounderChecker軟件查找,程序中加入exit(0)強制中斷,Debug至該代碼行程序異常中斷時查看內(nèi)存泄露報告。 示例四、調(diào)試4.3 watch 跟蹤調(diào)試時多使用watch窗口,在watch窗口內(nèi)可以進(jìn)行有限運算,注意watch 運算帶來的影響。 示例四、調(diào)試4.4 C 程序優(yōu)化首先要確定優(yōu)化目標(biāo),然后尋找優(yōu)化方法。查找程序運行瓶頸,使用Intel Vtune查看

33、各部分運行時間,一步步進(jìn)行優(yōu)化?,F(xiàn)在CPU,GPU發(fā)展方向都是多核,并行計算越來越方便,為優(yōu)化提供了更多解決方案。任務(wù)級并行,使用多線程發(fā)揮多核優(yōu)勢。 指令級并行,使用MMX,SSE,SSE2等指令集。 參看Vtune使用指南五、示例5.1 軟件設(shè)計算法思想,思路清楚,注意細(xì)節(jié)質(zhì)量控制,代碼高效,風(fēng)格良好測試調(diào)試,測試全面,調(diào)試認(rèn)真軟件設(shè)計過程關(guān)鍵部分:在編寫軟件程序之前,首先要明確你要解決的問題,軟件只是思想的實現(xiàn),不能通過編程來獲得思想。所以在編寫之前就需要對問題有透徹的理解,對解決問題的方法有清晰的思路,要考慮到可能遇到的所有問題,同時要考慮到軟件的可靠性穩(wěn)定性等。五、示例5.1 軟件設(shè)計在編寫軟

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論