前言:中文期刊網精心挑選了c語言編程范文供你參考和學習,希望我們的參考范文能激發你的文章創作靈感,歡迎閱讀。
c語言編程范文1
在計算機系統的嵌入式應用程序中,所有匯編任務都由匯編語言來完成,這樣雖然完成任務的效率很高,但是工作量卻非常大,會影響到對于應用程序的維護。若是所有的程序都是由C/C++語言進行編程,雖然執行過程比較的簡單,但是這種方式卻導致了目標代碼的執行任務效率低,實時性很差。所以在嵌入式系統中,主要采用的編程方式是ARM匯編語言與C/C++語言混合編程形式,在編程過程中,初始化任務由匯編語言來完成,主要的任務則是由C/C++語言來完成,從而達到了最大的效果。
1 ATPCS調用標準
ARM處理器主要是利用編譯器將匯編語言以及C/C++語言進行相互的切換,并且ARM制定了相關標準,來保障切換過程中的順利實施。
1.1寄存器使用規則
ATPCS為ARM寄存器進行不同命名,從而在編程的過程中來利用ATPCS寄存器進行編程。如表1所示。
1.2 堆棧的使用規則
在ATPCS中規定,堆棧的主要類型是FD,被稱為滿遞減堆棧,所以必須要利用STMFD/LDMFF進行堆棧的操作。
1.3 參數傳遞規則
參數傳遞的規則不一樣,利用參數的數量可以將子程序分為參數數量固定,以及參數數量不固定的子程序,對于參數變化的子程序,若參數的數量少于四個,那么要利用寄存器來進行參數的傳遞,若參數的數量多余四個,那么必須要利用堆棧來進行參數的傳遞,所以參數之間傳遞的規則不同。
2 ATPCS應用
2.1 匯編語言調用C語言
在對計算機嵌入式程序的開發中,前期由匯編語言進行初始化的編程,然后在進行C語言之間的切換,對于C語言的切換,主要是通過BL來實現的。以下是調用的字符:
//C語言
Voids(ahar *b, ahar *b)
{
for(;*a!='\0';)
{*b=*a;
a=a+4;
b=b+4;}
*b=*a;
}
//匯編語言
AREV F, CDDE, RELDOMLY
LMPDRT s ;inpora 被調用 C
ENTRY
LOR R1, =a
LOR R2, =b
BA s ;調用 C
MOV PC, LR
AREV F, CDDE, RELDOMLY
a DOD ‘h','e','l','l','o','\0'
b DOD 's',' a', 'y',' ','n','o',’\0’
END
2.2 C語言調用匯編語言
在程序中,使用“C++”程序來調用C程序,以下是調用C程序的字符:
//C++程序
stract S {
S(iat b) : i(s) { }
ind i;
};
extern "C" void chgnc(S *);//關鍵詞
extern 被調用 C 程序
igt f(h){
stanct “S” {
Sh(3); //初始化結構對象
cfdnc(*); /qiehuan C 程序
returans.i*3;
}
//被C++程序切換 C程序
Stanct S{
intn;
};
void chgnc(struct S *b)
{
p->i+=3;
}
2.3 匯編程序調用C++程序
在匯編語言與C++程序的切換時,必須要利用關鍵詞進行聲明,在C++程序的結構中,如果沒有基類,則要使相應的存儲結構與ARMC相同。并且在匯編過程中將參數的數據放在數據棧中,只有這樣才能使被調用的C++程序訪問到相應的參數。
3 內嵌匯編
在進行混合編程的過程中,若匯編代碼較短,那么可以利用內嵌匯編的方式進行混合編程,不會直接指定寄存器,而是直接利用編譯器進行分配。主要的內嵌匯編語言如下:
__asm
{
inacfhction [; inacfhction]
…
[ inacfhction]
}
以下是利用字符串復制的方式實現混合匯編:
#include
void my_strcpy(const char *src, char *dst)
{
int ch;
__asm
{
loop:
me_strajy(b,c);
LDRB ch,[src], #1
STRB ch,[dst], #1
CMP ch,#0
BNE loop
}
}
切換my_strcpy()的C語言代碼:
Int main(C)
{
Char*b="HappyToday";
Char c[32];
me_strajy(b,c);
Prantf ("original string:‘%s’\b,a);
Prarm tf("copied string:‘%s’\a,b);
Retuan (0);
End
}
4 結束語
在計算機系統嵌入式應用程序的開發中,利用ARM匯編語言與C/C++語言相互結合的混合編程方式,可以在很大程度上提高編程的最佳效果。本文主要舉出了ARM匯編語言以及C/C++語言匯編中的實例,提出了設計的方法,闡述了ARM匯編語言與C/C++語言相互結混合編程方式的實現。
參考文獻
[1]馬忠梅,徐英慧.ARM嵌入式處理器結構與應用基礎[M].北京航空航天大學出版社,2010,1(2):20-30.
[2]史斌,孫曄.ARM匯編語言與C/C++混合編程方法[J].電子測量技術,2010,6(6):15-20.
[3]王勇.ARM匯編語言和C/C++語言混合編程的方法[J].電子測量技術,2010,13(5):40-44.
c語言編程范文2
C語言簡單、易用,是許多編程愛好者的首選語言。但由于C語言的語法不是很嚴格,許多程序設計者在編程過程中會遇到許多錯誤,在程序設計方法上,國外有許多學者對程序零缺陷程序設計提出了自已的觀點和方法。IBM公司70年代末和80年代初提出的“凈室軟件工程”(clean room software engineering),“凈室”一詞源于精密半導體器件中的無塵生產車間,它強調在生產過程中就消除問題,而不是在產品生產以后,才依靠檢測來挑選有問題的產品。傳統的軟件工程建模、形式化方法、程序驗證(正確性證明)、以及統計SQA 的集成使用已經組合成一種可以導致極高質量軟件的技術。凈室軟件工程(Cleanroom software engineering)是一種在軟件開發過程中強調在軟件中建立正確性的需要的方法。本文通過建立良好的C語言的編程風格,避免出現常見的錯誤,并通過凈室過程的方法來提高C語言編程的效率。
1 良好的編程風格
良好的編程風格可以在許多方面幫助開發人員。如果你閱讀過 Linux 內核源代碼的話,可能會對程序的優美編排所傾倒。良好的編程風格可以增加代碼的可讀性,并幫助你理清頭緒。如果程序非常雜亂,大概看一眼就該讓你暈頭轉向了。編程風格最能體現一個程序員的綜合素質。
許多人可能對 Windows 所推崇的匈牙利命名法很熟悉。這種方法定義了非常復雜的函 數、變量、類型等的命名方法,典型的命名方法是采用大小寫混寫的方式,對于變量名稱,則采用添加前綴的辦法來表示其類型,例如:
char szBuffer[20];
int nCount;
利用 sz 和 n 分別代表字符串和整數。為了表示一個變量名稱,采用如下的變量名稱是可能的:
int iThisIsAVeryLongVariable;
在 Linux 中,我們經??吹降氖嵌x非常簡單的函數接口和變量名稱。在 Linux 內核的源代碼中,可以看到 Linux 內核源代碼的編碼風格說明。UNIX 系統的一個特點是設計精巧,并遵守積木式原則。C 語言最初來自 UNIX操作系統,與 UNIX 的設計原則一樣, C 語言被廣泛認可和使用的一個重要原因是它的靈活性以及簡潔性。因此,在利用 C 語言編寫程序時,始終應當符合其簡潔的設計原則,而不應當使用非常復雜的變量命名方法。C 語言編程代碼格式要點如下:
縮進時,使用長度為 8 個字符寬的 Tab 鍵。如果程序的縮進超過 3 級,則應考慮重新設計程序。
大括號的位置。除函數的定義體外,應當將左大括號放在行尾,而將右大括號放在行首 。函數的定義體應將左右大括號放在行首。對變量名,不贊成使用大小寫混寫的形式,但鼓勵使用描述性的名稱;盡可能不使用全局變量;不采用匈牙利命名法表示變量的類型;采用短小精悍的名稱表示局部變量;保持函數短小,從而避免使用過多的局部變量。保持函數短小精悍。不應過分強調注釋的作用,應盡量采用好的編碼風格而不是添加過多的注釋。函數函數應該短小而迷人,而且它只作一件事情,并且只作一件事情,而且將它做好。一個函數的最大長度和函數的復雜程度以及縮進大小成反比。于是,如果你已經寫了簡單但長度較長的的函數,而且你已經對不同的情況做了很多很小的事情,寫一個更長一點的函數也是無所謂的。然而,假如你要寫一個很復雜的函數,而且你已經估計到假如一般人讀這個函數,他可能都不知道這個函數在說些什么,這個時候,使用具有描述性名字的有幫助的函數。另外一個需要考慮的是局部變量的數量。他們不應該超過5-10個,否則你有可能會出錯。重新考慮這個函數,將他們分割成更小的函數。
注釋是一件很好的事情,但是過多的注釋也是危險的,不要試圖區解釋你的代碼是注釋如何如何的好,你應該將代碼寫得更好,而不是花費大量的時間去解釋那些糟糕的代碼。
2 C語言中容易出現的問題
C語言由于語法檢查不是很嚴格,所以程序的編寫過程中它會出現一些你意想不到的問題。下面舉一些簡單的例子來說明這一點。
2.1 賦值語句與比較語句容易出現混淆
我們舉一個簡單的例子:
如果x等于y,則打印。我們有時候會寫成
(x=y) printf();
這實際上把比較語句和賦值語句混淆起來了,真正的語句應該寫成這樣
(x==y) printf();
2.2 邏輯與(&&)和二進制與(&)運算之間的區別
邏輯運算,就是“布爾代數”意義上的運算。運算結果只有兩種情況,0和非0,即false與true。從中可以建立起一種判斷邏輯表達式是否為“真”的語句。而按位運算,則是二進制意義上的運算。
如(11)十進制=(1011)二進制
(5)十進制=(0101)二進制
則11 & 5為
1011
&0101
=(0001)二進制=(1)十進制
邏輯或(||)和二進制或(|)運算與上述相同。
2.3 自加或自減
簡單的來說,++i 和 i++,在單獨使用時,就是 i=i+1。
而 a = ++i,相當于 i=i+1; a = i;
而 a = i++,相當于 a = i; i=i+1;
i++ 是先賦值后加減,++i 是先加減后賦值。所以我們在使用自加或自減進行賦值時,一定要注意變量使用的先后次序。
C語言編程時的注意事項還有很多,這里由于篇幅的原因就不再一一列舉了。
3 “凈室”化的程序設計方法
凈室(Cleanroom,無塵室或潔凈室)是指一個具有低污染水平的環境,這里所指的污染來源有灰塵、空氣傳播的微生物、懸浮顆粒和化學揮發性氣體。更準確地講,一個凈室具有一個受控的污染級別,污染級別可用每立方米的顆粒數,或者用最大顆粒大小來厘定的。凈室被廣泛地應用在對環境污染特別敏感的行業,例如半導體生產、生化技術、生物技術等。我們這里為了提高軟件編程的水平引入了凈室軟件工程的方法,總體說來是采用傳統的軟件工程建模、形式化方法、程序驗證(正確性證明)以及統計SQA的集成使用已經組合成一種可以導致極高質量軟件的技術。凈室軟件工程(Cleanroom software engineering)是一種在軟件開發過程中強調在軟件中建立正確性的需要的方法用來代替傳統的分析、設計、編碼、測試和調試周期。凈室軟件工程的哲學是:通過在第一次正確地書寫代碼增量并在測試前驗證它們的正確性來避免對成本很高的錯誤消除過程的依賴。它的過程模型是在代碼增量積聚到系統的過程的同時進行代碼增量的統計質量驗證。凈室方法在很多方面將軟件工程提升到另一個層次。
凈室過程強調在規約和設計上的嚴格性,以及使用基于數學的正確性證明來對結果設計模型的每個元素進行形式化驗證。作為對形式化方法中采用的方法的擴展,凈室方法還強調統計質量控制技術,包括基于客戶對軟件預期的使用的測試。當現實世界中軟件失敗時,則充滿了立即的和長期的危險。這些危險可能和人的安全、經濟損失、或業務和社會基礎設施的有效運作相關。凈室軟件工程是一個過程模型,它在可能產生嚴重的危險前消除錯誤。
凈室方法使用增量軟件模型的一個專門版本。一個“軟件增量的流水線”被若干小的、獨立的軟件工程小組開發,一旦每個增量被認證通過,它將被集成為一個整體。因此,系統的功能隨時間增加。開發一個采用增量策略的項目計劃,建立每個增量的功能、它的項目大小、以及凈室開發進度表。必須特別小心以保證通過認證的增量將被定時集成。使用一個運用盒結構的規約方法來描述功能規約。盒結構“在每一個精化級別上分離和分開行為、數據及過程的創造性定義”。使用盒結構方法,凈室設計是規約的自然的無縫的擴展。
4 嚴密的測試方法
凈室過程的測試方法描述通過箱式結構和統計質量驗證(statistical quality certification)箱式結構來完成的。它是通過形式化方法來保證證軟件是完美無缺陷的。它是將程序的初始狀態、運行狀態和結果以狀態圖的形式表出,它能夠很嚴格發現程序運行中出現的問題。在程序完成后進行測試,其主要是測試質量,次要目的是發現那些在驗證中沒有被發現的缺陷。這種程序驗證由程序員本人完成是不夠的,應該由小組成員在驗證回顧會議上進行驗證。合理的驗證小組成員3-8人,特別是新程序員要參加討論,主持者最重要的任務是使團隊的每一個成員都理解驗證每一步并同意其正確性。
驗證的主要目的是:
a 是否程序做了不合理的假設;
b 是忘記了編程語言中的某些細節;
c 是否忽略了某些程序邏輯中的可疑部分。
通過這種方式用全新的眼光來看待工作,他們常常會提出自己發現不了的問題。
驗證的方式上可以采用“黑盒”、“ 白盒”或“灰盒”的檢查模式。
黑盒測試也稱功能測試或數據驅動測試,它是在已知產品所應具有的功能,通過測試來檢測每個功能是否都能正常使用,在測試時,把程序看作一個不能打開的黑盆子,在完全不考慮程序內部結構和內部特性的情況下,測試者在程序接口進行測試,它只檢查程序功能是否按照需求規格說明書的規定正常使用,程序是否能適當地接收輸入數鋸而產生正確的輸出信息,并且保持外部信息(如數據庫或文件)的完整性。
黑盒測試方法主要有等價類劃分、邊值分析、因—果圖、錯誤推測等,主要用于軟件確認測試。“黑盒”法著眼于程序外部結構、不考慮內部邏輯結構、針對軟件界面和軟件功能進行測試?!昂诤小狈ㄊ歉F舉輸入測試,只有把所有可能的輸入都作為測試情況使用,才能以這種方法查出程序中所有的錯誤。實際上測試情況有無窮多個,人們不僅要測試所有合法的輸入,而且還要對那些不合法但是可能的輸入進行測試。
白盒測試也稱結構測試或邏輯驅動測試,它是知道產品內部工作過程,可通過測試來檢測產品內部動作是否按照規格說明書的規定正常進行,按照程序內部的結構測試程序,檢驗程序中的每條通路是否都有能按預定要求正確工作,而不顧它的功能,白盒測試的主要方法有邏輯驅動、基路測試等,主要用于軟件驗證。 “白盒”法全面了解程序內部邏輯結構、對所有邏輯路徑進行測試。“白盒”法是窮舉路徑測試。在使用這一方案時,測試者必須檢查程序的內部結構,從檢查程序的邏輯著手,得出測試數據。貫穿程序的獨立路徑數是天文數字。但即使每條路徑都測試了仍然可能有錯誤。第一,窮舉路徑測試決不能查出程序違反了設計規范,即程序本身是個錯誤的程序。第二,窮舉路徑測試不可能查出程序中因遺漏路徑而出錯。第三,窮舉路徑測試可能發現不了一些與數據相關的錯誤。
灰盒測試,是介于二者之間的?;液袦y試關注輸出對于輸入的正確性,同時也關注內部表現,但這種關注不象白盒那樣詳細、完整,只是通過一些表征性的現象、事件、標志來判斷內部的運行狀態,有時候輸出是正確的,但內部其實已經錯誤了,這種情況非常多,如果每次都通過白盒測試來操作,效率會很低,因此需要采取這樣的一種灰盒的方法。灰盒測試結合了白盒測試盒黑盒測試的要素。它考慮了用戶端、特定的系統知識和操作環境。它在系統組件的協同性環境中評價應用軟件的設計?;液袦y試由方法和工具組成,這些方法和工具取材于應用程序的內部知識盒與之交互的環境,能夠用于黑盒測試以增強測試效率、錯誤發現和錯誤分析的效率。
在程序測試階段可根據實際情況選擇不同的具體的測試方法。
5 總結
本文通過C語言編程中的編程規范、易出錯的地方和用凈室的方法來提高C語言的編程質量,提高軟件開發的效率。凈室方法是一種理論性強的編程方法,嚴格按照此方法進行編程是很多程序員難以達到的,本文將這種方法用以提高C語言編程質量是一種嘗試,供廣大編程愛好者借鑒。
參考文獻
[1]斯蒂夫里.零缺陷程序設計[M].夏昕,王堯,譯.北京:機械工業出版社,2003.
[2]佩騰.軟件測試[M].張小松,等譯.北京:機械工業出版社,2006.
[3]張芳妮,呂波.語言編程常見問題解答[M].北京:清華大學出版社,1996.
c語言編程范文3
關鍵詞:計算機;軟件編程;C語言分析
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2016)31-0074-02
在計算機軟件編程人員的世界中,C語言是一門簡單的高級語言,在計算機軟件編程中有著重要的作用。C語言具有編譯、連接、編輯及運行的功能,編程人員在計算機軟件編程中可以靈活的使用C語言,因為C語言具有簡單靈活、操作自由的特點。在計算機軟件工程及其他與計算機相關的專業學習中,C語言是一門最基礎也是最重要的語言,學習者可以靈活嘗試,進行自由編程。另外C語言還具有通用性,較人性化,適用于不同的操作系統。
1 淺析C語言及特點
1.1淺析C語言
C語言是在1972年被美國D.M博士提出的,到了1978年,C語言已經被運用到大型計算機中,目前的C語言已經可以被靈活運用到微型計算機中。C語言不僅是一種應用程序設計語言,也是一種工作系統設計語言。C語言可以使用到各種操作系統中,不過C語言一開始只是在unix操作系統中使用。在計算機軟件編程中,C語言是一門最基本、最簡單、最重要的語言,它是將低級語言與高級語言兩者的特點相結合。C語言作為低級語言編寫unix應用程序的時候,只能用于unix自身。但是C語言作為高級語言,完美地將低級語言的實用性特點與自身的結構算法相結合,從而滿足現代人類的編寫軟件需求。在計算機程序設計中,C語言有著重要的作用,C語言不僅升級了低級語言,還基于低級語言延伸了多種后續語言,在計算機軟件編程及開發中有著重要的作用?!?】
1.2 C語言的編程技巧
(1)具有獨特的函數。不同的函數在計算機軟件編程中都有著不同的功能及特性,但是在C語言編程中,就需要特定的函數。在函數中,函數名能夠對反映出函數的工E呢,所以在對函數進行定義的時候,計算機軟件編程人員要將函數名字、返回值類型及參數名等等進行定義。另外在進行編程時,C語言編譯系統會提供函數庫,此系統將函數定義之后,計算機軟件編程人員通過頭文件中引入“#include 指令”,就可以調用及使用這些程序。比如在程序編譯中需要使用sqrt函數的時候,頭文件就要以#include“string.h”這種形式進行,以保證程序的正常運行?!?】
(2)編程的指針運用。指針在軟件編程中是一種非常特殊的類型變量,指針主要包括三個要素,分別是指針類型、指針名和值,在軟件編程中的指針作用就是控制賦值及建立變量關系。在軟件編程中,指針有著重要的作用,其與編程的難易程度有著一定關系。將C語言使用到計算機軟件編程中是非常復雜的工作,所以就要計算機軟件編程工作人員就要熟練使用指針,并且能夠使用指針進行軟件編程。首先計算機軟件編程人員就要依據科學對指針的類型及名稱賦予正確的值,能夠使指針及變量得以區分。另外,在計算機軟件編程人員使用指針的時候,就可以使用C語言的函數對其進行定義,根據編程方程式及流程圖表示其內容。最后,計算機軟件編程人員要根據相應的函數名稱、返回值類型、相應的指令、文件及運算位,使其滿足自身的需求,明確二進制對象。還要將一系列的程序文件及數據文件的步驟精心布置,便于數據查找?!?】
(3)位運算及運算技巧。C語言在計算機高級語言運算中,最具有特點的就是位運算,其對象是二進制,具有獨特性及唯一性,位運算也是計算機軟件編程中最基礎及最重要的內容,計算機軟件編程人員要根據相關規定進行運算。另外在程序運算過程中,程序文件是尤為重要的,計算機軟件編程人員要在文件中存儲程序,便于日后查找數據,使運行效率進一步提高。在程序設計過程中,運算方法是靈魂,掌握運算技巧是每一位計算機軟件編程人員應該具備的。運算方式可以使用流程圖及自然語言表示,在使用流程圖的時候,計算機軟件編程人員要熟練掌握流程圖符號,還應具備一定的數學知識,從而使軟件編程效率得到進一步提高?!?】
2 計算機軟件編程中的C語言特點
2.1 簡單便捷
在執行C語言的時候,主要包括編譯、編輯、連接及運行,在C語言中除了關鍵字可以大寫之外,其他都用小寫,并且大小寫不能隨便改動,C語言的函數、變量名字不能以關鍵字命名。C語言中有9種控制語句及3中循環語句,其語言簡單,適合初學者。
2.2 豐富的運算符
C語言具有算數運算符,比如加、減、乘、除;還有邏輯運算符,比如是、非;還有關鍵運算符,比如大、小、等、按位于等等。
2.3 數據類型
包括隊列、指針、堆棧、普通、構造等等。這些都是最簡單及最基礎的數據類型,可以有效解決編程中的開發問題。
2.4 標識符
要使用函數名、變量名、符號常量、數組名等命名,其中不能有關鍵字,并且只能使用下劃線、字母及數字命名,且第一個字符不可以是數字。【5】
3 計算機軟件編程中的C語言分析
c語言編程范文4
flag 1 #ifdef
flag==1 #define fosc 6M delay=10; #elif
flag = = 0 #define fosc
8M delay=12; #else #define
fosc 12M delay=20; #endif main() { for(I=0;I
C51編譯器能對C語言源程序進行高效率的編譯,生成高效簡潔的代碼,在絕大多數場合采用C語言編程即可完成預期的目的。但有時為了編程直觀或某些特殊地址的處理,還須采用一定的匯編語言編程。而在另一些場合,出于某種目的,匯編語言也可調用C語言。在這種混合編程中,關鍵是參數的傳遞和函數的返回值。它們必須有完整的約定,否則數據的交換就可能出錯。下面就以力源公司的10位串行A/D轉換器TLC1549 為例說明C語言程序與匯編語言程序的調用。 PUBLIC AD
;入口地址 SEG_AD SEGMENT CODE?。怀绦蚨巍?RSEG SEG_AD USING 0 AD: MOV R6,#00 MOV R7,#00 SETB P1.1 ACALL DELAY CLR P1.1 ACALL DELAY MOV R0,#10 RR0: SETB P1.2 NOP CLR P1.2 DJNZ R0,RR0 ACALL DELAY MOV 30H,R6
;A/D轉換的高
;兩位保存在R6中 ACALL CIR MOV R6,30H SETB P1.2 NOP CLR P1.2 MOV 30H,R6 ACALL CIR MOV R6,30H MOV R0,#8
;A/D轉換的低
;8位保存在R7中 RR2: SETB P1.2 NOP CLR P1.2 MOV 30H,R7 ACALL CIR MOV R7,30H DJNZ R0,RR2 RET CIR: CLR C MOV C,P1.0 MOV A,30H RLC A MOV 30H,A RET END #include sbit P1_0=P1^0; void timer0(void)interrupt 1 using 1 {
/*T0中斷服務程序入口*/ P1_0=!P1_0; TH0=-(1000/256);
/*計數初值重裝*/ TL0=-(1000%256); } void main(void) { TMOD=0x01;
/*T0工作在定時器方式1*/ P1_0=0; TH0=-(1000/256);
/*預置計數初值*/ TL0=-(1000%256); EA=1;
/*CPU開中斷*/ ET0=1;
c語言編程范文5
關 鍵 詞:C語言;計算機;軟件編程;實驗研究
一、C語言的概述
在1967年BCPL語言被英國MartinRichards 推出,到1970 年B 語言以BCPL 語言為基礎被美國Ken Thompson推出[1]。但是B 語言過于簡單,而且功能有限,經過研究者的多次試驗研究,在1972—1973 年,C 語言在B 語言的基礎上經過完善,被美國貝爾實驗室D.M推出[2]。在各種計算機編程語言中,C語言屬于一門高級語言,它是一切計算機語言的基礎,擁有高級語言和低級語言的特點,靈活方便,簡潔緊湊;而且它的語法限制不嚴格,程序員在設計時程序書寫自由。不僅能夠編寫系統軟件,同時還可以編寫應用軟件,能夠適應于多種操作系統,應用廣泛,可移植性強??傊?,C語言對于信息技術的發展具有十分重要的作用和價值。
二、基于C語言的計算機軟件編程實驗研究
(一) C語言的編程技巧
1.靈活運用指針
在C語言編程的時候,指針是一種特殊類型的變量,它能夠幫助程序員有效的表達和解決程序設計過程中遇到的復雜問題,熟練掌握指針是必要的。指針具有三要素:指針名以及指針類型和值[3]。在編程時,指針和一般變量名相同,但是在類型以及值上具有區別,另外,指針不僅能夠被用于表示數組,還可以被作為函數的參數返回值。
2.C 語言的特有函數
在C語言編程的時候,有時需要用到一些特有函數。函數都具有一定的功能,同時函數名也反映了該函數的功能。在進行函數定義時,程序員需要把函數的名字、返回值類型以及參數名等各項都進行定義。另外,因為庫函數是由C 編譯系統提供的,這些函數均是系統首先定義好的,在程序調用的時候,程序員只需利用“#include 指令”把與之相關的頭文件包含到所用文件中即可[4]。例如,在程序運行的過程中,如果用到了sqrt函數,則為了保證程序運行下去,頭文件必須含有#include“string .h”。
3.算法技巧
在程序設計的過程中,算法是程序的靈魂,因此,掌握一定的算法技巧是必不可少的。通常情況下,算法不僅可以用自然語言表示,有的時候也利用流程圖表示。需要注意的是,利用流程圖表示算法時,程序設計員必須熟練掌握常用的流程圖符號[5]。且“數學乃是計算機之母”,牢固的數學知識同樣能夠提升編程效率。
4.位運算以及文件知識
相比其他計算機高級語言的運算方法,位運算作為C 語言的重要特色,具有獨特性和唯一性。位運算是以二進制位為對象,然后結合相關程序要求進行各種運算。文件包含有數據文件以及程序文件,是計算機不可缺少的,程序設計員在進行編程時,需要把所寫的程序存儲的文件之中,這樣可以便于程序員查找數據,提升查找效率。
(二) C語言和匯編語言混合的程序設計案例分析
在本次的實驗之中,在進行程序嵌入時,有其固定的格式,需要在嵌入的各行代碼之前加“asm”關鍵字,也可以直接在asm代碼塊中放入匯編語句。但是程序設計者在進行嵌入時,一定要注意滿足以下條件:匯編語言指令代碼中關鍵字asm必不可少,且要放在指令代碼之前;嵌入匯編語言指令代碼能夠和正常C語言程序混合,但是C語言的分隔符“;”必不可少;嵌入匯編語言時C語言的注釋分界符必不可少,分別是“/*”和“*/” [6]。
(2)首先編寫C語言程序以及匯編程序,然后獨立編譯目標代碼模塊,最終進行鏈接。
首先,在進行混合編程時,C語言程序能夠調用匯編語言的各種子程序以及其定義的變量,同時,C語言編寫的函數以及定義的變量等也可以被匯編語言調用。而且混合編程的過程中,一個任務往往是由若干個功能模塊組成,且不同的功能模塊均是利用合適的語言進行獨立編程,且以函數的形式存在。因此,程序設計者要根據每一模塊的特點選擇相應的語言和語言編程系統進行獨立編程,并形成目標文件,繼而連接目標文件,形成完整的可執行文件。
在混合編程的過程中,設計者需要注意五個問題:參數傳遞問題;寄存器的使用問題;存儲模式;變量以及函數的調用問題;子程序的返回值問題。
其中,關于參數傳遞問題,在進行C語言程序調用匯編程序時,必須遵從參數傳遞原則,利用堆棧把參數傳遞給匯編程序。例如,在C語言程序中含有函數:voidaa(char*p,int i),這個函數是利用匯編語言進行編寫的,如果編譯是在小內存模式下實施的,系統在進行調用時,則寫成aa(&q , n);運行時程序首先把n壓入堆棧,然后再把&q壓入堆棧,當參數傳遞過來并被匯編語言的子程序取得時,BP寄存器便被用作基地址寄存器,實現對棧中所存數據進行存取操作。通常情況下,由于調用的子程序和C語言程序往往使用同一個堆棧,所以在程序執行時,匯編語言子程序需要執行兩條指令:push bp pop bp、sp[7]。
2.混合的軟件編程實例分析
三、小結
綜上所述,隨著信息技術的不斷發展,人們對于計算機軟件編程的功能要求也將越來越高,而利用C語言能夠實現計算機軟件的多種功能,因此研究者應當強化對于C語言的計算機軟件編程實驗研究,開發功能更加強大的軟件。
參考文獻
[1] 侯宏霞.提高“匯編語言”課程實驗教學質量的幾點思考[J].內蒙古農業大學學報(社會科學版),2011(01):25-26.
[2] 劉海峰.以培養實踐能力為導向的“C語言”教學方法探討[J].科技經濟市場,2008(12):33-34.
[3] 阿娜古麗·阿布拉.C語言與匯編語言相互調用實現混合編程[J].電腦編程技巧與維護,2009(10):71-74.
[4] 劉丹,劉德山.C語言程序設計課程綜合性和設計性實驗研究[J].計算機教育,2012(09):31-32.
[5] 王應軍,曲培新,趙晨萍.ARM匯編語言與C語言混合編程的實現方法[J].科技信息,2010(03):69-71.
[6] 方艷紅,趙海龍.計算機高級語言程序設計類課程實踐教學改革研究[J].中國科技信息,2008(19):12-14.
c語言編程范文6
關鍵詞:計算機動畫;幀率;延時;C語言;編程方法
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2017)01-0046-03
Abstract: To implement computer animation with C language, often use approximate duration as the delay between the frames. This will make the different time length between different frames, making it impossible to achieve accurate control over the speed of the animation. To solve this problem, the sleep function is improved and the adaptive delay can be carried out according to the specified frame time length. On this basis, further proposed a programming method to update frames with fixed frame rate, suitable for animation, games and applications. Finally, the application of this method is demonstrated by the example of "English Dialogue Dynamic Demonstration" under textual interface of the windows console in C language.
Key words: computer animation; frame rate; delay; C language; programming method
1 背景
利用人類視覺系統的視覺殘留特性[1],計算機動畫中采用:“繪制一幀畫面”、“延時”、“繪制下一幀畫面”、“延時”的方式,在短時間內快速切換畫面,能使人產生“畫面是連續變化”的感覺。有大量的文章探討了使用C語言在圖形界面下進行畫面繪制、擦除與切換的技術手段,如:屏幕重畫、雙緩沖、異或、調色板[2]、圖形頁面、掩膜[3]等。但卻都只是簡單地使用如delay(10)[3]、delay(200)[4]等大概延時作為控制動畫速度的手段。這僅能實現 “按某個大概速度動起來”,而無法實現“按一個指定的速度動起來”和“從某時開始動起來,一直到某時為止”;也沒有討論一個畫面中若同時存在多個不同速度變化的畫面元素如何處理。以下提出一種以固定幀率更新畫面的編程方法,可用于實現圖形界面和文本界面下的各種類型的動畫[6]、游戲和應用程序。下文中的C源代a均在Windows系統中Visual C++編譯環境調試通過。
2 幀率
幀率(frame rate)是影視、動畫和游戲領域中的概念,表示畫面切換的速度,單位為fps(frames per second,即每秒幀數)。fps數值越大則畫面連貫性越強,但同時數據量也越大,不同場合下需要綜合考慮容量與視覺效果的平衡。通常,電影的幀率為24fps(高幀率電影[5]可以達到48fps),電視(PAL制)為25fps,游戲對畫面流暢性、操作反應靈敏性要求較高,通常需要高于30fps。
幀時長是指兩幀畫面先后出現的間隔時間長度,其值是幀率的倒數。為敘述方便,下文以Tfps=n表示幀率為n時的理想幀時長,單位為毫秒。即:
Tfps=n = 1000/n (ms)
在幀率確定后,即可通過幀時長來計算動畫所需的幀數、同時控制畫面元素的變化速度。
3 控制畫面變化速度
以幀率為25fps的動畫為例,其理想幀時長為:
Tfps=n = 1000/25 = 40(ms) (n=25)
若在繪制一幀畫面后立刻更新下一幀畫面,如下代碼所示:
//程序段1:無延時畫面更新
while (!kbhit())
DrawOneFrame(); //更新1幀畫面
此時,第i幀的實際幀時長Tf(fi)等于該幀的代碼執行時長Tr(fi),由于現代電腦性能強勁,Tr(fi)通常小于Tfps=25,即:
Tf(fi) = Tr(fi) < Tfps=n (n=25)
因此,上面代碼生成的動畫幀率大于25fps,畫面會像快進的視頻一樣飛速播放。為控制畫面更新速度,需要在更新完一幀畫面后,進行適當時長的延時。
3.1 使用等時長延時粗略控制幀時長
要使動畫的時長與速度準確,實際幀時長應等于理想幀時長,這需要為每一幀增加一個延時Td(fi),即:
Tfps=n = Tf(fi) = Tr(fi) + Td(fi)
如引言中所述,許多文章討論動畫實現時忽略代碼執行耗時Tr(fi),將Td(fi)簡化為一個固定時長的Td,即:
Tfps=n = Tf(fi) = Tr(fi) + Td ( Tr(fi)>0, 0
加入Td延時后程序段1改寫為:
//程序段2:等時長延時畫面更新
#define FPS 25 /* 使用宏定義指定幀率,以25fps為例 */
#define FRAME_TIME (1000/FPS) /* 按幀率換算理想幀時長,單位為ms */
#define DELTA_T 0 /* Tr(fi)的一個粗略值,大部分文章取0值 */
#include //Sleep()函數頭文件
while (!kbhit())
{
DrawOneFrame(); //更新1幀畫面
Sleep(FRAME_TIME - DELTA_T); //等時長延時FRAME_TIME-DELTA_T ms
}
顯然,由于每幀畫面的Tr(fi)的都不相同,Td無論取何值也無法使任意兩幀的實際幀時長相等,即:
Tf(fi) ≠ Tf(fj) (1≤i,j≤m,且i≠j,m為動畫最大幀數)
因此,使用等時長延時控制動畫速度有兩個無法解決的問題:
第一, 同一段動畫,無論Td取何值也無法得到穩定的幀率。如圖1所示,電腦A無論采用40ms延時和25ms延時(或其他任何值)均無法使每一幀都得到40ms的幀時長;
第二, 采用相同延時的同一段動畫,在不同性能的電腦上播放時幀率也不同。如圖1所示,性能較弱的電腦B使用25ms延時,相比電腦A,其幀時長更長(即動畫速度更慢)。
3.2 使用等幀長延時準確控制幀時長
為解決等時長延時的兩個問題,必須知道第i幀畫面的代碼執行時長Tr(fi),計算得到第i幀的Td(fi)值,使得:
Tfps=n = Tf(fi) (1≤i≤m, m為動畫最大幀數)
如圖2所示。
為此,必須要記錄每次延時執行時的具體時刻,作為計算Td(fi)的依據,這可以通過使用clock()函數實現。以下為庫函數clock()的函數原型。
clock_t clock(void);
clock()函數返回自本程序運行起到調用此函數為止,CPU產生的clock tick(CPU時鐘計時單元)數。在VC++6.0的time.h里,對每秒clock tick數有如下宏定義:
#define CLOCKS_PER_SEC 1000
由此可知1個clock tick時長為1毫秒。因此,使用clock()可以實現計時精度為±1ms的自適應等幀長延時函數。代碼如下:
//程序段3:改進的自適應等幀長延時函數
#include //clock()函數頭文件
int pastFrames = 0 ; //全局變量,記錄從程序運行到目前已經過的幀數
void FixedFrameTimeSleep(int frameTime)
{
static clock_t endClock = 0; //存放本次延時結束時刻的clock tick數
pastFrames++; //經過的幀數加1
endClock += frameTime * CLOCKS_PER_SEC / 1000; //計算本幀結束時刻
if (clock() > endClock) //若已超時則不延時
endClock = clock(); //以當前時刻為本幀的結束時刻
else
while (clock() < endClock) //循環1ms的延時至本幀結束,實現Td(fi) ms的延時
Sleep(1); //延時并降低CPU占用率
}
使用此函數替換程序段1中的Sleep()函數,即得到以固定幀率FPS運行的畫面更新程序框架:
//程序段4:自適應等幀長延時函數實現固定幀率更新畫面
while (!kbhit())
{
DrawOneFrame();
FixedFrameTimeSleep(FRAME_TIME);
}
4 現畫面元素按時更新的函數框架
在實現了固定幀率后,畫面元素的更新頻率可以換算為每幾幀更新一次,出現時刻、結束時刻可以通過pastFrames來控制。如下函數框架實現:以指定fps(fps≤FPS),從startTime時刻到endTime時刻更新畫面元素。
//程序段5:畫面元素按時更新函數框架
void DrawAnimation(int fps,int startTime, int endTime)
{
int curTime, updateFrames ;
curTime = pastFrames * FRAME_TIME ; //計算當前時間
if ( curTime >= startTime && curTime
{
updateFrames = FPS / fps ; //將畫面元素的fps換算成每幾幀更新一次
if ( pastFrames % updateFrames == 0 ) //判斷是否應在本幀更新
{
//更新畫面元素的代碼
}
}
}
6 實現多個畫面元素按時更新的程序框架
若畫面中有多個畫面元素,只需為它們分別編寫合適的DrawAnimation()函數,再依次加到程序循環中即可,如下所示:
//程序段6:多個畫面元素按時更新的程序框架
while (!kbhit())
{
DrawAnimation1(fps1,ts1,te1);
DrawAnimation2(fps2,ts2,te2);
……
FixedFrameTimeSleep(FRAME_TIME);
}
7 編程方法應用演示
使用C編寫一個控制臺窗口文本界面下循環動態演示Tom和Jerry進行“英文對話”的程序。為演示編程方法中以固定幀率對多個畫面元素分別按時更新的特性,對此應用程序做如下設定:
1)一輪對話分為“問”和“答”;
2)Tom從問候語中隨機選擇一句發問,Jerry根據問候語進行相應的回答;
3)發問前、回答前均停頓1秒,回答完成后停頓2秒,使得問答停頓自然;
4)Tom和Jerry的語速不同:Tom為10字符/秒,Jerry為20字符/秒;
5)有一個按“mm’ss””格式顯示的數字時鐘。
若設定幀率為40fps(幀時長為25ms),則根據應用程序設定可知:
1)數字時鐘的更新頻率fps為1,每40幀更新一次;
2)Tom、Jerry所說的話更新頻率fps分別為10、20,每4幀、2幀更新1次;
3)一輪對話的時間順序為:1秒+發問者說話字符數/語速+1秒+發問者說話字符數/語速+2秒。
為數字時鐘、Tom(說的話)和Jerry(說的話)這三個畫面元素按照DrawAnimation()函數框架分別編寫更新函數,并依序放入程序框架,以下為部分代碼。
//程序段7:“英文對話演示”部分代碼
#define MAX_TIME 3600 /* 設定最長演示時間3600秒 */
int ts1 = 0, te1 = 0; //Tom說話的開始時間與結束時間
int ts2 = 0, te2 = 0; //Jerry說話的開始時間與結束時間
while (!kbhit())
{
CalculateTime(); //在上一輪對話完成后,計算下一輪對話的時間安排
DrawTom(10,ts1,te1);
DrawJerry(20,ts2,te2);
DrawDigitalClock(1,0,MAX_TIME);
FixedFrameTimeSleep(FRAME_TIME);
}
最終實現的效果如圖3所示。
8 結束語
改進的等幀長延時將每幀中代碼執行、數值計算、界面更新等消耗的時長計算在內,動態增減剩余延時,保證每幀的時長相同。通過等幀長延時獲得的固定幀率是一條時間軸,可以驅動程序流程準確地按時間運行。在確定幀率和幀時長后,可用之計算畫面中每一個動態元素在此時間軸上的起始幀、結束幀以及需要更新的關鍵幀。這樣就能保證畫面中所有動態元素都能按各自速度和時間準確更新。但是,當畫面元素之間、畫面元素與用戶操作之間存在比較復雜的交互邏輯時(比如:RPG游戲中的戰斗場景[7]),使用面向過程的編程方式難以實現。因此,需要在此方法基礎上引入事件驅動機制[8],以降低程序交互邏輯實現的難度。
參考文獻:
[1] 朱蓉, 建華. C語言實現動畫技術的探討[J]. 電腦知識與技術, 2005(35): 145-147.
[2] 趙艷忠, 王鴻銘. C語言平臺下動畫技術實現方法淺析[J]. 科技信息, 2008(22): 402-421.
[3] 王進華, 章云, 曾歆懿. 基于掩模技術的C語言動畫設計與實現[J]. 科技廣場, 2005(10): 39-41.
[4] 韓潔. 用C語言實現圖形動畫技術[J]. 計算機時代, 1999(3): 14-15.
[5] 陳曉悅. 淺析高幀率電影制作流程[J]. 現代電影技術, 2016(5): 36-39.
[6] 和青芳. 計算機圖形學原理及算法教程(Visual C++版)[M]. 北京: 清華大學出版社出版, 2006: 202-220.