第一篇:軟件編程問題與錯誤的總結(jié)(精選)
我的總結(jié)
1.在H文件中定義的變量可以再main函數(shù)中用,要包括頭文件;但main之前定義的全局變量不能在頭文件中用。(重復(fù)定義的錯誤)。2.在寫程序時,必須首先畫出它的程序流程圖,也就是程序的走向。一步一步的將他在紙上寫出來。3.調(diào)用數(shù)組函數(shù)時,數(shù)組一般用的是數(shù)組名。
4.即使a、b是空類型(void)的函數(shù),當a函數(shù)要調(diào)用b函數(shù)情況發(fā)生,b函數(shù)必須寫在a函數(shù)的前面。5.遇到問題不要慌,認真對待!從軟件開始,一步一步地排除原因,當實在找不出原因時,再檢查硬件電路。6.在定義函數(shù)時,無論是形參還是全局變量都要對其初始化,既方便自己寫程序,也減少了不必要的錯誤。7.中斷程序里不要定義變量,定義變量一般在主函數(shù)開始的時候。
8.在調(diào)試程序中,我們要觀察程序執(zhí)行到哪里,可以用一個發(fā)光二極管去檢測。9.用switch語句有時候可以讓程序并行。10.C語言中的結(jié)構(gòu)體是一個重點。
11.不要交叉調(diào)用C頭文件。也就是在爭論先有雞還是先有蛋的問題。12.中斷里不要又太長的程序,要是周期性中斷,就必須保證有一定的閾值,否則程序就有可能跑錯。13.當程序中需要用到一些并列的語句時,可以設(shè)置一個標志變量Flag。當情況一發(fā)生時,F(xiàn)lag會自行加加,否則清零。在接下來的另一種情況中讓程序在Flag為0 的條件下執(zhí)行。這樣就達到了并列的效果。14.變量一般不定義在H文件中,因為當兩個C文件同時用到某個全局變量時,那么就相當于對全局變量定義了兩次,實際上這是不允許的。正確的處理方法是在要用的時候進行變量定義,然后在H文件中進行申明,申明為外部變量。最后在C文件中區(qū)定義。15.靜態(tài)變量和全局變量的好處就是:系統(tǒng)不會回收他們的內(nèi)存。也就是說,他們會保持上一次的值,也就是他們與局部變量的不同。同樣決定了他們的不足。16.“->” 表示指向結(jié)構(gòu)體運算符,它的結(jié)合方向是從左向右的,優(yōu)先級最高。17.x*x不能寫作x^2,在C語言中,“^”表示按位異或的意思。
18.定義結(jié)構(gòu)體變量時,首先在H文件中申明,然后在C文件中要定義一個與結(jié)構(gòu)體相關(guān)的變量。這樣在程序中才能應(yīng)用。例如:先在H文件中申明一個結(jié)構(gòu)體extern typedef struct A{????}A;然后再C文件中定義A Other;這樣Other也具有和結(jié)構(gòu)體A相同的形式。
19.調(diào)用帶指針操作的函數(shù)時,在形參的傳遞時,注意用的是取址操作符’&’,還是指針操作符’*’。20.對于乘除操作時,采用左移和右移的方法,比乘除執(zhí)行的速度要快。21.在對信號采集時,我們經(jīng)常會碰到數(shù)的更新。有兩種方法。方法一:設(shè)定一個數(shù)組,每次先將a[i+1] = a[i],然后用當前值對a[0]進行更新。方法二:也是設(shè)定一個數(shù)組,在這里,處理的比較簡單。只需將最舊的那個數(shù)進行更新就可以了。也就是說第一次將當前值賦值給a[0],第二次賦值給a[1],以此類推,進行無限的循環(huán)。22.取表法是單片機程序中很常用的一種編程思想:要顯示的數(shù)據(jù)之間不存在簡單的運算關(guān)系,不能使用ADD和SUBB等指令根據(jù)上一個狀態(tài)計算出下一個狀態(tài)的顯示值。但顯示的數(shù)據(jù)存在依次取用的特點,這是一般就會用到取表法。23.很多時候可以單步執(zhí)行,然后用示波器去檢測輸出口的波形,看到底程序是否跑對。24.單片機與計算機進行串口通信時,計算機端一般只設(shè)定整數(shù)值的波特率,這樣造成了單片機與計算機的通信的波特率不全相等,導(dǎo)致傳輸錯誤的發(fā)生。串口通信模塊中有兩條指令經(jīng)常用到:“JBC TI,CHECK”和“JB RI,CHECK”他們分別用來檢測發(fā)送中斷標志位TI和接收中斷標志位RI,用來判斷接收完成情況。25.邊沿觸發(fā)對電平的要求是:如果晶振為12MHz ,至少需要1個機器周期的高電平,且向低電平跳變之后至少保持一個機器周期的低電平。26.在主函數(shù)的內(nèi)部,定義局部變量一定要放在任何函數(shù)或語句執(zhí)行之前,否則肯定報錯。27.對于一個程序,中斷是一個很重要的東西,設(shè)置好中斷,程序會很簡單。28.有時候想問題不能死鉆牛角尖,不是那里的問題,就不是。比如說有些I/O口的輸入輸出設(shè)置,是一個很玄乎的東西,想問題深入一點,細致一點。29.注意引腳輸入輸出的定義,特別是一些好的單片機,對引腳的輸入輸出有特殊的設(shè)置要求。例如:飛思卡爾的單片機的PE0和PE1只能作為固定輸入。30.在很多時候應(yīng)該想一些問題的另一面,如果SMOD為某一寄存器的一位,其值只能是0或者是1.那么,2^SMOD =(SMOD + 1).有些運算就得到了簡化。31.寫程序時,應(yīng)該盡量用一些“與或非”操作。例如一個寄存器PCON.如果有操作:PCON |=0x80(就是將PCON的最高位寫1,其他位不管)。而如果有操作PCON &=0x80(就是將PCON的低七位都清零)。與或非操作能夠大量的縮短程序執(zhí)行的時間,增強了代碼的可讀性。32.對某一個端口的某些位進行操作時,不管其他位的狀態(tài),需要用到或與相關(guān)的知識。例如,對P3口的高四位進行讀值時,不考慮低四位的狀態(tài)。可以用一個&符號。即temp=P3&0xf0;這樣低四位的值肯定全為零。而高四位就保持了狀態(tài)。33.AD9852_Data[0]=((unsigned char*)&FTW)[5];這條語句的意思是:第一步,&FTW是C中常用的一個取址的操作,取數(shù)組FTW的地址;第二步,對原本的數(shù)組FTW中的所有數(shù)據(jù)進行強制轉(zhuǎn)換。第三步,是對數(shù)組中的數(shù)的取出。即FTW[5]。34.#define
AD9852_Set_IORESET()
do{AD9852_IORESET_DIR = 1;
AD9852_IORESET_OUT = 1;} while(0)
在以后有些函數(shù)用的比較多時,盡量在宏定義中去寫。宏定義中的函數(shù)盡量都是最底層的函數(shù),也就是沒有調(diào)用任何函數(shù),都是對寄存器的操作。35.宏定義的作用就是純屬的一個復(fù)制作用,它是把一些經(jīng)常用到的函數(shù)寫在宏定義中。這樣的話就方便程序的修改。36.DDRA&=0xF8;DDRA|=temp;這兩句操作第一句能保證低三位首先清零。Temp的值也就是你要定義的低三位的輸入或輸出狀態(tài)。這樣的位操作在程序中用的比較多。應(yīng)多加應(yīng)用。37.當函數(shù)的形參是全局變量的時候,這個時候可以將形參省略不寫,省略了不必要的代碼,但是也增加了別人讀代碼的難度。38.有時候某些端口必須有觸發(fā)功能,也就是說它是上電復(fù)位的,在系統(tǒng)板上按復(fù)位鍵和按運行鍵是有本質(zhì)區(qū)別的。39.以后在寫程序的時候盡量做到模塊化,也就是說,在對端口的定義的時候,盡量不要直接寫PORTA或者PORTB等。可以這樣定義: #define Set_Rs PTS_PTS2 = 1 #define Clr_Rs PTS_PTS2 = 0(定義它的控制字)
#define ad9851_w_clk_dir DDRB_DDRB0(定義輸入輸出方向)
這樣寫的話以后可以方便改寫端口,增強程序的可移植性。
40.有時候,數(shù)據(jù)需要轉(zhuǎn)換,讀數(shù)據(jù)的時候?qū)?yīng)的輸出端口的方向是輸入,而寫數(shù)據(jù)的時候?qū)?yīng)的端口是輸出。41.有的時候?qū)懗绦虻南敕ú荒芴溃热缯f吧:a要從0到100,以10為步進,大多數(shù)人的想法是這樣的,if(a>=0&&a<10)do something;
else if(a>=10&&a<20)do something ???
就這樣一直寫下去。現(xiàn)在我們回頭來想一下,到底需要怎么寫,可以減少程序的代碼量。我們可以向下面這樣寫: if(a>90)do something;else if(a>80)do something??? 從這樣的操作可以看出,減少了代碼量,還不會影響程序的執(zhí)行。42.在以后的程序設(shè)計中,盡量寫好程序的相關(guān)說明,最好像下面的所示: /***************************************************************** * 名 稱:Test(void)* 功 能:測試液晶屏 * 入口參數(shù):無 * 出口參數(shù):無
* 說 明:測試液晶屏是否正常工作 * 調(diào)用方法:Test();******************************************************************/ 43.我們寫的函數(shù)應(yīng)該是容易讓別人讀懂的,更應(yīng)該具有通用性。比如說畫一個坐標軸xOy。就要寫的方便別人改一點。可以這樣寫:
Draw_XY(y_org,x_org,Red);這樣寫誰都能看明白:y_org表示y軸的原點所在處。x_org表示x軸的原點所在處。Red表示畫出的圓的顏色。寫的程序就方便改了,代碼也就很靈活。44.程序中應(yīng)該不要出現(xiàn),延時1毫秒以上的程序,最好都是通過中斷產(chǎn)生的。無論什么時候我們都要以實際應(yīng)用的角度去考慮程序的書寫。45.對于一個程序員,如何釋放CPU,這是寫合格程序的基礎(chǔ)。
46.以后寫程序,將所有的Typedef、#define、常量的定義都放在一個頭文件MacroandConst.h中。47.C中的頭文件經(jīng)常會用到枚舉法這個概念,比如說吧,在頭文件中,經(jīng)常會出現(xiàn)以下的:enum{black,blue,red,???}color;在程序中是這樣處理的。switch{case black: do something;break;case red:do something;break;???}這里情況默認的情況是這樣的,black=0;blue=1;red=2;??所以稱之為枚舉法。當然也可以對初始的那個顏色賦值,例如:black=1;那么后面的數(shù)就會都加1.枚舉法在頭文件中經(jīng)常會用到,要熟加掌握。
48.頭文件的定義中,如果代碼寫到了另外一行,一般情況下,要加上續(xù)行指令。續(xù)行指令的符號為“/”。
第二篇:軟件編程規(guī)范總結(jié)
軟件編程規(guī)范總結(jié)
本規(guī)范的內(nèi)容包括:基本原則、布局、注釋、命名規(guī)則、變量常量與類型、表達式與語句、函數(shù)與過程、可靠性、可測性、斷言與錯誤處理等。
一、基本原則
1.2.3.4.5.6.7.保持代碼的簡明清晰,避免過分的編程技巧。所有的代碼盡量遵循ANSI C標準。
編程時首先達到正確性,其次考慮效率。避免或少用全局變量。盡量避免使用GOTO語句。盡可能重用、修正老的代碼。盡量減少同樣的錯誤出現(xiàn)的次數(shù)。
二、文件布局
1.頭文件必須要避免重復(fù)包含。
2.包含標準庫頭文件用尖括號 <>,包含非標準庫頭文件用雙引號 “”。3.遵循統(tǒng)一的順序書寫類的定義及實現(xiàn)。類的定義(在定義文件中)按如下順序書寫:
公有屬性
公有函數(shù)
保護屬性
保護函數(shù)
私有屬性
私有函數(shù)
類的實現(xiàn)(在實現(xiàn)文件中)按如下順序書寫:
構(gòu)造函數(shù)
析構(gòu)函數(shù) 公有函數(shù) 保護函數(shù) 私有函數(shù)
4.程序中一行的代碼和注釋不能超過80列。5.定義指針類型的變量,*應(yīng)放在變量前。
6.源程序中關(guān)系較為緊密的代碼應(yīng)盡可能相鄰。iLength iWidth = 10;
= 5;// 矩形的長與寬關(guān)系較密切,放在一起。
StrCaption = “Test”;
7.禁止使用TAB鍵,必須使用空格進行縮進。縮進為4個空格。
8.程序的分界符‘{’和‘}’應(yīng)獨占一行并且位于同一列,同時與引用它們的語句左對齊。{ }之內(nèi)的代碼塊使用縮進規(guī)則對齊。
9.if、else、else if、for、while、do等語句自占一行,執(zhí)行語句不得緊跟其后。不論執(zhí)行語句有多少都要加 { }。
if(varible1 < varible2){
varible1 = varible2;}
10.11.聲明類的時候,public、protected、private關(guān)鍵字與分界符{} 對齊,這些部分的內(nèi)容要進行縮進。
12.結(jié)構(gòu)型的數(shù)組、多維的數(shù)組如果在定義時初始化,按照數(shù)組的矩陣結(jié)構(gòu)分行書寫。13.相關(guān)的賦值語句等號對齊。
14.在switch語句中,每一個case分支和default要用{ }括起來,{ }中的內(nèi)容需要縮進。
15.不同邏輯程序塊之間要使用空行分隔。16.一元操作符如“!”、“~”、“++”、“--”、“*”、“&”(地址運算符)等前后不加空格。“[]”、“.”、“->”這類操作符前后不加空格。
17.多元運算符和它們的操作數(shù)之間至少需要一個空格。18.關(guān)鍵字之后要留空格。(if、for、while等關(guān)鍵字之后應(yīng)留一個空格再跟左括號‘(’,以突出關(guān)鍵字。)
19.函數(shù)名之后不要留空格。(函數(shù)名后緊跟左括號‘(’,以與關(guān)鍵字區(qū)別。)20.(’向后緊跟,‘)’、‘,’、‘;’向前緊跟,緊跟處不留空格。‘,’之后要留空格。‘;’不是行結(jié)束符號時其后要留空格。
21.長表達式(超過80列)要在低優(yōu)先級操作符處拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要進行適當?shù)目s進,使排版整齊。
22.函數(shù)聲明時,類型與名稱不允許分行書寫。
三、注釋
1.一般情況下,源程序有效注釋量必須在20%以上。2.注釋符與注釋內(nèi)容之間要用一個空格進行分隔。
3.文件頭部必須進行注釋,包括:.h文件、.c文件、.cpp文件、.inc文件、.def文件、編譯說明文件.cfg等。
4.函數(shù)頭部應(yīng)進行注釋,列出:函數(shù)的目的/功能、輸入?yún)?shù)、輸出參數(shù)、返回值、訪問和修改的表、修改信息等。
5.包含在{ }中代碼塊的結(jié)束處應(yīng)加注釋,便于閱讀。特別是多分支、多重嵌套的條件語句或循環(huán)語句。
void Main(){
if(…){
… while(…)
{
…
} /* end of while(…)*/ …
} /* end of if(…)*/ // 指明是哪條語句結(jié)束 } /* end of void main()*/
// 指明函數(shù)的結(jié)束 // 指明該條while語句結(jié)束
6.保證代碼和注釋的一致性。修改代碼同時修改相應(yīng)的注釋,不再有用的注釋要刪除。7.注釋應(yīng)與其描述的代碼相近,對代碼的注釋應(yīng)放在其上方或右方(對單條語句的注釋)相鄰位置,不可放在下面,如放于上方則需與其上面的代碼用空行隔開。
8.全局變量要有詳細的注釋,包括對其功能、取值范圍、訪問信息及訪問時注意事項等的說明。
9.注釋與所描述內(nèi)容進行同樣的縮排。
10.對分支語句(條件分支、循環(huán)語句等)必須編寫注釋。11.盡量避免在注釋中使用縮寫,特別是不常用縮寫。
四、命名規(guī)則
1.標識符要采用英文單詞或其組合,便于記憶和閱讀,切忌使用漢語拼音來命名。嚴格禁止使用連續(xù)的下劃線,下劃線也不能出現(xiàn)在標識符頭或結(jié)尾(預(yù)編譯開關(guān)除外)。
2.程序中不要出現(xiàn)僅靠大小寫區(qū)分的相似的標識符。
3.用正確的反義詞組命名具有互斥意義的變量或相反動作的函數(shù)等。
4.宏、常量名都要使用大寫字母, 用下劃線 ‘_’分割單詞。預(yù)編譯開關(guān)的定義使用下劃線 ‘_’開始。
5.變量名長度應(yīng)小于31個字符,以保持與ANSI C標準一致。不得取單個字符(如i、j、k等)作為變量名,但是局部循環(huán)變量除外。
6.程序中局部變量不要與全局變量重名。7.使用一致的前綴來區(qū)分變量的作用域。
g_
:全局變量 s_
:模塊內(nèi)靜態(tài)變量
空:局部變量不加范圍前綴
8.使用一致的小寫類型指示符作為前綴來區(qū)分變量的類型。說明:常用變量類型前綴列表如下:
i
: int
f
: float d : double c
: char uc
: unsigned char 或 BYTE l : long p
: pointer b
: BOOL h : HANDLE w
: unsigned short 或 WORD dw : DWORD或 unsigned long a
:數(shù)組,array of TYPE str
:字符串 t :結(jié)構(gòu)類型
9.完整的變量名應(yīng)由前綴+變量名主體組成,變量名的主體應(yīng)當使用“名詞”或者“形容詞+名詞”,且首字母必須大寫。
float g_fValue;10.函數(shù)名用大寫字母開頭的單詞組合而成,且應(yīng)當使用“動詞”或者“動詞+名詞”(動賓詞組)。
11.結(jié)構(gòu)名、聯(lián)合名、枚舉名由前綴T_ 開頭。事件名由前綴EV_ 開頭。12.標識符前最好不加項目、產(chǎn)品、部門的標識。
五、變量常量與類型
1.定義全局變量時必須仔細分析,明確其含義、作用、取值范圍及與其它全局變量間的關(guān)系。
2.明確全局變量與操作此全局變量的函數(shù)或過程的關(guān)系。3.一個變量有且只有一個功能,不能把一個變量用作多種用途。4.循環(huán)語句與判斷語句中,不允許對其它變量進行計算與賦值。5.宏定義中如果包含表達式或變量,表達式和變量必須用小括號括起來。6.使用宏定義多行語句時, 必須使用 { } 把這些語句括起來。
建議:
? 盡量構(gòu)造僅有一個模塊或函數(shù)可以修改、創(chuàng)建的全局變量,而其余有關(guān)模塊或函數(shù)只能訪問。
? 對于全局變量通過統(tǒng)一的函數(shù)訪問。
? 盡量使用const說明常量數(shù)據(jù),對于宏定義的常數(shù),必須指出其類型。? 最好不要在語句塊內(nèi)聲明局部變量。
7.結(jié)構(gòu)和聯(lián)合必須被類型化。typedef struct {
char acName[NAME_SIZE];WORD wScore;} T_Student;
T_Student *ptStudent;
建議:
? 使用嚴格形式定義的、可移植的數(shù)據(jù)類型,盡量不要使用與具體硬件或軟件環(huán)境關(guān)系密切的變量。
? 結(jié)構(gòu)是針對一種事務(wù)的抽象,功能要單一,不要設(shè)計面面俱到的數(shù)據(jù)結(jié)構(gòu)。? 不同結(jié)構(gòu)間的關(guān)系要盡量簡單,若兩個結(jié)構(gòu)間關(guān)系較復(fù)雜、密切,那么應(yīng)合為一個結(jié)構(gòu)。
? 結(jié)構(gòu)中元素的個數(shù)應(yīng)適中。若結(jié)構(gòu)中元素個數(shù)過多可考慮依據(jù)某種原則把元素組成不同的子結(jié)構(gòu),以減少原結(jié)構(gòu)中元素的個數(shù)。
? 仔細設(shè)計結(jié)構(gòu)中元素的布局與排列順序,使結(jié)構(gòu)容易理解、節(jié)省占用空間,并減少引起誤用現(xiàn)象,對于結(jié)構(gòu)中未用的位明確地給予保留。
? 結(jié)構(gòu)的設(shè)計要盡量考慮向前兼容和以后的版本升級,并為某些未來可能的應(yīng)用保留余地(如預(yù)留一些空間等)。
? 合理地設(shè)計數(shù)據(jù)并使用自定義數(shù)據(jù)類型,盡量減少沒有必要的數(shù)據(jù)類型默認轉(zhuǎn)換與強制轉(zhuǎn)換。
? 當聲明數(shù)據(jù)結(jié)構(gòu)時,必須考慮機器的字節(jié)順序、使用的位域及字節(jié)對齊等問題。
六、表達式與語句
1.在表達式中使用括號,使表達式的運算順序更清晰。
if(((iYear % 4 == 0)&&(iYear % 100!= 0))||(iYear % 400 == 0))2.避免表達式中的附加功能,不要編寫太復(fù)雜的復(fù)合表達式。3.不可將浮點變量用“==”或“!=”與任何數(shù)字比較。
4.應(yīng)當將指針變量用“==”或“!=”與NULL比較。
5.在switch語句中,每一個case分支必須使用break結(jié)尾,最后一個分支必須是default分支。
6.不可在for 循環(huán)體內(nèi)修改循環(huán)變量,防止for 循環(huán)失去控制。
建議:
? 循環(huán)嵌套次數(shù)不大于3次。
? do while語句和while語句僅使用一個條件。? 當switch語句的分支比較多時,采用數(shù)據(jù)驅(qū)動方式。
如果循環(huán)體內(nèi)存在邏輯判斷,并且循環(huán)次數(shù)很大,宜將邏輯判斷移到循環(huán)體的外面。
? for語句的循環(huán)控制變量的取值采用“半開半閉區(qū)間”寫法。? 在進行“==”比較時,將常量或常數(shù)放在“==”號的左邊。
七、參數(shù)
1.如果函數(shù)沒有參數(shù),則用void填充。
void SetValue(int iWidth, int iHeight);float GetValue(void);2.如果參數(shù)是指針,且僅作輸入用,則應(yīng)在類型前加const。(防止該指針在函數(shù)體內(nèi)被意外修改。)
3.當結(jié)構(gòu)變量作為參數(shù)時,應(yīng)傳送結(jié)構(gòu)的指針而不傳送整個結(jié)構(gòu)體,并且不得修改結(jié)構(gòu)中的元素,用作輸出時除外。
4.不要省略返回值的類型,如果函數(shù)沒有返回值,那么應(yīng)聲明為void類型。5.對于有返回值的函數(shù),每一個分支都必須有返回值。(為了保證對被調(diào)用函數(shù)返回值的判斷,有返回值的函數(shù)中的每一個退出點都需要有返回值)
6.對輸入?yún)?shù)的正確性和有效性進行檢查。7.防止將函數(shù)的參數(shù)作為工作變量。
void SumData(int iNum, int *piData, int *piSum){
int iCount;
int iSumTmp;// 存儲“和”的臨時變量
iSumTmp = 0;
for(iCount = 0;iCount < iNum;iCount++)
{
iSumTmp += piData[iCount];}
*piSum = iSumTmp;} 反例:
void SumData(int iNum, int *piData, int *piSum){
int iCount;
*piSum = 0;
for(iCount = 0;iCount < iNum;iCount++){
*piSum += piData[iCount];// piSum成了工作變量,不好。} }
8.必須對所調(diào)用函數(shù)的錯誤返回值進行處理。(函數(shù)返回錯誤,往往是因為輸入的參數(shù)不合法,或者此時系統(tǒng)已經(jīng)出現(xiàn)了異常。如果不對錯誤返回值進行必要的處理,會導(dǎo)致錯誤的擴大,甚至導(dǎo)致系統(tǒng)的崩潰。)
八、可靠性
1.在程序編制之前,必須了解編譯系統(tǒng)的內(nèi)存分配方式,特別是編譯系統(tǒng)對不同類型的變量的內(nèi)存分配規(guī)則,如局部變量在何處分配、靜態(tài)變量在何處分配等。
2.防止內(nèi)存操作越界。
3.必須對動態(tài)申請的內(nèi)存做有效性檢查,并進行初始化;動態(tài)內(nèi)存的釋放必須和分配成對以防止內(nèi)存泄漏,釋放后內(nèi)存指針置為NULL。
4.變量在使用前應(yīng)初始化,防止未經(jīng)初始化的變量被引用。5.指針類型變量必須初始化為NULL。6.指針不要進行復(fù)雜的邏輯或算術(shù)操作。
7.如果指針類型明確不會改變,應(yīng)該強制為const類型的指針,以加強編譯器的檢查。8.減少指針和數(shù)據(jù)類型的強制類型轉(zhuǎn)化。9.移位操作一定要確定類型。
10.對變量進行賦值時,必須對其值進行合法性檢查,防止越界等現(xiàn)象發(fā)生。11.類中的屬性應(yīng)聲明為private,用公有的函數(shù)訪問。
12.在編寫派生類的賦值函數(shù)時,注意不要忘記對基類的成員變量重新賦值。13.構(gòu)造函數(shù)應(yīng)完成簡單有效的功能,不應(yīng)完成復(fù)雜的運算和大量的內(nèi)存管理。14.不要在棧中分配類的實例,也不要生成全局類實例。
15.正確處理拷貝構(gòu)造函數(shù)與賦值函數(shù)。
16.過程/函數(shù)中申請的(為打開文件而使用的)文件句柄,在過程/函數(shù)退出之前要關(guān)閉,除非要把這個句柄傳遞給其它函數(shù)使用。
九、可測試性
1.在同一項目組或產(chǎn)品組內(nèi),為準備集成測試和系統(tǒng)聯(lián)調(diào),要有一套統(tǒng)一的調(diào)測開關(guān)及相應(yīng)信息輸出函數(shù),并且要有詳細的說明。統(tǒng)一的調(diào)試接口和輸出函數(shù)由模塊設(shè)計和測試人員根據(jù)項目特性統(tǒng)一制訂,由項目系統(tǒng)人員統(tǒng)一納入系統(tǒng)設(shè)計中。
2.在同一個項目組或產(chǎn)品組內(nèi),調(diào)測打印出的信息串要有統(tǒng)一的格式。信息串中應(yīng)當包含所在的模塊名(或源文件名)及行號等信息。
3.在編寫代碼之前,應(yīng)預(yù)先設(shè)計好程序調(diào)試與測試的方法和手段,并設(shè)計好各種調(diào)測開關(guān)及相應(yīng)測試代碼(如打印函數(shù)等)。
十、斷言與錯誤處理
1.整個軟件系統(tǒng)應(yīng)該采用統(tǒng)一的斷言。如果系統(tǒng)不提供斷言,則應(yīng)該自己構(gòu)造一個統(tǒng)一的斷言供編程時使用。
2.使用斷言捕捉不應(yīng)該發(fā)生的非法情況。不要混淆非法情況與錯誤情況之間的區(qū)別,后者是必然存在的并且是一定要作出處理的。
3.指向指針的指針及更多級的指針必須逐級檢查。4.對較復(fù)雜的斷言加上明確的注釋。
5.用斷言保證沒有定義的特性或功能不被使用。
6.用調(diào)測開關(guān)來切換軟件的DEBUG版和RELEASE版,而不要同時存在RELEASE版本和DEBUG版本的不同源文件,以減少維護的難度。
7.正式軟件產(chǎn)品中應(yīng)把斷言及其它調(diào)測代碼去掉(即把有關(guān)的調(diào)測開關(guān)關(guān)掉)。8.在軟件系統(tǒng)中設(shè)置與取消有關(guān)測試手段,不能對軟件實現(xiàn)的功能等產(chǎn)生影響。9.用斷言來檢查程序正常運行時不應(yīng)發(fā)生但在調(diào)測時有可能發(fā)生的非法情況。
第三篇:軟件編程實習(xí)總結(jié)_工作總結(jié)
軟件編程實習(xí)總結(jié)_工作總結(jié)
實習(xí)時間:3月1日———5月9日 實習(xí)地點:廣州xx大學(xué)生實訓(xùn)基地 實訓(xùn)目標:
1.通過系統(tǒng)性的實訓(xùn),熟練掌握java se、java ee知識體系,具備java開發(fā)經(jīng)驗;
2.了解企業(yè)軟件開發(fā)流程規(guī)范,初步具備正確的軟件開發(fā)編程思路,掌握軟件開發(fā)的基本方法,養(yǎng)成規(guī)范化項目開發(fā)習(xí)慣; 3.以項目案例帶動實訓(xùn),以企業(yè)開發(fā)為基礎(chǔ),對參加實訓(xùn)學(xué)生進行項目分組管理,學(xué)生需按要求完成每天布置的項目案例,實訓(xùn)結(jié)束時必須按要求完成多個項目開發(fā)工作,通過案例練習(xí)、企業(yè)項目開發(fā)、評審,使學(xué)生初步具備軟件開發(fā)的實戰(zhàn)能力; 實習(xí)單位概述:xx科技以中關(guān)村科技園區(qū)為依托,在中國軟件業(yè)發(fā)達城市——北京、上海、廣州、深圳、大連、南京、武漢、杭州、西安、蘇州、成都、太原等20大城市,建立了近40家培訓(xùn)中心,占地2萬平米,年培訓(xùn)1萬多名軟件人才。已累計為ibm、微軟、摩托羅拉、華為、中軟、用友、yahoo、阿里巴巴、tom、新浪、搜狐、百度、聯(lián)想、神州數(shù)碼、大唐電信、亞信等知名it企業(yè)培養(yǎng)輸送了7萬多名中高級軟件人才,目前xx全國擁有600多名員工,年產(chǎn)值近2億元,是中國領(lǐng)先的中高端軟件人才培訓(xùn)機構(gòu)。xx科技目前提供的職業(yè)培訓(xùn)包括:外企軟件開發(fā)工程師、軟件測試工程師、oracle數(shù)據(jù)庫管理員、unix系統(tǒng)
管理員、網(wǎng)絡(luò)系統(tǒng)工程師。實習(xí)概況:
1.java語言簡介。包括java的發(fā)展、java語言的特點、java應(yīng)用程序的運行機制和環(huán)境、java的垃圾回收機制、java開發(fā)環(huán)境的安裝和配置和java源程序的編譯和運行等。
其中,配置java開發(fā)環(huán)境時,需要修改環(huán)境變量(先在系統(tǒng)變量中新建一個java_home的變量,將其值設(shè)置為jdk1.6.0的安裝路徑;然后修改path變量,在該變量值類加入路:%java_home%bin;%java_home%jrebin;接著再修改classpath變量,若沒有手動加入,在其值類加入路徑:.;最后利用javac-version測試java的版本);在編譯和運行java源程序時,先使用javac *.java進行編譯,再利用java *進行運行。
2.java基本語法。包括java的命名規(guī)范、注釋、標識符、數(shù)據(jù)類型、變量、運算符、表達式、控制語句等。其中,java的命名規(guī)范包括:以字母(unicode)﹑“$”﹑“—”﹑為開頭。第二個字符開始是字母(unicode)、數(shù)字、“$”﹑“—”,不限制長度,不能是 java的關(guān)鍵字,區(qū)分大小寫和可以是中文;java的基本數(shù)據(jù)類型有八種:整型類型(byte,short,int,long)、浮點類型(float,double)、字符型(char)和布爾型(boolean);java的控制語句包括:選擇語句(if-else,switch-case)、循環(huán)語句(for,do-while,while)和循環(huán)跳轉(zhuǎn)語句(break結(jié)束整個
循,continue結(jié)束本次循環(huán))。
3.mysql數(shù)據(jù)庫基本指令。包括創(chuàng)建、查詢、刪除數(shù)據(jù)庫和表,向表中添加、刪除、更新數(shù)據(jù)和查詢表,修改表的結(jié)構(gòu)等。其中,列出數(shù)據(jù)庫實例和表: show databases; show tables; 使用數(shù)據(jù)庫實例: use databasename; 顯示表中列的屬性: desc tablename; 創(chuàng)建一張表:
create table tablename(屬性及其數(shù)據(jù)類型); 查詢數(shù)據(jù):
select * from tablename(where id=); 添加數(shù)據(jù):
insert into tablename(屬性1,...)values(屬性值1,...);刪除數(shù)據(jù):
delete from tablename(where id=); 更新數(shù)據(jù):
update tablename set 字段名=??,字段名
=??(where id=); 表結(jié)構(gòu)的修改,如增加一個字段格式:
alter table tablename add column(字段名,字段類型); 4.數(shù)組的介紹。包括數(shù)組的申明,初始化(靜態(tài)和動態(tài)初始化),數(shù)組的訪問、遍歷和復(fù)制等。
5.string中一些api方法。如找到指定位置的字符charat(int index),求字符串的長度length(),字符串的連接concat、判斷字符串是否以指定的字符結(jié)束engswith(‘c’)、判斷兩個字符串是否相等equal等。
6.接口的介紹。包括collection、list、hashmap等,以及這些接口的一些api的使用。7.類的封裝和重載。
8.mysql數(shù)據(jù)庫與myeclipse的連接,需要在工程中導(dǎo)
第四篇:軟件編程學(xué)習(xí)心得
軟件編程學(xué)習(xí)心得
隨著計算機技術(shù)的發(fā)展和工作的需要,為了能夠更好的維護公司生產(chǎn)管理系統(tǒng);公司安排我們到北大青鳥APTECH進修。我們選擇了時下最流行、發(fā)展速度較快的語言C#。C#學(xué)習(xí)共分三個階段,目前我只學(xué)習(xí)了第一個階段;現(xiàn)將我在北大青鳥學(xué)習(xí)第一階段為期兩個月的學(xué)習(xí)心得總結(jié)如下:
C#是一種新的面向?qū)ο蟮木幊陶Z言,專門用于.NET運行時。C#編譯器只能生成受管制的代碼,也可以使用.NET基類。C#語言自C/C++演變而來。但是,它具有簡單、現(xiàn)代、完全面向?qū)ο蠛皖愋桶踩戎T多特性。下面就簡單說說簡單和現(xiàn)代其中兩種特性。
1、簡單
C#具有C++所沒有的一個優(yōu)勢就是學(xué)習(xí)簡單。該語言首要的目標就是簡單。很多功能(還不如說是缺少了C++的一些功能)有助于C#全方位的簡單。
在C#中,沒有C++中流行的指針。默認地,您工作在受管理的代碼中,在那里不允許如直接存取內(nèi)存等不安全的操作。我想沒有C++程序員可以聲稱,從沒有使用指針訪問過不屬于他們的內(nèi)存。
C#棄用其它操作符,名字空間、成員和引用僅使用單個操作符 “.”。現(xiàn)在一個程序員所需要理解的就是嵌套名字的注解了。
C#使用統(tǒng)一的類型系統(tǒng)。這種系統(tǒng)充許您把各種類型作為一個對象查看,它是一個原始類型還是一個full-blown 類。和其它編程語言相比,由于加框(boxing)和消框(unboxing)的機制,把簡單類型當作對象處理并不能獲得性能的改善。稍后將詳細解釋加框和消框,但基本上僅當需要時才使用對象訪問簡單類型這種技術(shù)。
2、現(xiàn)代
投入學(xué)習(xí)C#的努力是一筆大投資,因為C#是為編寫NGWS 應(yīng)用程序的主要語言而設(shè)計。很多用C++可以實現(xiàn)或者很費力實現(xiàn)的功能,在C#中不過是一部分基本的功能而已。根據(jù)應(yīng)用程序的特殊需求,可以很容易地創(chuàng)建出新的一種數(shù)據(jù)類型。
指針不再是編程武器的一部分。運行時NGWS提供了一個垃圾收集器,負責(zé)C#程序中的內(nèi)存管理。因內(nèi)存和應(yīng)用程序都受到管理,所以很必要增強類型安全,以確保應(yīng)用的穩(wěn)定性。
異常處理是C#的主要功能。C#的異常處理與C++的不同點在于它是交叉語言的(運行時的另一個功能)。在沒有C#之前,您必須處理怪異的HRESULTs,但現(xiàn)在由于使用了基于異常的健壯的出錯處理,這一切都結(jié)束了。
對于現(xiàn)代的應(yīng)用程序,安全是首要的,C#也不會例外。它提供了元數(shù)據(jù)語法,用于聲明下述NGWS安全模式的能力和許可。元數(shù)據(jù)是NGWS運行時的一個關(guān)鍵的概念。
通兩個多月學(xué)習(xí),我能夠很好的掌握C#語言的基本語句、語法以及老師補充的一些要點;能夠編寫簡單的應(yīng)用程序,例如電子郵件的收發(fā)等,為接下來的第二、第三階段學(xué)習(xí)打下了良好的基礎(chǔ)。
第五篇:用友軟件錯誤91問題匯總
[學(xué)習(xí)] 用友軟件錯誤91問題匯總
用友軟件, 匯總用友軟件, 匯總
1.在總賬中,查詢管理費用時報“7-內(nèi)存溢出”或“未設(shè)置對象變量,運行時91錯誤”。此問題請檢查機器環(huán)境: 機器名是否含特殊字符或中文,登陸操作系統(tǒng)的操作員名是否含特殊字符或中文,其權(quán)限是否為超級管理員或高級用戶.重新注冊軟件的所有組件,可使用通網(wǎng)站服務(wù)工具中的維護通2.0中的三十九號工具進行注冊.清空系統(tǒng)臨時文件夾,路徑:C:Documents and SettingsAdministratorLocal
SettingsTemp 如問題未解決,請將賬套引入到其它機器確定是否為數(shù)據(jù)問題.2.在總賬記賬時提示“運行時錯誤 91,未設(shè)置對象變量或With block 變量”。
總賬中遇到這種錯誤,可能就是和計算機名稱、登陸賬戶有關(guān)。計算機名稱最好是全英文的,登陸賬戶也應(yīng)該用英文名。查看登陸操作系統(tǒng)的用戶具有什么權(quán)限,我們要求必須是超級用戶以上的權(quán)限才可以。
3.客戶在使用薪資統(tǒng)計查詢時,出現(xiàn)“91號錯誤,未設(shè)置對象變量或With block 變量”同時個人工資統(tǒng)計查詢表不可用,不能查詢出
結(jié)果
此問題是因為組件丟失所致請重新注冊一下組件或是重新安裝一下軟件
4.銷售發(fā)票列表聯(lián)查銷售發(fā)票,出錯“運行錯誤91”
開發(fā)已做出補丁,請上網(wǎng)下載相應(yīng)版本的補丁。補丁路徑:用友通10.2標準版:tongserver補丁包補丁包用友通10.2補丁包標準版2007-11-05星期一23335-23067用友通10.2工業(yè)版tongserver補丁包補丁包用友通10.2補丁包工業(yè)版2007-11-05星期一23335-
23067
5.查詢賬表時提示,運行時錯誤91,服務(wù)器為2000server可以正常登陸,客戶端為xp出現(xiàn)此問題< /font>
使用服務(wù)工具中的維護通2.0中的工具三十九把客戶端的組件重新注冊一下,或卸載客戶端軟件,刪除system32 fcomsql這個文件夾,然后再
重新安裝軟件。
6.憑證無法打印,預(yù)覽時提示“運行時錯誤91,未設(shè)置變量或with block”。
先檢查機器名是否為純英文,不允許有._%等特殊字符;2.如果正常,則刪除ZWSQLTemp.mdb文件,重新登錄產(chǎn)品,文件保存位置:ZWSQLTemp.mdb默認路徑(XXX:指系統(tǒng)登錄帳戶)操作系統(tǒng)路徑Documents and SettingsXXXLocal SettingsTemp,此路徑即系統(tǒng)環(huán)境變量中用戶變量的Tmp變量值(參見系統(tǒng)環(huán)境參數(shù)章),如C:Documentsand SettingsAdministrator Local SettingsTemp;3.如果不行,請使用注冊組件的工具,下載:http: //tong.ufida.com.cn/infomanage/qudao/ewebeditor/UploadFile/***.rar還解決不了,請重新安裝
軟件,卸載完軟件后,刪除c:windowsystem32下的ufcomsql文件夾,再裝。
7.新裝系統(tǒng),安裝用友通10.1plus2后,運行自定義轉(zhuǎn)帳、期間損益結(jié)轉(zhuǎn)、查詢明細賬時均報錯“運行時錯誤91”。卸載軟件,刪除
ufcomsql后重裝軟件問題依舊。
用for %%s in(%windir%system32ufcomsql*.dll)do regsvr32.exe/s %%s
for %%s in(%windir%system32ufcomsql*.ocx)do regsvr32.exe/s %%s
注冊后問題依舊。
此提示有這個幾種情況
1、登錄系統(tǒng)的操作員不夠
2、登錄系統(tǒng)的操作員是中文名
3、ZWSQLTemp.mdb出錯,此文件存于操作系統(tǒng)路徑Documents
and SettingsXXXLocal SettingsTemp,刪除掉即可,所以建立一個新的只有英文字母的操作員來登錄系統(tǒng)。
8.在查詢明細賬時提示“運行時錯誤91,未設(shè)置對象變量或withblock變量”。
請看一下機器名和登陸操作系統(tǒng)的用戶名有沒有特殊符號,或帶有中文名,如有請將機器名修改為純英文的,增加一個純英文的操作系統(tǒng)用戶。
如過沒有,那請將軟件進行卸載,刪除system32下的ufcomsql文件夾,重新安裝軟件。
9.用戶在安裝用友通普及版10.2時,在進行打印設(shè)置時,打印預(yù)覽憑證時,提示:“運行時錯誤91未設(shè)置對象變量或 WITH BLOCK變量”。此時自動退出.此后進入填制憑證時,剛又提示:“運行時錯誤429ACTIVEX.部件不能創(chuàng)建對象”.重新注冊后,才可進行填制憑證界
面。已經(jīng)試過重裝軟件.等一些操作,仍不能解決問題。
有控件沒有注冊上,重新注冊下列文件:ufmoney.ocx,ufrtpm.ocx,uszzpub.dll, usnate.dll2.硬盤可能有壞道,換一個硬盤安裝軟件 3.重
裝軟件沒刪除干凈,請重裝前把安裝目錄和注冊表以及c:windowsystem32ufcomsql 刪除
10.點擊如憑證打印,明細賬查詢,打印等查詢和打印時都提示“運行時錯誤91,未設(shè)置對象變量或with& nbsp;block 變量”。請檢查登陸操作系統(tǒng)的用戶名是否為中文名,計算機名稱是否帶有特殊符號,或是以中文開頭,這兩者最好是全英文的。2.請將軟件進行卸
載,然后停止mssqlserver服務(wù)(開始/運行/netstop mssqlserver),刪除ufcomsql文件夾,再啟動mssqlserver服務(wù),重裝軟件。
11.在總賬模塊中,在進行月末結(jié)賬時提示為"運行錯誤91"不能進行結(jié)賬。
請檢查一下機器名是否帶有特殊符號或以數(shù)字開頭,機器名最好是純英文的,還有登陸操作系統(tǒng)的用戶名也應(yīng)該上以英文字母開頭,不能帶特
殊符號。
12.一客戶有普及版總賬.出現(xiàn)很多報錯.能做憑證其他的什么都不能做.包括打印.提示"運行錯誤91未設(shè)置對象變量或 withblock變量".如果重新注冊再進問題又發(fā)生變化了可能不能做憑證但能做其他的一項.不知是什么原因造成的.安裝時沒有任
何報錯。
請按如下操作假如操作系統(tǒng)安裝在c盤下 打開開始里的運行輸入xp版本:regsvr32 c:windowssystem32ufcomsqlufmoney.ocx2000
版本:regsvr32 c:winntsystem32ufcomsqlufmoney.ocx提示成功。
13.固定資產(chǎn)減少時報錯DAO-ADO對象模型,然后“運行時錯誤91”,“運行時錯誤440”
請檢查機器名字是否為純英文(不要有-號等特殊字符);請檢查卡片項目中是否有特殊字符。