真人一对一直播,chinese极品人妻videos,青草社区,亚洲影院丰满少妇中文字幕无码

0
首頁 精品范文 c語言函數(shù)

c語言函數(shù)

時間:2023-05-29 18:21:51

開篇:寫作不僅是一種記錄,更是一種創(chuàng)造,它讓我們能夠捕捉那些稍縱即逝的靈感,將它們永久地定格在紙上。下面是小編精心整理的12篇c語言函數(shù),希望這些內(nèi)容能成為您創(chuàng)作過程中的良師益友,陪伴您不斷探索和進(jìn)步。

c語言函數(shù)

第1篇

關(guān)鍵詞:C語言 圖形函數(shù) 應(yīng)用

引言

C語言是國際上廣泛流行的很有發(fā)展前途的計算機(jī)高級語言。它既具有一般計算機(jī)高級語言的可讀性、可移植性的特點(diǎn),又具有低級語言能夠?qū)τ嬎銠C(jī)硬件進(jìn)行操作的特性,因此,它適合用于操作系統(tǒng)的描述語言,用C語言開發(fā)系統(tǒng)軟件和應(yīng)用軟件。但在87ANSIC中并沒有規(guī)定C語言的圖形功能,許多C語言教材沒有介紹C語言的圖形功能,這給許多需要用C語言設(shè)計完美、漂亮的用戶界面的初學(xué)者帶來了困難[1-2]。本文旨在通過介紹Turbo C 2.0的主要圖形函數(shù)及一個具體的實(shí)例簡介這些函數(shù)的用法。

1 與圖形繪制有關(guān)的系統(tǒng)硬件[2-3]

要使計算機(jī)能夠繪制圖形,必須有一定的硬件基礎(chǔ)作為保障。圖形繪制的硬件基礎(chǔ)主要是顯示器和顯示卡。顯示器的工作方式一般有文本方式和圖形方式。要在屏幕上顯示圖形,必須將其設(shè)置成圖形方式。衡量顯示器的主要性能指標(biāo)是點(diǎn)距和分辨率。目前顯示器常用的點(diǎn)距有0.39mm、0.31mm和0.28mm三種。高檔微機(jī)配置的彩色顯示器目前流行的是VGA檔次,它最低的分辨率為640×480,中檔的是800×600,高檔的是1024×768。顯示器必須與顯示卡配套使用才能發(fā)揮其圖形功能。顯示卡所能支持的不同分辨率的顯卡類型稱為顯示模式。下表給出Turbo C中常用的幾種顯示卡的圖形模式:

2 Turbo C 2.0中與繪圖有關(guān)的常用圖形函數(shù)

2.1 設(shè)置圖形工作方式的函數(shù):initgraph()。

Turbo C繪圖,首先必須設(shè)置顯示器為圖形方式。該函數(shù)通過選定參數(shù)可確定顯卡的類型及圖形模式。

如:

int driver,mode;

driver=IBM8514;

mode=IBM8514HI;

initgraph(&driver,& mode,“c:\temp”);

將圖形方式設(shè)置為IBM8514類型,IBM8514HI圖形模式,1024×768的分辨率,搜索路徑temp為C盤一級子目錄。

2.2 顏色控制函數(shù)setbkcolor(int color)及setcolor(int color)。

其中setbkcolor( )設(shè)置背景顏色,setcolor( )設(shè)置劃線顏色。

2.3 基本繪圖函數(shù)

A. line(int x1,int y1,int x2,int y2)

功能:從點(diǎn)(x1,y1)到點(diǎn)(x2,y2)畫一直線。

B. arc(int x,int y,int stange,int endangle,int r)

功能:以(x,y)為圓弧的中心,以stange為起始角度,以endangle為終止角度,以r為半徑作一圓弧。

C. setfillstyle(int pattern,int color)

功能:用參數(shù)pattern所確定的填充模式,用參數(shù)color確定的顏色進(jìn)行填充。

D. floodfill(int x,int y,int color)

功能:填充一個含有點(diǎn)(x,y)在內(nèi)的有界封閉區(qū)域,這個有界封閉區(qū)域的邊界由參數(shù)color確定,填充模式與填充顏色由函數(shù)setfillstyle設(shè)定。

2.4 字符輸出函數(shù)

A. settextstyle(int font,int direction,int size)

功能:在圖形方式下設(shè)置字符的字體,式樣和放大因子。

B. outtextxy(int x,int y,char &str)

功能:在窗口(x,y)的位置輸出字符或字符串。

C. getch( )

功能:從控制臺取得一字符且不輸出,用來使程序暫停,按任意鍵后使程序繼續(xù)運(yùn)行。

3. 繪制一個圓餅型統(tǒng)計圖的程序如下

#include

main( )

{ int driver,mode;

driver=VGA;

mode=VGAHI;

initgraph(&driver,&mode,“ ”);

setbkcolor(0);

setcolor(15);

arc(320,240,0,360,180);

line(320,240,500,240);

line(320,240,443,112);

line(320,240,266,70);

line(320,240,200,374);

setfillstyle(4,2);

floodfill(340,230,15);

setfillstyle(5,9);

floodfill(340,180,15);

setfillstyle(7,4);

floodfill(300,240,15);

setfillstyle(8,3);

floodfill(340,280,15);

setcolor(14);

settextstyle(1,0,4);

outtextxy(410,180,“14%”);

settextstyle(1,0,4);

outtextxy(330,110,“16%”);

settextstyle(1,0,4);

outtextxy(200,200,“34%”);

settextstyle(1,0,4);

outtextxy(340,310,“36%”);}

上述程序在Turbo C 2.0中上機(jī)通過編譯、連接、運(yùn)行,可得到精美的圓餅型圖。讀者通過閱讀并上機(jī)調(diào)試運(yùn)行該程序可以對C語言的圖形設(shè)置、繪制;顏色的控制、填充等函數(shù)的應(yīng)用有一個感性的認(rèn)識,對復(fù)雜枯燥的C函數(shù)提高學(xué)習(xí)興趣。

結(jié)語

目前許多C語言教材很少介紹C語言的圖形功能,而許多C語言學(xué)習(xí)者對C語言的圖形功能很感興趣,為幫助初學(xué)者學(xué)習(xí)C語言繪圖函數(shù)并提高學(xué)習(xí)興趣,本文簡單介紹了C語言一些常用的繪圖函數(shù)及其應(yīng)用,權(quán)當(dāng)拋磚引玉!還有一些圖形函數(shù)沒有列出,讀者若有興趣可參閱《C語言函數(shù)大全》。

參考文獻(xiàn):

[1]徐士良.PC機(jī)C圖形編程手冊.北京:清華大學(xué)出版社,1994.2.

[2]譚浩強(qiáng).C程序設(shè)計(第二版)[M].北京:清華大學(xué)出版社,1999.

第2篇

關(guān)鍵詞:C語言;程序設(shè)計;函數(shù);教學(xué)方法

中圖分類號:G642 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2013)22-5108-04

C語言一般作為普通高校各理工專業(yè)的第一門程序設(shè)計語言[1],學(xué)好C語言對學(xué)生學(xué)習(xí)后續(xù)計算機(jī)課程至關(guān)重要。C語言的基本單位是函數(shù),函數(shù)是C語言教學(xué)的一個重點(diǎn)。因?yàn)镃語言中的函數(shù)跟現(xiàn)在所有流行的語言中函數(shù)的用法都不太一樣,以函數(shù)為切入點(diǎn),可以比較直觀的辨別出來面向過程和面向?qū)ο蟮囊粋€區(qū)別,有利于學(xué)生理解到底什么叫面向過程的語言,什么叫面向?qū)ο蟆K訡語言的函數(shù)十分重要。

1 教學(xué)方法

函數(shù)的教學(xué)與流程控制不一樣,流程控制中if、while、for知識點(diǎn)是由淺入深,一步一步來的。而函數(shù)的特點(diǎn)是,一個程序里會涉及到函數(shù)的很多知識點(diǎn),所以只要把一個程序搞清楚了,那其他程序也就全懂了。針對函數(shù)的這個特點(diǎn),我們的授課思路是首先用通俗易懂的例子來引入問題,使學(xué)生理解為什么需要函數(shù);教師實(shí)際演示編寫程序,調(diào)試執(zhí)行程序讓學(xué)生理解C函數(shù)的執(zhí)行過程;通過對程序有意設(shè)置語法錯誤和空白內(nèi)容的方法,使學(xué)生了解如何定義函數(shù)、調(diào)用函數(shù),幫助學(xué)生掌握函數(shù)語法知識;設(shè)計案例,由淺入深,將知識全面化,系統(tǒng)化;布置作業(yè),幫助學(xué)生加深對知識點(diǎn)的理解,激發(fā)學(xué)生的創(chuàng)新思維。

1)用通俗易理解的例子來引入問題

講授任何一個知識,首先講為什么需要這個知識[2],只有這樣學(xué)生才會自然接受,這一點(diǎn)很重要。引例的選取最好難易適中,能充分調(diào)動學(xué)生的積極性。

教師提醒學(xué)生,在這個程序中,有三段代碼的操作是重復(fù)性的。那么如果這個程序有一萬個地方要輸出兩個數(shù)的最大值,那就意味著這段代碼要重復(fù)一萬次。這樣寫肯定不合適。至此引入函數(shù)加深學(xué)生對函數(shù)的感性認(rèn)識。引導(dǎo)學(xué)生思考為什么需要函數(shù),原因是函數(shù)可以避免重復(fù)性操作。

通過調(diào)試執(zhí)行,學(xué)生可清楚了解到函數(shù)調(diào)用與返回的實(shí)現(xiàn)過程。程序從主函數(shù)main進(jìn)入,當(dāng)遇到函數(shù)調(diào)用時,暫停執(zhí)行主調(diào)函數(shù),然后轉(zhuǎn)去執(zhí)行被調(diào)函數(shù)。首先為被調(diào)函數(shù)分配調(diào)用過程中所需的數(shù)據(jù)區(qū),包括調(diào)用后的返回地址,函數(shù)的形參以及各種局部變量,然后把實(shí)參的值復(fù)制到形參中去,接著把控制權(quán)轉(zhuǎn)移給被調(diào)函數(shù),完成調(diào)用后,如果函數(shù)有返回值,先保存計算結(jié)果,然后釋放被調(diào)函數(shù)的數(shù)據(jù)區(qū),返回主調(diào)函數(shù)暫停的位置(調(diào)用前保存了返回地址)繼續(xù)執(zhí)行。

仍然采用調(diào)試執(zhí)行本程序,加深學(xué)生對函數(shù)調(diào)用過程的理解。將函數(shù)調(diào)用過程講深講透非常重要,這是科學(xué)性的要求。理解了函數(shù)的調(diào)用過程,就會理解什么是遞歸,什么是變量的作用域與變量的生命期。

3) 設(shè)置錯誤尋求正確答案的教學(xué)方法和填空式的教學(xué)方法

傳統(tǒng)的教學(xué)方法中,一般集中式的講述語法知識,非常枯燥,學(xué)生學(xué)了也不會編程不會應(yīng)用。在課堂教學(xué)中,可以有意設(shè)置語法錯誤,根據(jù)編譯所提示的錯誤,引導(dǎo)學(xué)生思考并修正錯誤;或者是有意識地將一些內(nèi)容空出,要求學(xué)生先讀懂再填空,然后運(yùn)行程序,調(diào)試程序,直到得到正確的運(yùn)行結(jié)果。這樣可激發(fā)學(xué)生的探索欲望,加深對語法的理解,也提高了學(xué)生的學(xué)習(xí)能力。

4)案例——任務(wù)驅(qū)動的教學(xué)方法

至此,學(xué)生已經(jīng)掌握了函數(shù)的大部分知識點(diǎn),但是在以往的教學(xué)中,通常面臨一個問題,當(dāng)學(xué)生自己寫程序的時候,他們通常將語句一并寫在main里,而不選擇用函數(shù)實(shí)現(xiàn)。究其原因,還是學(xué)生對如何定義函數(shù),以及如何在主調(diào)函數(shù)中調(diào)用自定義函數(shù)不夠熟練,沒有體會到函數(shù)的運(yùn)用給編程帶來的極大的便利。針對這個問題,我設(shè)計了兩個案例要求學(xué)生完成。案例的選擇要難度要由淺入深,循序漸進(jìn),每個案例欲教授的內(nèi)容要目的明確,重點(diǎn)突出。

通過這個庫函數(shù)調(diào)用的案例,學(xué)生學(xué)會了如何自定義函數(shù),加深了對函數(shù)庫、庫函數(shù)、連接程序、頭文件的相關(guān)概念的理解,明白了函數(shù)是為解決大量同類型的問題而設(shè)計的,可提高代碼的可重用性,將來無論哪一個程序需要這個功能都可以使用它,就好比我們printf、scanf、pow一樣,也學(xué)會了在具體的應(yīng)用中該如何自定義函數(shù),如何確定函數(shù)的返回值類型和函數(shù)的形參列表。

5)精講多練的教學(xué)方法

C程序設(shè)計內(nèi)容多,課時少,課堂上教師要做的不是拼命多講,可以通過作業(yè)讓學(xué)生去自學(xué)。也不是要拼命講明白,因?yàn)槌绦蛑挥袑W(xué)生自己想明白了才能為他所用。不能過于依賴教材,要引導(dǎo)學(xué)生將所學(xué)知識聯(lián)系起來,現(xiàn)場演示設(shè)計程序的思維過程,講清知識的深層原理。布置作業(yè),作為課堂內(nèi)容的補(bǔ)充和深化。學(xué)生通過查資料動手實(shí)驗(yàn),根據(jù)完成作業(yè)的情況,教師可以發(fā)現(xiàn)問題所在,在上機(jī)實(shí)踐課中重點(diǎn)講解。

通過本案例,使學(xué)生理解并掌握函數(shù)的幾個重要概念、實(shí)現(xiàn)方法和編程技巧。

函數(shù)教學(xué)案例五:通過調(diào)用swap函數(shù),交換主函數(shù)中變量a,b的值。

這個作業(yè)的要點(diǎn)是swap函數(shù)中的形參在調(diào)用完畢空間就釋放了,所以,雖然兩個形參變量的值交換了,但是a,b的值卻沒變。

大部分學(xué)生接著就想,能否返回兩個值帶回主函數(shù),編程實(shí)踐發(fā)現(xiàn)無法做到,因?yàn)楸徽{(diào)函數(shù)只能返回一個值。

那怎么辦呢?這時候老師可以告訴學(xué)生,在后續(xù)課程指針章節(jié)可以找到答案。這樣給學(xué)生留下思考余地,啟發(fā)學(xué)生去思考,有利于提高學(xué)生的學(xué)習(xí)能力,培養(yǎng)學(xué)生的創(chuàng)新思維[2]。

2 結(jié)束語

C語言函數(shù)的教學(xué)很重要,使學(xué)生理解函數(shù)并且學(xué)會應(yīng)用函數(shù)是教學(xué)的關(guān)鍵。在后續(xù)講解數(shù)組、指針、結(jié)構(gòu)、文件時,都會與函數(shù)的知識綜合起來,例如,將數(shù)組名作為函數(shù)的參數(shù),指針作為函數(shù)的參數(shù),結(jié)構(gòu)指針作為函數(shù)的參數(shù),文件操作函數(shù)等,學(xué)生能更好地掌握函數(shù)的定義和調(diào)用的方法,也會慢慢理解為什么說C語言是由函數(shù)所組成的。該文所探討的C語言函數(shù)的教學(xué)方法已經(jīng)應(yīng)用在實(shí)際教學(xué)中,激發(fā)了學(xué)生學(xué)習(xí)的自覺性和主動性,提高了教學(xué)質(zhì)量,取得了良好的教學(xué)效果,希望對同行有所幫助。

參考文獻(xiàn):

[1] 高枚,楊志強(qiáng),許蘭蘭,龔沛曾.C/C++教學(xué)改革的探索與實(shí)踐[J].計算機(jī)時代,2005(11).

[2] 譚浩強(qiáng).《C程序設(shè)計》發(fā)行1000萬冊的啟示[J].北京聯(lián)合大學(xué)學(xué)報:自然科學(xué)版,2011(4).

第3篇

關(guān)鍵詞: Sleep;循環(huán);硬件思維;指針

中圖分類號:TP312.1 文獻(xiàn)標(biāo)識碼:A 文章編號:1671-7597(2012)0210144-01

0 引言

循環(huán)嵌套對于初學(xué)者來說是個難以理清的知識點(diǎn),尤其是內(nèi)層循環(huán)和外層循環(huán)之間的關(guān)系也只能是靠多加練習(xí)來體會;雖然斷點(diǎn)測試可以清晰的看到運(yùn)行情況,但是復(fù)雜的地址和中間值對于初學(xué)者來說更難理解。我們這里借用一些輔助函數(shù),比如說Sleep函數(shù),來使嵌套的層次更加清晰,使break和contimue的對循環(huán)的影響更加清楚。指針更是讓許多學(xué)生望而怯步,歸根到底是學(xué)生對于硬件知識的缺乏,我們這里采用先對學(xué)生講解內(nèi)存存儲原理的方式,是學(xué)生對指針的認(rèn)識更加直接和深入。

1 Sleep函數(shù)在循環(huán)嵌套中的妙用

在學(xué)習(xí)循環(huán)嵌套的時候,我們往往都是寫完代碼后一次性將最終結(jié)果顯示在窗口,或者一次性將所有的結(jié)果顯示在窗口,這樣就很難看清每次循環(huán)所做的具體事情。雖然我們可以用斷點(diǎn)測試來看程序運(yùn)行的具體情況,但是斷點(diǎn)測試對于初學(xué)者來說太過復(fù)雜。在這里我們用一個比較直觀的例子,再加上一些輔助函數(shù)來了解循環(huán)和循環(huán)嵌套的詳細(xì)過程。

例1:用C語言實(shí)現(xiàn)一個格式為“分:秒:毫秒”,范圍為00:00:00~19:59:99。

我們這里首先根據(jù)題意分析可得,1秒=1000毫秒,這里我們毫秒采用兩位,即99代表990毫秒。我們采用6個int類型變量m1(分的十位),m2(分的個位),s1(秒的十位),s2(秒的個位),ms1(毫秒的百位),ms2(毫秒的十位),他們之間的進(jìn)位關(guān)系為:1m1=10m2,1m2=6s2,1s1=10s2,s2=10ms1,1ms1=10ms2,利用這些變量之間的進(jìn)制關(guān)系,我們采用6層for循環(huán)嵌套來實(shí)現(xiàn),循環(huán)部分的核心代碼如下:

這樣實(shí)現(xiàn)的結(jié)果根本做不到秒表讀秒的效果,也看不出循環(huán)執(zhí)行的具體層次。所以我們引入Sleep函數(shù),并利用“\r”來打到比較好的讀秒效果。在VC里面加上頭文件#include,便可利用Sleep函數(shù)將程序掛起(暫停)一段時間,時間長短取決于Sleep(unsigned long)函數(shù)中的參數(shù),其參數(shù)代表毫秒,Sleep(1)表示將程序在此掛起1毫秒,在本例題里,我們采用Sleep(10)表示將程序每執(zhí)行一次printf函數(shù)就掛起10毫秒,剛好和秒表的右邊第一位跳一次的時間相等。利用“\r”返回行首,這樣我們改造后的代碼為:

return 0;}如此一來,我們就實(shí)現(xiàn)了秒表的效果。通過秒表的貼近日程生活的進(jìn)位顯示現(xiàn)象,我們可以非常清晰的看出循環(huán)嵌套之間的層次,從而對循環(huán)嵌套有一個一步到位的清楚認(rèn)識;并通過添加Sleep函數(shù)的使用,還對學(xué)生自主拓展知識有一定的引導(dǎo)作用。

2 硬件思維在理解指針中的妙用

語言課是學(xué)生的入門課,由于沒有地址的概念,所以對于指針的認(rèn)知一直都是難點(diǎn)。我們這里先向?qū)W生介紹內(nèi)存及內(nèi)存地址的組織情況,從內(nèi)存地址的角度來講解指針,這將是學(xué)生對指針的認(rèn)識和掌握有個一步到位的認(rèn)識。

所謂指針,其實(shí)就是所需的操作數(shù)的地址,我們這里以簡單的直接一次間接尋址為例,我們先看一下內(nèi)存和內(nèi)存地址的簡單組織情況:

我們舉一個簡單的例子來說明,例如有如下定義:

int a=1000,*p;

p=&a;

這里的內(nèi)存和內(nèi)存地址結(jié)構(gòu)我們就以上面簡單的形式組織,以典型的32位字長為例,變量值和指針(地址)均可放到內(nèi)存單元中。剛開始定義變量a并賦予其初始值1000的時候,我們是將變量a的值1000存到000號單元中,然后定義指針變量p時是將008號單元分配給指針變量p,也就是說008單元中放的是指針變量p;p=&a操作是讓指針變量p指向變量a,也就是將008單元中的指針變量值具體化為000,在以后的通過指針p引用變量a的時候,*p中的*的意思是指:取指針變量p的值(000)作為地址去找操作數(shù),而000號單元中放的就是變量a。這也就是在引用時,*p和a是等價的。

利用內(nèi)存結(jié)構(gòu)還很容易在函數(shù)中用指針傳參能改變變量的值,而通過普通變量傳參因?yàn)樽饔糜虻膯栴}而無法改變變量值。例如有如下代碼:

輸出結(jié)果中,a=1b=4,在調(diào)用函數(shù)fun的時候,第一個參數(shù)傳的是變量a的值,但是main函數(shù)中的a和fun函數(shù)中的a并不是一個變量,000單元中的變量a是main函數(shù)中的a,003中的a是fun函數(shù)中的a,a=3是對fun中的a賦值,并未對main函數(shù)中的a做出任何改變;但fun函數(shù)中的*q=4是對q中的地址001中的變量b進(jìn)行賦值,而001中的變量b剛好是main函數(shù)中的b,所以main函數(shù)中的printf語句輸出的a還是1,而b則變成了3。

以上就是硬件思維在指針學(xué)習(xí)中的作用。

參考文獻(xiàn):

第4篇

關(guān)鍵詞:C語言;函數(shù);調(diào)試技術(shù)

中圖分類號:G642.4 文獻(xiàn)標(biāo)志碼:A 文章編號:1674-9324(2014)11-0085-02

C語言是一門函數(shù)式語言。學(xué)習(xí)C語言編程必須學(xué)好函數(shù)的使用。筆者在多年的教學(xué)過程中,發(fā)現(xiàn)學(xué)生在學(xué)習(xí)函數(shù)的過程存在一些問題。雖然這些內(nèi)容教師在課堂上都十分認(rèn)真地講解,但有些學(xué)生還是覺得內(nèi)容很抽象,不容易理解。程序調(diào)試技術(shù)一般用在程序查錯上。在程序調(diào)試的過程中,可以看到程序的執(zhí)行過程,包括函數(shù)的調(diào)用過程、形參實(shí)參的傳遞,變量的內(nèi)存地址等內(nèi)容,這樣可以很直觀地給學(xué)生講解函數(shù)的相關(guān)內(nèi)容,因此筆者在函數(shù)的教學(xué)中使用了程序調(diào)試技術(shù),使教學(xué)內(nèi)容不再抽象,而是具體化,使學(xué)生能夠更好地掌握相關(guān)知識,達(dá)到了較好的結(jié)果。

程序調(diào)試技術(shù)在函數(shù)教學(xué)中的具體使用:

1.通過調(diào)試技術(shù)直觀地查看函數(shù)的調(diào)用過程。首先設(shè)計一個簡單的使用函數(shù)的實(shí)例,jc函數(shù)實(shí)現(xiàn)計算n的階乘。在main函數(shù)中通過函數(shù)調(diào)用來求任意一個整數(shù)的階乘。double jc(int n),{ double mul=1;//……2,int i;for(i=1;i

2.通過程序調(diào)試技術(shù)了解函數(shù)參數(shù)傳遞過程和局部變量的概念。在函數(shù)教學(xué)中,形參和實(shí)參的關(guān)系往往是學(xué)生容易出錯的地方。形參和實(shí)參是兩個不同的變量,實(shí)參的作用就是給形參傳值。而函數(shù)的形參以及函數(shù)內(nèi)定義的變量都是函數(shù)的局部變量,只能在該函數(shù)中使用。而在調(diào)試中通過查看變量的值可以很清晰地看到這些知識的作用,則比較生動具體。在上例中,程序在斷點(diǎn)停下后,選擇debug工具欄中的watch項,打開watch對話框,在對話框中輸入num和n,如圖3所示,此時num的值是5,而由于jc函數(shù)還沒有被調(diào)用,形參n還不存在。然后選擇Step into(F11)項,跟蹤進(jìn)到j(luò)c函數(shù)內(nèi)部查看,注意觀察watch對話框的變化,發(fā)現(xiàn)n的值變?yōu)?,而num失效了,如圖4所示。這說明程序的執(zhí)行進(jìn)入到j(luò)c函數(shù),形參變量n被創(chuàng)建并從實(shí)參獲得了值5。而num是main函數(shù)的局部變量,在其他函數(shù)中如jc函數(shù)中是無法訪問的,從而失效。

3.通過調(diào)試技術(shù)加強(qiáng)對指針做函數(shù)參數(shù)的內(nèi)容的理解。在講解函數(shù)的過程中,指針做參數(shù)是重點(diǎn)和難點(diǎn)之一。教師在教學(xué)過程中強(qiáng)調(diào)指針做形參,可以突破局部變量的限制而訪問到其他函數(shù)的局部變量,這在以后的函數(shù)使用中經(jīng)常用到。但學(xué)生覺得很難理解。筆者通過調(diào)試技術(shù)運(yùn)行一個實(shí)例,查看實(shí)際的運(yùn)行過程,來加深學(xué)生對內(nèi)容的理解。首先設(shè)計一個簡單的指針做參數(shù)的實(shí)例。void fun(int * q){*q=10;//…….2}int main(){int n=89;int * p=&n;fun(p);//…….1printf("n=%d\n",n);return 0;},在標(biāo)號1處設(shè)置斷點(diǎn)。調(diào)試運(yùn)行該程序,在斷點(diǎn)處停下,p是fun函數(shù)的實(shí)參。此時選擇debug工具欄中的watch項,打開watch對話框,分別輸入p和&n,如圖5所示,它們值相同,都是0x0012ff44,表示n的內(nèi)存地址。然后選擇Step into項跟蹤進(jìn)入fun函數(shù)內(nèi)部執(zhí)行,由于p和n是main函數(shù)的局部變量,在fun函數(shù)內(nèi)部無法訪問,它們的值失效。然后,在watch對話框中再輸入q和*q,則可以看到如圖6的內(nèi)容。說明形參q從實(shí)參p獲得了值0x0012ff44,即q也保存了main函數(shù)中n的地址,而*q的意思是通過q保存的地址訪問該地址所表示的變量。繼續(xù)單步執(zhí)行,返回到main函數(shù)執(zhí)行,此時查看n的值,果真變?yōu)榱?0。即在fun函數(shù)內(nèi)部通過指針變量改變了main函數(shù)中局部變量的值。

筆者在實(shí)際的函數(shù)教學(xué)中采用了程序調(diào)試技術(shù),讓學(xué)生直觀地看到了程序的運(yùn)行過程,從而加深了學(xué)生對函數(shù)調(diào)用過程、參數(shù)傳遞、指針做參數(shù)等內(nèi)容的理解。學(xué)生反應(yīng)良好。計算機(jī)技術(shù)總是在不斷的發(fā)展,教師還要不斷地探索更好的教學(xué)方法,使C語言課程的教學(xué)質(zhì)量進(jìn)一步提高。

參考文獻(xiàn):

[1]譚浩強(qiáng).C程序設(shè)計(第四版)[M].清華大學(xué)出版社,2010.7.

第5篇

關(guān)鍵詞:C語言;編程;學(xué)習(xí)策略

中圖分類號:G642 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2016)22-0080-02

1 C語言產(chǎn)生的背景

計算機(jī)程序設(shè)計語言經(jīng)歷了從機(jī)器語言、匯編語言到高級語言的發(fā)展過程,機(jī)器語言是最原始的代碼語言,可以直接識別,也是第一代的計算機(jī)語言,隨著社會化發(fā)展變化,后來用匯編語言中的助記符代替操作碼來編寫程序,但由于匯編語言自身特點(diǎn)也存在局限性,根據(jù)社會發(fā)展需求于是產(chǎn)生了C語言,C程序是經(jīng)過編譯后可以直接執(zhí)行的面向過程的高級語言。

C語言是在BCPL語言的基礎(chǔ)上發(fā)展起來的。70年代初,美國貝爾實(shí)驗(yàn)室根據(jù)工作需要研發(fā)出BCPL語言,后來在1973年,貝爾實(shí)驗(yàn)室在BCPL語言的基礎(chǔ)上研發(fā)出了C語言程序,后來經(jīng)過多次改版本,到了80年代初,美國國家標(biāo)準(zhǔn)化協(xié)會根據(jù)C語言的發(fā)展變化,制定了新的C語言標(biāo)準(zhǔn),一直沿用到現(xiàn)今,為大多數(shù)編程者所遵循。

2 C語言的特點(diǎn)及優(yōu)勢

C語言是國際上廣泛流行的計算機(jī)高級語言,現(xiàn)如今被越來越多的計算機(jī)編程人士所使用,它不僅可以用來編寫軟件代碼,還可以用接近自然語言方式描述問題,同時兼顧高低級語言的優(yōu)點(diǎn),主要體現(xiàn)如下方面:

1)C語言簡便,結(jié)構(gòu)嚴(yán)謹(jǐn)、操作靈活。

2)C語言的運(yùn)算符較多且表達(dá)式類型豐富,編寫程序節(jié)約時間,工作效率高。

3)模塊化程序設(shè)計方法,可以把一個大問題按層次分解成多個小問題的設(shè)計思想,使編程更加靈活,算法設(shè)計自由度大。

4)C語言生成目標(biāo)代碼可操作性強(qiáng),程序執(zhí)行效率高。

5)C程序圖形功能較強(qiáng),程序可移植性好。

由于C語言這些特點(diǎn)及優(yōu)勢,使它成為計算機(jī)編程者必學(xué)的程序設(shè)計語言。

3 C語言編程中常見的現(xiàn)象

第一,大一新生剛?cè)胄iT,心理比較放松,大學(xué)的學(xué)習(xí)生活還未適應(yīng),就要開設(shè)程序設(shè)計語言課程,對于他們來說不知從何學(xué)起,心里沒底。上機(jī)實(shí)踐課時,C語言編程語法較嚴(yán)格,出現(xiàn)錯誤就不能運(yùn)行出結(jié)果,導(dǎo)致學(xué)生在學(xué)習(xí)過程中慢慢失去信心和成就感,學(xué)習(xí)興趣和熱情不高。

第二,C語言的算法和結(jié)構(gòu)有點(diǎn)復(fù)雜,理論的東西很難記住,聽起來感覺很枯燥無味,不容易理解。

第三,課時安排不夠合理,致使教師在每節(jié)課講授內(nèi)容必須保證進(jìn)度,這樣就給學(xué)生無形中增加了壓力。特別是在剛開始學(xué)習(xí)時,學(xué)生興趣都非常高,對程序設(shè)計課比較好奇感興趣,但在后來的學(xué)習(xí)過程中,面對每節(jié)課大量的枯燥代碼和編程理論及語法規(guī)則的限制,慢慢跟得有些吃力,往往是前面的內(nèi)容還沒有消化完,后面又開始新的內(nèi)容,時間長了就會讓學(xué)生產(chǎn)生消極心理,產(chǎn)生厭煩情緒,另外學(xué)習(xí)方法不對,也會導(dǎo)致學(xué)生缺少學(xué)習(xí)興趣。

4 C語言編程的學(xué)習(xí)策略

4.1 熟悉程序開發(fā)環(huán)境

C語言程序編寫一般經(jīng)過程序編輯、程序編譯、程序連接到程序運(yùn)行結(jié)果檢測這幾個步驟來實(shí)現(xiàn),建議在Visual C++編程平臺(也可選擇其他平臺)進(jìn)行實(shí)驗(yàn),好快速掌握C語言編程環(huán)境,熟悉程序代碼的調(diào)試過程, 為接下來的學(xué)習(xí)編程操作打下良好的基礎(chǔ)。

4.2 掌握C語言語法規(guī)則,養(yǎng)成良好的編程習(xí)慣

學(xué)習(xí)C語言基礎(chǔ)就是要學(xué)習(xí)它的語法規(guī)則,學(xué)習(xí)某種語句或命令。首先要了解它的規(guī)則是什么,作用是什么,怎么實(shí)現(xiàn)等,這樣可以為后面的學(xué)習(xí)打下堅固的堡壘作用。比如什么是常量、函數(shù)定義的格式及其意義是什么,使用什么樣的語句去運(yùn)用它,這樣想明白了編起程序來才能得心用應(yīng)手。那么在編程中除了要掌握好語法規(guī)則外,還應(yīng)培養(yǎng)較好的編程習(xí)慣,這樣可以提高工作效率,減少代碼出錯的機(jī)會。

4.3 精通算法技巧

學(xué)習(xí)編程就是要學(xué)習(xí)它的思維方法,畫流程圖就是在構(gòu)建寫程序思路的過程。當(dāng)畫好一個流程圖時編程思想也就出來了,再結(jié)合掌握的語法規(guī)則,在計算機(jī)環(huán)境下調(diào)試就可以出來了。程序=數(shù)據(jù)結(jié)構(gòu)+算法,算法就是解題思路與步驟,掌握分析問題、解決問題的方法,就是鍛煉分析、分解,最終歸納整理出算法的能力。計算機(jī)語言是表達(dá)方式,算法和數(shù)據(jù)結(jié)構(gòu)才是靈魂。算法可以用自然語言或流程圖來表示,在使用流程圖時,應(yīng)掌握一些流程符號,即用一些圖框來表示各種操作,直觀形象,易于理解,從而達(dá)到根據(jù)算法流程圖來完成程序的輸寫。

4.4 掌握四種結(jié)構(gòu)

C語言學(xué)習(xí)中掌握四種結(jié)構(gòu)即順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和模塊化程序結(jié)構(gòu)非常關(guān)鍵,因?yàn)檫@種這四種結(jié)構(gòu)決定了C語言代碼的執(zhí)行過程,相當(dāng)于是算法的流程體現(xiàn),它們彼此可以互相嵌套。C語言對數(shù)據(jù)的處理是通過“語句”的執(zhí)行來實(shí)現(xiàn)的,一條語句完成一項操作(或功能),一個為實(shí)現(xiàn)特定目的的程序應(yīng)包含若干條語句。

在實(shí)際編寫代碼過程中,常常將前三種結(jié)構(gòu)相互嵌套調(diào)用,以此設(shè)計出相應(yīng)的算法來解決工作中遇到的問題。如果是設(shè)計大型項目的話,編寫出的程序往往需要完成的功能較多,數(shù)據(jù)結(jié)構(gòu)較復(fù)雜,長篇符的代碼并不利用管理和維護(hù),為了解決這種狀況,如果采用C模塊化程序設(shè)計思路就方便較多。

C模塊化程序設(shè)計采用自頂向下逐步求精的設(shè)計結(jié)構(gòu),將一個大問題按層次分解成多個小問題的設(shè)計思路。一般由主控函數(shù)和子函數(shù)組成,即指將一個很大的代碼段劃分為一系列功能獨(dú)立的小代碼段部分,每個代碼段完成一個指定的功能,那么將這些代碼段合在一起就是一個完整的功能模塊。其中每個代碼段實(shí)質(zhì)就是一個具體的獨(dú)立子函數(shù),函數(shù)與函數(shù)間可以相互調(diào)用,但不能相互嵌套,通過主控函數(shù)可以調(diào)用子函數(shù)(子函數(shù)不能調(diào)用主控函數(shù))可以將各個函數(shù)模塊聚合為一個整體完成相應(yīng)的功能。因而,定義函數(shù)、定義函數(shù)名(函數(shù)名表示功能)、函數(shù)調(diào)用和返回值等就很關(guān)鍵和重要,初學(xué)的人要通過不斷地上機(jī)實(shí)踐才能掌握編程的流程和精髓。

4.5 熟知函數(shù)定義

函數(shù)就是完成相對獨(dú)立功能的程序段,它具有獨(dú)立性,代碼適中,分析問題層次清楚等特性。函數(shù)由函數(shù)說明和函數(shù)體兩部分構(gòu)成,函數(shù)說明包括函數(shù)值類型、函數(shù)名、參數(shù)類型及參數(shù)說明;函數(shù)說明之后的花括號“{}”部分為函數(shù)體,里面由C語句構(gòu)成。函數(shù)調(diào)用時,實(shí)參與形參應(yīng)保持個數(shù)、次序及類型的一致性,以確保實(shí)參與形參之間數(shù)據(jù)的正確傳遞,為提高編程效率打下良好的奠定基礎(chǔ)。

4.6 具備數(shù)學(xué)知識

編程是人把要表達(dá)的思想,通過計算機(jī)語言表達(dá)出來 所以最重要的就是數(shù)學(xué)邏輯思維。在C語言學(xué)習(xí)過程中,較好的邏輯思維可以比較容易學(xué)習(xí)C語言編程分析,選擇更簡捷的運(yùn)算流程,C的核心語法并不要求很高的數(shù)學(xué)知識,高中階段接觸到的概念性的知識就足以應(yīng)付。因而,數(shù)學(xué)知識對學(xué)習(xí)C語言重要性還是比較大。

4.7 會調(diào)用C語言庫函數(shù)

庫函數(shù)就是把函數(shù)放到庫里,是別人把一些常用到的函數(shù)編完放到一個文件里,供程序員使用,程序員用的時候把它所在的文件名用#include指令加到里面就可以了(尖括號內(nèi)填寫文件名),例如#include。在編程時候需要調(diào)用庫函數(shù).

4.8 指針在C語言中的靈活運(yùn)用

指針是C語言的一種數(shù)據(jù)類型,是指向變量和對象的地址,是C語言學(xué)習(xí)的重點(diǎn)內(nèi)容。 指針的用途非常廣泛,假設(shè)想通過函數(shù)改變一個變量的值,就得用指針而不能用值傳遞,特別是對象的數(shù)據(jù)量非常大,往往編程人員就會用指針來做形參,只需要傳遞一個地址就可以,大大提高了工作效率。另外,指針變量可以訪問內(nèi)存地址,也可以訪問數(shù)組和字符串,使編寫的C程序代碼更簡潔,效率高。指針的學(xué)習(xí)在C語言中是關(guān)鍵的內(nèi)容,也是學(xué)好C的精髓所在,為了高質(zhì)量地完成程序的編寫,就需要掌握指針在C語言中的靈活運(yùn)用,那就要能通過上機(jī)反復(fù)地調(diào)試代碼,從實(shí)踐中總結(jié)問題,完成指針的學(xué)習(xí)。

4.9 讀代碼和程序

C語言編程不只是理論性的知識,它還要求上機(jī)動手操作能力更強(qiáng)一些。每次C語言課的學(xué)習(xí),只有通過上機(jī)輸入大量代碼的練習(xí),才能發(fā)現(xiàn)錯誤代碼段,分析解決存在的問題,不斷總結(jié)經(jīng)驗(yàn),鞏固課堂上老師所講的內(nèi)容。C語言編程不是單純靠理論記憶就能學(xué)好的,它需要大量的上機(jī)實(shí)驗(yàn)來鞏固,才能加深知識的消化理解,開拓編程思維,提高解決問題的能力,培養(yǎng)良好的編程態(tài)度。

讀程序和分析他人寫的代碼也是學(xué)習(xí)C語言較好的途徑,仔細(xì)研讀程序時,注意分析別人是如何運(yùn)用編程技巧的,研究它的實(shí)現(xiàn)方法和程序設(shè)計技巧,提高自己的程序設(shè)計能力,直到每一行都理解了,然后找?guī)讉€題目編寫,自己試圖寫出程序,反復(fù)實(shí)踐,這樣就能從錯誤中分析代碼出錯的原因,進(jìn)行調(diào)試正確的代碼段,不斷積累經(jīng)驗(yàn),反反復(fù)復(fù)直到搞懂為止。時間久了,慢慢就對程序的掌握有一個比較清晰的過程。

4.10 借助網(wǎng)絡(luò)資源

C語言的學(xué)習(xí)在課堂上的知識還是有限的,如果想獲取更多的知識,可以借助網(wǎng)絡(luò)平臺來完成資料的補(bǔ)充。一方面可以在教學(xué)網(wǎng)站上得到相關(guān)的學(xué)習(xí)內(nèi)容;另一方面可以登錄相關(guān)論壇或C語言專題微信群參與討論,獲取學(xué)習(xí)經(jīng)驗(yàn),探討編程技巧,這樣對于學(xué)習(xí)者來說都非常便利。

5 結(jié)束語

C語言是計算機(jī)編程語言中應(yīng)用最流行的一種高級語言,在C語言學(xué)習(xí)過程中,本文針對C語言特點(diǎn)、出現(xiàn)的現(xiàn)象和學(xué)習(xí)策略進(jìn)行了分析,只要學(xué)習(xí)者認(rèn)真領(lǐng)會C語言功能的強(qiáng)大,具備持之以恒的學(xué)習(xí)韌勁,一定會在實(shí)際學(xué)習(xí)中取得優(yōu)異的結(jié)果。同時,C語言作為高校公共基礎(chǔ)課,學(xué)習(xí)好它不但能提高自己的編程能力,還對整個計算機(jī)語言的學(xué)習(xí)起到奠基作用,為社會培養(yǎng)綜合型人才更好的服務(wù)。

參考文獻(xiàn):

第6篇

關(guān)鍵詞:DSP C語言 并行匯編 混合編程

TMS320C62X是美國德州儀器公司TI的新一代高性能定點(diǎn)數(shù)字信號處理器(DSP)芯片。基于DSP的軟件設(shè)計問題,就是采用編程語言進(jìn)行算法實(shí)現(xiàn)并使程序效率盡量滿足實(shí)時性要求。TI DSP的軟件設(shè)計可以采用匯編語言、高級語言C/C++以及C語言與匯編語言的混合編程。完全采用匯編語言編程復(fù)雜性高、開發(fā)周期長,而完全采用C語言編程則程序的執(zhí)行效率相對較低,不能滿足實(shí)時性的要求。為了設(shè)計出性價比最好、開發(fā)周期較短、比較復(fù)雜的DSP系統(tǒng),可以采用混合語言編程,把C語言和匯編語言的優(yōu)點(diǎn)有效地結(jié)合起來。C語言和匯編語言的混合編程有三種形式:在編寫C語言代碼中插入?yún)R編語句只需在匯編語句兩邊加上雙引號和括號,在括號前面加上標(biāo)識asm,如asm“匯編語句”;在編寫C代碼的過程中調(diào)用內(nèi)聯(lián)函數(shù)TMS320C62X中有一些直接映射為內(nèi)聯(lián)的C6000指令的特殊函數(shù),內(nèi)聯(lián)函數(shù)用前下劃線_表示,使用時同調(diào)用C語言的庫函數(shù)一樣調(diào)用它,如b=_nassertN>=10;匯編代碼以C代碼可以調(diào)用的函數(shù)出現(xiàn)。本文采用第三種形式。為了使程序代碼的執(zhí)行具有盡可能高的執(zhí)行效率,本文將著重點(diǎn)放在并行匯編代碼的編程,而不是線性匯編代碼的編程。

1 C語言與匯編語言混合編程的接口規(guī)范和標(biāo)準(zhǔn)

用C語言編寫的代碼中核心代碼常常只是整個程序代碼的5%,但是卻占用了整個程序約95%的執(zhí)行時間。對這些核心代碼采用匯編語言編寫,可以大大提高代碼的執(zhí)行效率,而C語言程序可以象調(diào)用C程序的一個函數(shù)那樣去調(diào)用這個匯編函數(shù)。為了實(shí)現(xiàn)C語言和匯編語言的混合編程,需要注意一些規(guī)定的接口規(guī)范和標(biāo)準(zhǔn)。

(1)采用C語言和匯編語言混合編程時,TMS320C62X定義了一套嚴(yán)格的寄存器規(guī)則。這個寄存器規(guī)則表明了編譯器如何使用這些寄存器以及在函數(shù)調(diào)用過程中如何保護(hù)這些寄存器。

調(diào)用函數(shù)保護(hù)了寄存器A0~A9和B0~B9,這就使得在編寫匯編程序的時候可以任意的使用這幾個寄存器而不需保護(hù)它們。但當(dāng)使用到寄存器A10~A15或B10~B15的時候,則必須自行對它們進(jìn)行保護(hù)。長型、雙精度型或者是長雙精度型的數(shù)據(jù)對象要放在一個奇/偶寄存器對(如A1:A0)里,奇數(shù)寄存器存放著數(shù)據(jù)的符號位、指數(shù)位和最高有效位,而偶數(shù)寄存器則存放著低有效位。

在默認(rèn)情況下,A3用作返回結(jié)構(gòu)指針寄存器,B3用作被調(diào)用函數(shù)返回地址寄存器,A15用作幀指針寄存器,B14用作數(shù)據(jù)頁指針寄存器,B15用作堆棧指針寄存器。這些寄存器在被調(diào)用的匯編函數(shù)中用到時都要進(jìn)行保護(hù)。

(2)調(diào)用函數(shù)將參數(shù)傳遞到被調(diào)用函數(shù)中,前十個參數(shù)將被從左到右依次放入寄存器A4、B4、A6、B6、A8、B8、A10、B10、A12和B12,如果傳遞的參數(shù)是長型、雙精度型或者是長雙精度型,則將參數(shù)依次放入寄存器組A5:A4、B5:B4、A7:A6等,并將剩下的變量按相反的順序放在堆棧里。注意,如果傳遞的參數(shù)是一個結(jié)構(gòu)類型的參數(shù),則傳遞的是該結(jié)構(gòu)類型的地址。

(3)如果在C/C++調(diào)用函數(shù)中做了正確的函數(shù)返回聲明,則被調(diào)用的匯編函數(shù)可以返回有效值。如果返回值是整型或32位的浮點(diǎn)型,則放在寄存器A4中返回;如果返回值是雙精度或是長雙精度型,則放在A5:A4中返回;如果返回值是一個結(jié)構(gòu)類型,則將其結(jié)構(gòu)的地址放在A3中返回。

(4)編譯器為所有的外部對象指定一個鏈接時的名字。當(dāng)寫匯編語言代碼時,必須用與這個名字相同的名字。對于只在匯編語言模塊中用到的變量的標(biāo)識符,不能從下劃線開始。任何一個在匯編語言中聲明的對象都要使其在C/C++中是可訪問的,那么在匯編語言中必須用.def 或.global將其聲明為外部變量。同樣在匯編語言中要引用C/C++函數(shù)或?qū)ο髸r,必須用.ref 或.global將C/C++對象聲明,這將產(chǎn)生一個在匯編語言函數(shù)中沒有定義的由鏈接器辨識的外部引用。

還有一些細(xì)節(jié)也需要注意,如中斷子程序必須把該子程序?qū)⒁玫降乃屑拇嫫鬟M(jìn)行入棧處理;除了全局變量的初始化外,匯編語言的模塊不得因?yàn)槿魏文康亩褂?cinit段;匯編代碼的結(jié)束需用指令B.s2 B3將程序執(zhí)行從被調(diào)用函數(shù)返回到C語言調(diào)用函數(shù)中。

2 并行匯編代碼的編寫

C6000的匯編代碼格式如下:

標(biāo)號: 并行標(biāo)記 條件寄存器指令助記符 功能單元 操作數(shù) ;注釋。如:

LDW .D2 B4,B2

|| A1SHL .S2X A4,B4 ;用到了交叉數(shù)據(jù)通道

TMS320C62X片內(nèi)有8個并行的處理單元,分為相同的兩組。其體系結(jié)構(gòu)采用超長指令字(VLIW)結(jié)構(gòu),一個指令包里的8條并行指令可同時分配到8個處理單元并行運(yùn)行。這種一個指令包里有8條指令并行執(zhí)行也給并行匯編代碼的編寫帶來很多要考慮的問題具體如下:

(1)TMS320C62X指令的執(zhí)行可以用延遲間隙來說明。延遲間隙在數(shù)量上等于從指令的源操作數(shù)被讀取到執(zhí)行的結(jié)果可以被訪問所用的指令周期。如對于乘法指令(MPY),源操作數(shù)從第i個周期被讀取,則其計算結(jié)果在第(i+2)個周期才可用。

(2)使用相同功能單元的兩條指令不能被安排為并行指令。

(3)使用同一條交叉通路的兩條指令不能被安排在同一個執(zhí)行指令包中,這是因?yàn)閺募拇嫫鹘MA~B或者從B~A都只有一條交叉通路。

4將數(shù)據(jù)讀入到(或存儲自)相同寄存器組的兩條讀(寫)指令不能被安排在同一個執(zhí)行包中。

第7篇

(武漢鐵路職業(yè)技術(shù)學(xué)院 湖北 武漢 430205)

摘 要:對C語言的有關(guān)方面展開分析,介紹了C語言的基本程序形式、C語言中的語句分類、C語言與其他許多語言相比具體有什么特點(diǎn),C語言的開發(fā)基本流程、C語言常見的錯誤簡析及修改。最后對學(xué)習(xí)C語言給予總結(jié)和提示。

關(guān)鍵詞 :C語言;語句分類;C語言流程;常見錯誤

中圖分類號:TP312 文獻(xiàn)標(biāo)識碼:A doi:10.3969/j.issn.1665-2272.2015.10.048

收稿日期:2015-03-16

1 初識C語言程序

從這個簡單的C程序可以看出,C程序結(jié)構(gòu)由頭文件、主函數(shù)、系統(tǒng)的庫函數(shù)組成,但程序功能不能,C程序的組成也有所不同,有時需要自定義函數(shù)來完成必要的功能。其中main主函數(shù)時每個C語言程序都必須包含的部分,而且main主函數(shù)的位置在程序中是任意的。

2 C語言的特點(diǎn)

與其他許多語言相比,C語言的特點(diǎn)有:①語言簡潔靈活。C語言只有32個標(biāo)準(zhǔn)關(guān)鍵字,9種程序控制語句,程序書寫形式自由;②數(shù)據(jù)類型和運(yùn)算符十分豐富。既有系統(tǒng)定義的簡單類型:整型、實(shí)型、字符型等。又有用戶自定義的構(gòu)造類型:數(shù)組類型、結(jié)構(gòu)體類型、共用體類型等;③數(shù)據(jù)結(jié)構(gòu)豐富。C語言提供了整型、實(shí)型、字符型等基本數(shù)據(jù)類型外,還提供了用基本數(shù)據(jù)類型構(gòu)造出的各種復(fù)雜的數(shù)據(jù)結(jié)構(gòu),如數(shù)組、結(jié)構(gòu)體、共用體等。另外,C語言還引入了與地址密切相關(guān)的指針類型,使得C語言的計算功能、邏輯判斷功能非常強(qiáng)大;④允許直接訪問物理地址。C語言中的位運(yùn)算和指針運(yùn)算符能夠直接對內(nèi)存地址進(jìn)行訪問操作,可以實(shí)現(xiàn)匯編語言的大部分功能。即直接對硬件進(jìn)行操作;⑤它提供了大量的庫函數(shù)供調(diào)用。簡化了程序設(shè)計工作;⑥生成目標(biāo)代碼質(zhì)量高。一般只比匯編生成的目標(biāo)代碼效率低10%~20%。C語言提供了一個相當(dāng)大的運(yùn)算符集合,而且其中大多數(shù)運(yùn)算符與一般機(jī)器指令一致,可直接翻譯成機(jī)器代碼,因此,保證了C語言編寫的程序生成的代碼質(zhì)量高,從而帶來了編譯和執(zhí)行的高效率;⑦用C語言寫的程序可移植性好。C語言提供的與硬件有關(guān)的操作,如數(shù)據(jù)的輸入輸出等,都是通過調(diào)用系統(tǒng)提供的庫函數(shù)來實(shí)現(xiàn)的。庫函數(shù)本身不是C語言的組成部分,因此用C語言編寫的程序能夠很容易的從一種計算機(jī)環(huán)境移植到另一種計算機(jī)環(huán)境中;⑧C語言學(xué)習(xí)難度較大。特別是指針、地址、函數(shù)調(diào)用等內(nèi)容較難度大,需要認(rèn)真學(xué)習(xí)才能掌握。

3 C語言程序的開發(fā)流程

從編寫一個C語言源程序到得到最終的結(jié)果一般需要經(jīng)過4個基本步驟:程序編輯、程序編譯、程序鏈接、程序運(yùn)行(見圖1)。

4 C語言常見錯誤及分析

4.1.1 遺漏分號出現(xiàn)的錯誤

這個錯誤一般常出現(xiàn)在初學(xué)者所編程序中。

5 結(jié)論

C語言程序設(shè)計是一門強(qiáng)調(diào)實(shí)踐練習(xí)的課程,沒有捷徑可走,只有不斷地實(shí)踐、練習(xí)、發(fā)現(xiàn)問題,不斷解決問題,才能孰能生巧,舉一反三才能將所學(xué)知識鞏固發(fā)揮,最終掌握結(jié)構(gòu)化程序的精髓,獨(dú)自編寫優(yōu)秀高效的C語言程序。

參考文獻(xiàn)

1 孫麗云.C語言程序設(shè)計教程[M].北京:化學(xué)工業(yè)出版社,2013

2 王立. 二級C語言程序教程[M].武漢:華中科技大學(xué)出版社,2014

第8篇

關(guān)鍵詞:C語言;文件處理;程序

中圖分類號:TP312文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2010)17-4711-03

Based on C Language Program of the Realization of File Processing and Analysis

YU Min

(Changzhou Liu Guojun Vocational Technology College,Changzhou 213000, China)

Abstract: Using read and write technical of C language, you can read data from a disk file to the computer memory, after processing the data or intermediate results still can output to disk file permanent preservation. This article by "rating of handling procedures" as an example, this paper expounds the C language file processing method and process of the general.

Key words: C language; file handling; program

C語言具有較強(qiáng)的文件處理功能。C文件是典型的流式文件。在c語言中,文件被視為一個字符的序列,是由一個一個字符的數(shù)據(jù)順序組成,而文件的存取是以字符為單位。根據(jù)數(shù)據(jù)的組織形式,C文件可分為文本文件(ASCⅡ文件)和二進(jìn)制文件。

運(yùn)用C語言,可以編制程序?qū)崿F(xiàn)對一個已經(jīng)存在的記錄文件中的數(shù)據(jù)進(jìn)行處理,結(jié)果信息既可顯示到屏幕終端,也可再次保存到磁盤文件中去。本文以“評分處理程序”的實(shí)現(xiàn)為例,闡述了C語言文件處理的一般流程和方法。

1 需求分析

某競賽活動,聘請十位專家作為評委為八位參賽選手進(jìn)行現(xiàn)場打分,現(xiàn)已將選手的評分存于文本文檔score.txt中,試以此為原始數(shù)據(jù),去掉一個最高分和一個最低分后取余下分?jǐn)?shù)的平均分,作為每位選手的最終得分并按此由高到低排名后存入文本文檔result.txt中。

1.1 處理流程

事務(wù)處理流程(不包括數(shù)據(jù)處理的具體過程)如圖1所示。

1.2 具體任務(wù)

1) 從文本文件score.txt中(如圖2所示),按格式讀出原始數(shù)據(jù)顯示到屏幕,求出每位選手的總分存total數(shù)組中并顯示到屏幕。

2) 找出每位選手的最高分和最低分后顯示到屏幕。

3) 總分去掉一個最高分和一個最低分后取余下分?jǐn)?shù)的平均分作為每位選手的最終得分仍存total數(shù)組中并顯示到屏幕。

4) 按最終得分由高到低排名后存入文本文件result.txt中(如圖3所示)。

2 源文件分析

在文本文件score.txt中,以記錄的形式存放了十位評委對八位參賽選手的打分。每行記錄均按選手編號,選手姓名和十位評委的打分依次存放,且編號和姓名為字符,評委打分為保留二位小數(shù)的實(shí)數(shù)。如何將數(shù)據(jù)從文件讀取到內(nèi)存中?如何存放?根據(jù)前面介紹,C文件可視為由一個個字符數(shù)據(jù)順序組成的字符序列。則可選用fscanf函數(shù),從此文件流中執(zhí)行格式化輸入,將編號、姓名和分?jǐn)?shù)按不同的格式讀入到內(nèi)存。讀入后,可將八位選手的編號(三位字符)存放在二維字符數(shù)組number[8][4],姓名(不超過四個漢字即八個字符)存放在二維字符數(shù)組name[8][9],十位評委的打分則存放在二維實(shí)型數(shù)組score[8][10]中待處理。為方便讀者理解數(shù)據(jù)讀入前后在文件與內(nèi)存中的存放形式,將score.txt文件內(nèi)容劃分成三大塊對應(yīng)內(nèi)存中的number,name和score數(shù)組。

3 程序設(shè)計與實(shí)現(xiàn)

用C語言實(shí)現(xiàn)評分處理程序,使其具有讀源數(shù)據(jù)文件、求總分、平均分、最高分、最低分、排序和寫結(jié)果文件等功能。

3.1 序設(shè)計思路

C語言是面向結(jié)構(gòu)的程序設(shè)計語言,且C程序是由函數(shù)構(gòu)成的。根據(jù)功能設(shè)計本程序的函數(shù)包括:主函數(shù)main( )、讀文件函數(shù)readfile( ) 、數(shù)據(jù)處理函數(shù)dealscore( ) 、求最高分函數(shù)max( ) 、求最低分函數(shù)min( ) 、排序函數(shù)getorder( )和寫文件函數(shù)writefile( )。各函數(shù)間通過函數(shù)調(diào)用實(shí)現(xiàn)功能的整合,其中主函數(shù)分別調(diào)用讀文件函數(shù)、數(shù)據(jù)處理函數(shù)、排序函數(shù)和寫文件函數(shù);數(shù)據(jù)處理函數(shù)再分別調(diào)用求最高分函數(shù)和求最低分函數(shù)。

3.2 程序流程圖

本程序的執(zhí)行流程如圖4所示。

3.3 程序?qū)崿F(xiàn)方法

1) 主函數(shù):按一定順序調(diào)用各功能函數(shù),串起整個程序,實(shí)現(xiàn)本程序功能。

2) 讀文件函數(shù):主要實(shí)現(xiàn)從給定文件中讀取數(shù)據(jù)存數(shù)組并按格式顯示到屏幕。首先定義文件指針fpscore,再利用fopen函數(shù)打開文件,由于score.txt為文本文件,則選用“r”方式打開。然后讀文件存相應(yīng)數(shù)組,C語言中讀文件的函數(shù)較多,有讀入單個字符函數(shù)fgetc、讀入字符串函數(shù)fgets、讀入數(shù)據(jù)塊函數(shù)fread(一般適用于二進(jìn)制文件)和格式化讀入函數(shù)fscanf。根據(jù)前面介紹的源文件分析及數(shù)據(jù)處理的要求,選擇使用fscanf函數(shù)進(jìn)行格式化讀入,并且存入不同類型和大小的數(shù)組:number,name和score。fscnaf函數(shù)的原型是:fscanf(文件指針,格式字符串,輸入表列);其中文件指針即為fpscore,格式字符串中依次為%s,%s和十個%f及\n,分別控制輸入表列中的number[k],name[k]和score[k][0]~ score[k][9],按行循環(huán)地讀入,其中k指第k位選手,每讀完一行選手的數(shù)據(jù),變量k就累加一次,故當(dāng)本程序段執(zhí)行完后,k正好為選手的人數(shù)。循環(huán)可利用while語句實(shí)現(xiàn),只要不到文件末尾就讀文件,關(guān)于是否已讀到文本文件末尾,可用EOF判斷或feof函數(shù)測試,此處用feof函數(shù)測試實(shí)現(xiàn)較為方便。最后利用fclose函數(shù)關(guān)閉該文件。

3) 數(shù)據(jù)處理函數(shù):主要實(shí)現(xiàn)求每位選手的最終得分。首先利用for循環(huán)求出每位選手的十位評委的評分之和存入total數(shù)組,再調(diào)用max( ) 和min( )函數(shù)求出每位選手的最高分和最低分,最后按總分去掉一個最高分和去掉一個最低分后求平均的方法求出每位選手的最終得分。并將這些中間結(jié)果顯示到屏幕,如圖5所示。

4) 求最高分函數(shù):主要實(shí)現(xiàn)求某位選手的最高分。函數(shù)為有參函數(shù),形式參數(shù)為minscore[10],接收dealscore( )函數(shù)中實(shí)際參數(shù)score[i]的值,兩者類型一致,且score[i]其實(shí)表示第i位選手的十個評分,故大小也一致,可以實(shí)現(xiàn)數(shù)據(jù)的傳遞。然后利用比較法求出一組數(shù)中的最大值即為最高分。最后用return語句返回最高分給主調(diào)函數(shù)待處理。實(shí)現(xiàn)代碼如下:

/*求最高分函數(shù)*/

float max(float maxscore[10])

{int i;

float max=maxscore[0];

for(i=1;i

if(maxscore[i]>max) max=maxscore[i];

return(max);}

5) 求最低分函數(shù):主要實(shí)現(xiàn)求某位選手的最低分。方法與求最高分類似,就不做說明。

6) 排序函數(shù):主要實(shí)現(xiàn)將數(shù)據(jù)按最終得分由高到低排序。排序算法選用冒泡算法,算法中數(shù)據(jù)交換的條件是前一最終得分小于后一最終得分,值得注意的是:編號和姓名均為字符串,C語言中字符串的交換必須使用字符串處理函數(shù)strcpy()實(shí)現(xiàn)。另外,除了交換編號、姓名、最終得分外還需依次同時交換該相鄰兩位選手的十個評分,否則score數(shù)組中的數(shù)據(jù)將混亂。

實(shí)現(xiàn)代碼如下:

/*排序函數(shù)*/

void getorder(char num[100][4],char xm[100][9],float cj[100][10],float sum[100],int t)

{int i,m,n;

char x[4],y[9];

float s,f;

for(m=1;m

{for(n=0;n

if(sum[n]

{strcpy(x,num[n]);strcpy(num[n],num[n+1]);strcpy(num[n+1],x);

strcpy(y,xm[n]);strcpy(xm[n],xm[n+1]);strcpy(xm[n+1],y);

for(i=0;i

{f=cj[n][i];cj[n][i]=cj[n+1][i];cj[n+1][i]=f;}

s=sum[n];sum[n]=sum[n+1];sum[n+1]=s; }}}

7) 寫文件函數(shù):主要實(shí)現(xiàn)將最終結(jié)果寫入文本文件result.txt中。首先定義文件指針fpdkdz,再利用fopen函數(shù)打開文件,由于result.txt為文本文件,則選用“w”方式打開。然后將名次、編號、姓名、得分依次寫入文件,C語言中寫文件的函數(shù)也較多,有寫入單個字符函數(shù)fputc、寫入字符串函數(shù)fputs、寫入數(shù)據(jù)塊函數(shù)fwrite(一般適用于二進(jìn)制文件)和格式化寫入函數(shù)fprintf。根據(jù)要求選擇使用fprintf函數(shù)進(jìn)行格式化寫入,每寫完一位選手的結(jié)果就換一行。其中名次可用計數(shù)器i依次累加實(shí)現(xiàn)。最后利用fclose函數(shù)關(guān)閉該文件。

4 結(jié)論與分析

C語言中文件處理的一般步驟可歸納為:先利用fopen()函數(shù)配合恰當(dāng)?shù)氖褂梅绞酱蜷_文件,再選擇適當(dāng)?shù)淖x寫函數(shù)讀寫文件,最后切記一定要利用fclose()函數(shù)關(guān)閉該文件,以避免意外的發(fā)生。

筆者認(rèn)為C語言文件操作時還應(yīng)特別注意區(qū)分文本文件與二進(jìn)制文件,根據(jù)文件類型和具體要求選擇合適的文件使用方式。另外,在讀寫文件尤其是讀文件時還應(yīng)關(guān)注文件的位置指針,必要時可使用rewind()函數(shù)重定位或fseek()函數(shù)移動位置指針,進(jìn)行隨機(jī)讀寫。

C語言文件處理較為實(shí)用,許多可供實(shí)際使用的C程序中都包含文件處理,掌握好文件的使用,還需更多的實(shí)踐和探索。

參考文獻(xiàn):

[1] 譚浩強(qiáng).C語言程序設(shè)計[M].北京:清華大學(xué)出版社,2005.

第9篇

關(guān)鍵詞: Fortran 90;接口塊;C++;面向?qū)ο蟪绦蛟O(shè)計;函數(shù)重載

中圖分類號:TP314 文獻(xiàn)標(biāo)識碼:A 文章編號:1671-7597(2011)1210193-02

0 引言

面向?qū)ο蠓椒ǜ臃先祟愃季S習(xí)慣,在軟件開發(fā)中被公認(rèn)為是能夠提高代碼重用性和可維護(hù)性的有效方法。C++支持面向?qū)ο蟪绦蛟O(shè)計,其函數(shù)重載機(jī)制可以提高程序設(shè)計的可讀性和靈活性,是面向?qū)ο蟪绦蛟O(shè)計的一個常用方法。

Fortran語言是最早誕生的高級語言,廣泛應(yīng)用于科學(xué)與工程計算領(lǐng)域。與Fortran 77相比,F(xiàn)ortran 90增加了模塊、自定義類型、指針、接口塊等新工具[1],使其具有了一些現(xiàn)代語言特征,但仍是面向過程的編程語言,不直接支持函數(shù)重載等面向?qū)ο蟪绦蛟O(shè)計[2]。

本文利用Fortran 90新提供的接口塊等工具,對C++函數(shù)重載進(jìn)行模擬,并通過實(shí)例進(jìn)行驗(yàn)證。C++開發(fā)環(huán)境為Visual C++ 6.0,F(xiàn)ortran 90開發(fā)環(huán)境為Compaq Visual Fortran 6.6。

1 函數(shù)重載

1.1 函數(shù)重載現(xiàn)象

數(shù)學(xué)上求一個數(shù)的絕對值,這個數(shù)既可以是整數(shù)也可以是實(shí)數(shù),所調(diào)用的是同一個函數(shù)。假如用C語言編寫一個求絕對值的函數(shù),由于參數(shù)的數(shù)據(jù)類型不同,需要定義兩個不同名稱的函數(shù),分別對整數(shù)和實(shí)數(shù)進(jìn)行求值:

Int iabs(int);float fabs(float);

盡管這兩個函數(shù)都是實(shí)現(xiàn)求絕對值的功能,函數(shù)名稱卻不同,這與人們的日常思維習(xí)慣不符,給程序設(shè)計人員記憶和使用函數(shù)帶來不便。針對此類問題,C++則通過函數(shù)重載來解決[3]。函數(shù)重載是指在同一作用域內(nèi),用相同的函數(shù)名對應(yīng)不同的函數(shù)實(shí)現(xiàn),這些不同實(shí)現(xiàn)的同名函數(shù)稱為重載函數(shù)。例如,C++可以將求絕對值的函數(shù)定義成一組函數(shù)名相同的重載函數(shù):

int abs(int);float abs(float);

在調(diào)用程序中,由C++編譯器根據(jù)實(shí)參和形參的匹配,自動選擇調(diào)用哪一個重載函數(shù)。被重載的函數(shù)須同時滿足以下條件:

1)要有兩個或兩個以上,且在同一作用域內(nèi);

2)實(shí)現(xiàn)的功能必須相同,函數(shù)名必須相同;

3)至少要在參數(shù)類型、參數(shù)個數(shù)或參數(shù)順序上有所不同,即參數(shù)表不同。

C++函數(shù)重載包括類成員函數(shù)重載和普通函數(shù)重載,二者在本質(zhì)上是相同的,都是函數(shù)名相同參數(shù)表不同。故此,本文以普通函數(shù)重載為例進(jìn)行說明。

值得注意的是:C/C++與Fortran同屬編譯型語言,其實(shí)現(xiàn)例程(函數(shù)和子程序統(tǒng)稱為例程)的機(jī)制相同,F(xiàn)ortran有返回值的例程為函數(shù)(Function),無返回值的例程為子程序(Subroutine);C/C++中

類型的函數(shù)無返回值,其它類型的函數(shù)有返回值,分別與Fortran中的子程序和函數(shù)對應(yīng)。換言之,C++中的函數(shù)重載實(shí)際包括Fortran中的函數(shù)與子程序二種例程的重載。

1.2 函數(shù)重載的實(shí)現(xiàn)

在C++中,以交換兩個整數(shù)和兩個實(shí)數(shù)為例分析函數(shù)重載的實(shí)現(xiàn)。

#include

void swop(int & x, int & y) // 定義重載函數(shù),參數(shù)以引用方式傳遞

{ int t; t = x; x = y; y = t; }

void swop(float & x, float & y) // 定義重載函數(shù),參數(shù)以引用方式傳遞

{ float t; t = x; x = y; y = t; }

void main( void ) // 主函數(shù)

{ int a = 3, b = 4; float c = 2.5, d = 6.9;

swop(a, b); cout

swop(c, d); cout

其中,用同一函數(shù)名swop分別定義了兩個參數(shù)表不同,功能相同的重載函數(shù)。在主函數(shù)中,分別調(diào)用重載函數(shù)swop對整型數(shù)a、b和實(shí)型數(shù)c、d進(jìn)行交換,程序運(yùn)算結(jié)果為a=4;b=3與c=6.9;d=2.5,實(shí)現(xiàn)了正確調(diào)用。從而證明:C++編譯器能夠根據(jù)參數(shù)表匹配的原則,自動判斷并選擇調(diào)用合適的重載函數(shù)。

實(shí)質(zhì)上,C++編譯器在編譯重載函數(shù)時,會依據(jù)參數(shù)表的不同給目標(biāo)重載函數(shù)添加不同的修飾,依此來對重載函數(shù)加以區(qū)分。這樣,才使得函數(shù)重載機(jī)制得以成立。

2 模擬函數(shù)重載

2.1 模擬手段-接口塊

在C/C++語言程序中,通常使用頭文件作為調(diào)用程序與系統(tǒng)庫函數(shù)之間的橋梁和紐帶。頭文件中描述了各個系統(tǒng)庫函數(shù)的函數(shù)名、返回值類型與參數(shù)列表等接口信息,但其本身并不包含庫函數(shù)的實(shí)現(xiàn)代碼。用戶調(diào)用庫函數(shù)時,由編譯器按照頭文件中的函數(shù)原型從相應(yīng)庫中提取庫函數(shù)的實(shí)現(xiàn)代碼參與運(yùn)算。

Fortran 90新增加的接口塊具有與C/C++頭文件類似的作用,可以在調(diào)用程序中通過接口塊明確被調(diào)外部例程的接口信息,如例程是函數(shù)還是子程序、例程名、函數(shù)返回值類型、參數(shù)的個數(shù)、傳遞方式及其數(shù)據(jù)類型等,這樣,調(diào)用程序就能對外部例程產(chǎn)生正確調(diào)用。

假如不使用接口塊,我們用Fortran 90外部例程(子程序)實(shí)現(xiàn)一個簡單算法:

Subroutine PrintReal (x)

Implicit None ! 廢除Fortran 77的隱含聲明,即I-N規(guī)則

Real x

Print*, "x = ", x ! 將參數(shù)x(實(shí)型)輸出到屏幕

End Subroutine

調(diào)用該外部例程的主程序?yàn)椋?/p>

Program Main

Implicit None

External PrintReal ! 聲明PrintReal為外部例程

Integer :: a = 1.0

Call PrintReal(a) ! 調(diào)用PrintReal外部例程

End Program

程序編譯、鏈接都沒問題,但程序運(yùn)行結(jié)果為x=1.4012985E-45,顯然是錯誤的。原因是形參x的數(shù)據(jù)類型為實(shí)型,對應(yīng)實(shí)參a的數(shù)據(jù)類型卻為整型,實(shí)參與形參的數(shù)據(jù)類型不匹配,從而導(dǎo)致調(diào)用錯誤。假如我們在主程序中建立被調(diào)外部例程PrintReal的接口塊,來替換External PrintReal語句:

Interface

Subroutine PrintReal (x)

Real x

End Subroutine

End Interface

程序編譯時就會提示錯誤:實(shí)參與形參的數(shù)據(jù)類型不符,這也正是我們希望看到的結(jié)果,從中也看到了在調(diào)用程序中建立被調(diào)外部例程接口塊的重要性。

在外部例程接口簡單的情況下,調(diào)用程序中是否建立被調(diào)外部例程的接口塊是可選的;但在下列情況下必須使用接口塊[4]:

1)外部例程具有可選參數(shù);

2)外部函數(shù)返回數(shù)組或變長字符串;

3)外部例程具有假定形狀數(shù)組、指針或目標(biāo)參數(shù);

4)例程做參數(shù)。

接口塊的構(gòu)造形式為:

Interface

接口體

End Interface

當(dāng)中的接口體,類似于C/C++中的函數(shù)原型聲明,只包括外部例程的接口信息。通常,接口塊位于調(diào)用程序的聲明區(qū)。

探索中發(fā)現(xiàn),當(dāng)接口塊只聲明一個外部例程原型時,若給接口塊命名,則在調(diào)用程序中可以用接口塊名代替外部例程名進(jìn)行調(diào)用;當(dāng)接口塊中聲明兩個或兩個以上外部例程原型時,還能否用接口塊名代替外部例程名,依據(jù)參數(shù)表匹配的原則,選擇調(diào)用合適的外部例程呢?如果這種設(shè)想成立,就可以用Fortran 90模擬C++函數(shù)重載。

2.2 實(shí)現(xiàn)模擬

上述探討的Fortran 90接口塊,主要針對的是外部例程,通過在調(diào)用程序中建立其接口塊,明確其接口信息,來產(chǎn)生正確的調(diào)用。若將外部例程置于模塊(Module),則外部例程就轉(zhuǎn)化為模塊例程。因此,例程重載分外部例程重載和模塊例程重載二種。

2.2.1 外部例程重載

以交換兩個整數(shù)和兩個實(shí)數(shù)的重載為例,重載的外部例程實(shí)現(xiàn)分別為:

Subroutine SwopInteger (x, y)

Integer temp, x, y

temp = x; x = y; y = temp

End Subroutine

Subroutine SwopReal (x, y)

Real temp, x, y

Temp = x; x = y; y = temp

End Subroutine

在調(diào)用程序的聲明區(qū)建立如下的接口塊:

Interface Swop ! 建立有名接口塊

Subroutine SwopInteger (x, y) ! 聲明重載外部例程接口

Integer x, y

End Subroutine

Subroutine SwopReal (x, y) ! 聲明重載外部例程接口

Real x, y

End Subroutine

End Interface

這樣,就可以用統(tǒng)一的形式Call Swop(a,b)分別調(diào)用兩個不同的外部例程:當(dāng)實(shí)參a和b為整型時,調(diào)用的是SwopInteger外部例程;當(dāng)實(shí)參a和b為實(shí)型時,則調(diào)用的是SwopReal外部例程。從而,成功地模擬了C++函數(shù)重載機(jī)制。

2.2.2 模塊例程重載

將上述二個外部例程置于模塊,轉(zhuǎn)化為模塊例程(Module procedure):

Module MyMod ! 模塊程序單元

Implicit None

Contains

Subroutine SwopInteger (x, y) ! 重載的模塊例程

……

Subroutine SwopReal (x, y) ! 重載的模塊例程

……

End Module

由于模塊的缺省訪問屬性為Public,所以一旦調(diào)用程序引用(Use)了模塊,模塊中包括模塊例程在內(nèi)的實(shí)體在調(diào)用程序中就是可見的,模塊例程就如同調(diào)用程序的內(nèi)部例程,其接口是自顯的[5]。所以,建立模塊例程重載的接口塊可以只列出重載的模塊例程:

Interface Swop ! 定義模塊例程重載接口塊

Module procedure SwopInteger, SwopReal

End Interface

正因?yàn)槟K的缺省訪問屬性為Public,所以模塊例程重載的接口塊既可以置于模塊的聲明區(qū),也可以置于引用模塊的調(diào)用程序的聲明區(qū)。程序運(yùn)行結(jié)果表明,模塊例程同樣可以被重載。

3 結(jié)語

Fortran 90不支持面向?qū)ο蟪绦蛟O(shè)計,但具備了一些現(xiàn)代語言特征,本文正是利用其提供的接口塊這一利器,對C++函數(shù)重載進(jìn)行了成功模擬,給出了外部例程和模塊例程兩種重載方法,為Fortran 90的應(yīng)用擴(kuò)展積累了經(jīng)驗(yàn)。

參考文獻(xiàn):

[1]ISO/IEC 1593-1:1991,Fortran 90[S].

[2]周振紅、余明輝、張成才等,F(xiàn)ortran 90模擬C++主要面向?qū)ο筇匦訹J].武漢大學(xué)學(xué)報(工學(xué)版),2006,39(2):42-46.

[3]呂鳳翥,C++語言程序設(shè)計[M].北京:電子工業(yè)出版社,2006:113-114.

[4]周振紅、郭恒亮、張君靜等,F(xiàn)ortran 90/95高級程序設(shè)計[M].鄭州:黃河水利出版社,2005:28-29.

[5]任慧、周振紅,F(xiàn)ortran與C/C++共享模塊中的數(shù)據(jù)和例程[J].鄭州大學(xué)學(xué)報(工學(xué)版),2008,29(1):99-101.

Fortran 90 emulating C++ function overloading

JIN Kaiguan, ZHOU Zhenhong

(School of Hydraulic & Environmental Engineering,Zhengzhou University,Zhengzhou 450001,China)

Abstract: Function overloading is an important embodiment of polymorphism in C++, and a kind of common use for object-oriented programming. Fortran 90 does not support object-oriented programming, but possesses some features of modern computer languages which make it possible to emulate object-oriented programming. With the exploration of some related language elements and tools of Fortran 90, it is put forward that the function overloading mechanism can be emulated indirectly with the new powerful tool of interfaces on the basis of analyzing C++ function overloading. The examples have proved that this method is workable so as to extend the applicable areas of Fortran 90, and provide some ideas to emulate object-oriented programming.

Key words: Fortran 90;interface;C++;object-oriented programming;function overloading

第10篇

關(guān)鍵詞:System Verilog;芯片模擬器

中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2012)07-1662-03

Design and Implementation of Chip Simulator Based on System Verilog

WANG Yuan1, CHEN Meng-dong1, CHEN Dong2, LIU Yang2, QI Peng2

(1.Jiangnan Institute of Computing Technology, Wuxi 214000, China; 2.65587 Army, Siping 136000, China)

Abstract: This paper introduces the interface between System Verilog and C, and describes the basic method of data sharing between two languages. Through the functional analysis of a sample chip, we design four interface functions of the chip simulator and describe their implementation. We can learn about the realization of chip simulator on System Verilog platform through this paper.

Key words: System Verilog; chip simulator

1概述

在當(dāng)今百萬門級的ASIC設(shè)計中,驗(yàn)證所占用的時間無疑成為縮短集成電路產(chǎn)品設(shè)計周期中的瓶頸。如何改進(jìn)驗(yàn)證方法,改善驗(yàn)證手段,從而提高驗(yàn)證效率,縮短驗(yàn)證周期,是驗(yàn)證人員乃至產(chǎn)品經(jīng)理們最關(guān)心的問題[1]。System Verilog結(jié)合了來自Verilog、VHDL、C++的概念,以及驗(yàn)證平臺語言和斷言語言,將硬件描述語言HDL與現(xiàn)代的高層級驗(yàn)證語言HVL結(jié)合了起來,使原本繁瑣費(fèi)時的驗(yàn)證工作變得相對簡單易行。與傳統(tǒng)的驗(yàn)證方法相比,這種驗(yàn)證方法大大提高了驗(yàn)證工作的效率,縮短了驗(yàn)證的周期,同時有力地保證了驗(yàn)證的完備性。

同時,System Verilog提供了與其他語言的編程接口,可以通過和其他語言數(shù)據(jù)共享的方式進(jìn)行相互交互,將驗(yàn)證工作中的繁瑣復(fù)雜的功能交給軟件來實(shí)現(xiàn),提高驗(yàn)證的效率和性能。這樣在芯片的驗(yàn)證過程中,就可以通過數(shù)據(jù)共享將芯片的主要功能通過軟件來實(shí)現(xiàn),然后通過比對結(jié)果來驗(yàn)證芯片功能的正確性。

2 System Verilog與C語言接口介紹

Verilog使用編程語言接口(PLI, Programming Language Interface)來跟C語言交互,相比之下System Verilog引入了直接編程接口(DPI, Direct Programming Interface),它能更加簡單的連接C、C++或者其他非Verilog編程語言[2]。

一旦聲明或者使用import語句“導(dǎo)入”了一個C子程序,就可以像調(diào)用System Verilog中的子程序一樣來調(diào)用它。import聲明定義了C任務(wù)和函數(shù)的原型,但使用的是System Verilog的數(shù)據(jù)類型,帶有返回值的C函數(shù)會被映射成一個System Verilog函數(shù),void類型的C函數(shù)則被映射成一個System Verilog任務(wù)或者void函數(shù)。導(dǎo)入的C子程序可以有多個參數(shù)或者沒有參數(shù),缺省情況下參數(shù)的方向是input,即數(shù)據(jù)從System Verilog流向C函數(shù),但是參數(shù)的方向也可以定義為output和inout。

通過DPI傳遞的每個變量都有兩個相匹配的定義,一個是System Verilog的,一個是C語言的,這里需要確保兩者使用的是兼容的數(shù)據(jù)類型。由于數(shù)據(jù)類型比較繁雜,為了說明兩者之間數(shù)據(jù)類型的對應(yīng)關(guān)系,以下就System Verilog和C語言之間的數(shù)據(jù)傳遞進(jìn)行簡單介紹。

2.1數(shù)據(jù)類型映射

表1給出了System Verilog和C語言子程序輸入輸出之間數(shù)據(jù)類型的映射關(guān)系,C結(jié)構(gòu)類型在頭文件svdpi.h中定義,在使用時需要包含此頭文件。

在使用兩種語言進(jìn)行對接交互的時候,函數(shù)參數(shù)和返回值的數(shù)據(jù)類型參照上表進(jìn)行相應(yīng)轉(zhuǎn)換即可保證兩者的數(shù)據(jù)是兼容并可以互相通信使用的。

2.2開放數(shù)組

當(dāng)需要在System Verilog和C之間共享數(shù)組的時候,可以采用反向工程的方式分析出數(shù)組在System Verilog中的存儲方式,而在C中根據(jù)數(shù)組的內(nèi)存映射方式進(jìn)行操作。然而這種方式很容易出錯,一旦任何一個數(shù)組有變化,必須重新編寫代碼進(jìn)行調(diào)試。在System Verilog中提供了“開放數(shù)組(open array)”來處理這種情況,這使得我們能夠編寫出可以操作任何大小數(shù)組的通用C代碼。在System Verilog中開放數(shù)組的查詢函數(shù)比較多,這里筆者就基本的開放數(shù)組的使用方法進(jìn)行簡單介紹。

使用基本的開放數(shù)組在System Verilog和C程序之間傳遞數(shù)據(jù)時,在System Verilog中聲明相應(yīng)的C函數(shù),然后在C代碼中可以使用svOpenArrayHandle類型的句柄來引用此開放數(shù)組。該句柄指向一個含有字范圍等開放數(shù)組信息的結(jié)構(gòu),可以通過調(diào)用svGetArrayPtr等方法來獲取實(shí)際的數(shù)組元素,該函數(shù)返回一個void*類型的指針。

2.3復(fù)合類型

對于C和C++中比較復(fù)雜的類,就類屬性的內(nèi)存映射方式來講,兩種語言并不完全一致,不能直接共享對象。為了達(dá)到共享的目的,System Verilog測試平臺使用壓縮結(jié)構(gòu)來保存一個簡單的像素,使用類來封裝對像素的操作。通過使用壓縮和解壓縮的方法對兩種數(shù)據(jù)格式進(jìn)行轉(zhuǎn)換,就可以使兩者共享符合類型的數(shù)據(jù)了。

3芯片模擬器的設(shè)計與實(shí)現(xiàn)

通過以上介紹,筆者針對芯片的整體架構(gòu)及功能,采用上述的System Verilog與C對接的方式對芯片模擬器整體架構(gòu)及主要功能模塊的設(shè)計和實(shí)現(xiàn)進(jìn)行詳細(xì)說明。

3.1芯片模擬器整體架構(gòu)

在基于System Verilog與C對接的模擬器實(shí)現(xiàn)中,System Verilog作為整個驗(yàn)證環(huán)境的平臺,將測試數(shù)據(jù)分別發(fā)送給芯片的硬件邏輯和芯片模擬器,然后收集兩者的數(shù)據(jù)輸出結(jié)果進(jìn)行比較,以期判斷芯片邏輯的正確與否[3],具體的結(jié)構(gòu)如圖1所示。

圖1

其中,芯片模擬器采用軟件的方法實(shí)現(xiàn)了芯片邏輯需要驗(yàn)證的功能,并根據(jù)整個驗(yàn)證平臺的需要添加需要的輔助功能。為了更直觀的介紹芯片模擬器的設(shè)計和實(shí)現(xiàn),這里以筆者實(shí)現(xiàn)的一個簡單芯片模擬器為例進(jìn)行說明。

此芯片的主要功能可以簡化為發(fā)送、接收數(shù)據(jù)以及配置芯片參數(shù)這三個簡單的功能,芯片模擬器的功能則是在這三個接口上對芯片的功能進(jìn)行模擬實(shí)現(xiàn),然后比對相應(yīng)的數(shù)據(jù)是否正確。其中發(fā)送方向上對測試數(shù)據(jù)進(jìn)行處理然后發(fā)送輸出,接收方向則從接收方向?qū)y試數(shù)據(jù)進(jìn)行處理,配置芯片參數(shù)通過測試數(shù)據(jù)生成模塊將參數(shù)發(fā)送給芯片模擬器進(jìn)行配置。需要注意的是,為了驗(yàn)證芯片邏輯的正確與否,這里System Verilog平臺發(fā)送給芯片邏輯和芯片模擬器的數(shù)據(jù)必須是完全相同的,這樣才能保證通過結(jié)果比對得到的測試結(jié)果是有參考價值的。

通過以上分析,筆者將這三個主要功能分別進(jìn)行實(shí)現(xiàn),其中發(fā)送和接收數(shù)據(jù)兩部分需要用到芯片參數(shù)配置部分所配置的芯片參數(shù),因而這里將芯片參數(shù)設(shè)定為全局參數(shù),方便芯片參數(shù)配置部分進(jìn)行參數(shù)配置以及發(fā)送和接收數(shù)據(jù)時依照此參數(shù)進(jìn)行數(shù)據(jù)處理。芯片參數(shù)配置設(shè)計一個單獨(dú)的接口方便進(jìn)行參數(shù)配置,同時,為了驗(yàn)證參數(shù)配置地是否正確,需要另外的接口來從全局參數(shù)中讀取芯片參數(shù)來驗(yàn)證參數(shù)配置的正確性。發(fā)送數(shù)據(jù)方向設(shè)計一個接口來處理發(fā)送方向的數(shù)據(jù),這里需要用到芯片的參數(shù),通過以上的設(shè)計簡單的讀取全局芯片參數(shù)即可。接收數(shù)據(jù)方向同樣設(shè)計一個接口來處理接收方向的數(shù)據(jù),和發(fā)送方向類似,通過讀取全局芯片參數(shù)進(jìn)行數(shù)據(jù)處理。芯片模擬器的整體結(jié)構(gòu)如圖2所示:

圖2

3.2配置接口

配置接口負(fù)責(zé)芯片參數(shù)的配置以及驗(yàn)證所配置參數(shù)的正確性。由于需要配置的參數(shù)比較多,這里通過地址譯碼的方式來進(jìn)行配置;同樣,讀取芯片參數(shù)時也需要相應(yīng)的地址來讀取所需的芯片參數(shù),基于此兩個函數(shù)的結(jié)構(gòu)就確定了。

配置芯片參數(shù)的函數(shù)接口如下:

int setReg(const svBitVecVal* addr, const svOpenArrayHandle data);

其中,返回值為1表示配置成功,返回0表示配置過程中出錯;參數(shù)addr表示所配置參數(shù)在地址列表中的地址,參數(shù)data則為相應(yīng)地址所配置的芯片參數(shù)值,這里data采用開放數(shù)組的方式來處理相應(yīng)數(shù)據(jù),為共享數(shù)據(jù)提供了便利[4]。為了能夠調(diào)用此函數(shù),在相應(yīng)的System Verilog代碼中需要導(dǎo)入此函數(shù),具體如下:

import“DPI-C”function int setReg(input bit [7:0] addr, input bit data[]);

讀取芯片參數(shù)的函數(shù)接口如下:

int getReg(const svBitVecVal* addr, const svOpenArrayHandle data);

類似函數(shù)setReg,返回值為1表示讀取參數(shù)成功,為0表示讀取失敗;參數(shù)addr表示要讀取參數(shù)的地址,data則是讀出的芯片參數(shù)。同樣,為了能夠調(diào)用此函數(shù),也需要在相應(yīng)的System Verilog代碼中導(dǎo)入此函數(shù),具體如下:

import“DPI-C”function int getReg(input bit [7:0] addr, output bit data[]);

這里需要注意的是此處data的數(shù)據(jù)方向?yàn)閛utput,因?yàn)檫@里是讀取芯片參數(shù),data的數(shù)據(jù)空間需要在System Verilog中先分配好[5]。

3.3發(fā)送方向

發(fā)送方向和接收方向的數(shù)據(jù)處理是芯片最主要的功能,此部分需要按照芯片邏輯所設(shè)計的功能進(jìn)行模擬實(shí)現(xiàn),這兩部分中所用到的芯片參數(shù)已通過讀取全局參數(shù)解決,其他部分只需用C語言來進(jìn)行相應(yīng)功能的實(shí)現(xiàn)即可。具體的函數(shù)接口如下:

int send(const svOpenArrayHandle data, const svBitVecVal* type);

其中函數(shù)返回值為1表示發(fā)送方向數(shù)據(jù)處理完成并成功發(fā)送,0表示發(fā)送方向出錯;data即為需要處理的數(shù)據(jù),type表示待處理數(shù)據(jù)的數(shù)據(jù)類型。System Verilog中導(dǎo)入此函數(shù)的方式如下:

import“DPI-C”function send(input bit data[], input bit [2:0] type);

在進(jìn)行數(shù)據(jù)處理時只需要在相應(yīng)的子函數(shù)中將data進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換,使其能夠在C語言中進(jìn)行處理,這樣就可以使用軟件的方法對芯片功能進(jìn)行模擬了。具體方法如下:

unsigned char* data_in = (unsigned char*)svGetArrayPtr(data);

通過函數(shù)將data轉(zhuǎn)換為C語言中的指針類型,這樣就可以通過指針訪問System Verilog中的數(shù)據(jù),實(shí)現(xiàn)System Verilog和C的數(shù)據(jù)共享,完成芯片相應(yīng)功能的模擬。

3.4接收方向

接收方向的數(shù)據(jù)處理和發(fā)送方向類似,函數(shù)接口如下:

int recv(const svOpenArrayHandle data);

其中函數(shù)返回值為1表示接收方向數(shù)據(jù)處理完成,0表示接收方向出錯;data即為接收的待處理數(shù)據(jù)。System Verilog中導(dǎo)入此函數(shù)的方式如下:

import“DPI-C”function recv(input bit data[]);

數(shù)據(jù)處理以及數(shù)據(jù)共享的實(shí)現(xiàn)和發(fā)送方向的處理類似,這里不再贅述。

4結(jié)論及下一步工作

本文首先介紹System Verilog和C語言之間數(shù)據(jù)交互的方法以及兩者互相調(diào)用子函數(shù)的方式,然后通過筆者以該方式實(shí)現(xiàn)的芯片模擬器為例進(jìn)行詳細(xì)說明,以此方式來對整個芯片的功能進(jìn)行驗(yàn)證,具有一定的普遍性。通過這種方式實(shí)現(xiàn)的芯片模擬器比較靈活,并且實(shí)現(xiàn)起來相對硬件描述語言簡單,同時通過數(shù)據(jù)共享,能夠?qū)π酒δ艿母鱾€方面進(jìn)行比較詳盡的模擬,在芯片驗(yàn)證工作中具有非常出色的表現(xiàn)。

最后,需要指出,通過這種方式實(shí)現(xiàn)的芯片模擬器,在一些方面還存在著不足,在硬件更底層的模擬中還不能夠完全取代其他驗(yàn)證方式;在一些比較特殊的情形中通過軟件來模擬比硬件描述語言更為復(fù)雜,這也是此方法的不足;另外,筆者實(shí)現(xiàn)的芯片模擬器在芯片功能模擬時模擬程度還不是非常精確,需要后續(xù)的改進(jìn)和完善。

參考文獻(xiàn):

[1]周卓.基于SV語言的802.11 MAC芯片邏輯驗(yàn)證方案[J].現(xiàn)代電子技術(shù),2009(18).

[2] Chris Spear.System Verilog for Verification[M].Springer,2006.

[3] Janick Bergeron,Eduard Cerny,Alan Hunter,et al.System Verilog驗(yàn)證方法學(xué)[M].夏宇聞,楊雷,陳先勇,等,譯.北京:北京航空航天大學(xué)出版社,2007.

第11篇

匯編語言與C語言均屬于編程語言,但是二者之間存在著根本上的不同。在開發(fā)軟件的過程當(dāng)中使用這兩種語言混合程序設(shè)計的技術(shù)是一種有效的程序設(shè)計方法,不僅能夠有效提升工作的效率,還可以提升程序的性能。本文主要介紹了匯編語言與C語言混合程序設(shè)計的方法,希望給二者之間更好的銜接提供一定技術(shù)方面的支持。

【關(guān)鍵詞】匯編語言 C語言 設(shè)計技術(shù) 混合程序

匯編語言是一種面向機(jī)器的編程語言,運(yùn)算速度快,在使用匯編語言的過程可以通過提高存儲器運(yùn)行速度來提升其存儲空間,另外,匯編語言其控制作用力應(yīng)用在硬件上也有著無法取代的優(yōu)點(diǎn)。同時匯編語言也有著程度較高卻復(fù)雜和移植性差等缺點(diǎn),但是在實(shí)際的操作中,硬件還有精確定的過程中必須要用到匯編語言。C語言作為一種高級語言,其表達(dá)性以及靈活性還有開發(fā)性均較高的優(yōu)勢,因此為了更好的發(fā)揮匯編語言和C語言在開發(fā)軟件中各自的優(yōu)點(diǎn),將兩者有機(jī)的結(jié)合起來,取長補(bǔ)短混合編程更好的達(dá)到設(shè)計的要求,高質(zhì)量的完成設(shè)計任務(wù)。

1 C語言程序設(shè)計技術(shù)方法

(1)可以在C語言程序之中確定匯編程序的常、變量。

(2)可以在C語言編程當(dāng)中適當(dāng)?shù)脑黾诱Z句編輯,保證實(shí)現(xiàn)C語言無法控制硬件的缺陷。

(3)然而使用C語言程序時可以通過內(nèi)部函數(shù)的使用加入?yún)R編語言中的相應(yīng)語句。

2 匯編程序設(shè)計技術(shù)及方法

在C語言編程當(dāng)中,可以將匯編語言的代碼直接的編寫進(jìn)去,并且融入?yún)R編語言的過程當(dāng)中可以不使用分號,詳細(xì)的語法是:

asm

若想要將一組匯編語句融入到C語言中,必須要將語句括到括號{}當(dāng)中。

asm {

mov ax,dataA

xchg ax,dataB

mov dataA,ax

}

一般想要在C語言程序當(dāng)中編入?yún)R編語言,有四種類型,分別是一般指令、跳轉(zhuǎn)指令、串聯(lián)指令和局部定義指令。

匯編語言子程序應(yīng)用在C語言中,一般情況下匯編語言的子程序其基本格式是:

MYCODE SEGMENT PARA PUBLIC‘CODE

PUBLIC_函數(shù)名;

公共符號說明DGROUP GROUP MYDATA,MYBBS

MYDATA SEGMENT WORD PUBLIC‘CODE’

...定義變量,初始化數(shù)據(jù)

MYDATA ENDS

MYBBS SEGMENT WORD PUBLIC‘CODE’

...非初始化數(shù)據(jù),開辟內(nèi)存區(qū)

MY BBS END

ASSUME

CS:MYCODE,DS:DGROUP,SS:DGROUP

...

_函數(shù)名 PROC NEAR/FAR

PUSH BP

MOV BP,SP

PUSH SI

PUSH DI

...程序主體語句

POP DI

POP SI

POP BP

RET

_函數(shù)名 END UP

...

MYCODE ENDS

END

3 C語言匯編語言需要調(diào)用其它子程序的語言格式

把被調(diào)用程序其格式和普通匯編語言程序分布情況加以比較能夠發(fā)現(xiàn):

因?yàn)镃語言程序和進(jìn)行匯編的子程序需要共用同一個程序運(yùn)行區(qū)間,所以在剛剛開始進(jìn)行子程序的C語言匯編時就需要運(yùn)行PUSH BP和MOVE BO,SP這兩個命令。

必須要把將會被修改和匯編到C語言程序中的子程序進(jìn)行局部調(diào)用的PUBLTC操作,通過進(jìn)行PUBLTC的操作來表示該段C語言子程序已經(jīng)參與到其他的操作中,被其他程序所調(diào)用了。

雖然已經(jīng)被調(diào)用的子程序會接受程序的控制,但也需要對該段子程序利用SI和DI進(jìn)行局部變量的保存,但是僅在變量高于120分鐘時,才能將其在堆棧當(dāng)中加以存放。因此,這一模式進(jìn)行過程中,我們可以清楚的看到PUSH DI還有PUSH SI的語句。

在經(jīng)過匯編的程序C語言中,要把MYCODE的代碼段、初始數(shù)據(jù)段、修改數(shù)據(jù)段進(jìn)行分別的定義,并且把這幾個分段的匯編程序組合成為一個有效段組,保證該段段組基址的共用性。

在匯編之后的程序語句之前必須要增加一段函數(shù)值語句,保證語句可以有效的返回,進(jìn)行下一段的程序循環(huán),并且設(shè)置的返回值要在RET語句的前方。

值得注意的是,不同意調(diào)用過的子程序必須要用RET的命令增加返回功能,并且在結(jié)束語句后編輯結(jié)束END。這個END語句代表的是最終的終止,沒有相應(yīng)的啟動功能。

通過C語言子程序的匯編,可以有效的保證其調(diào)用功能,同時也節(jié)省了相應(yīng)的程序編輯空間。例如在程序輸入時,不用修改程序的進(jìn)位制就能準(zhǔn)確的進(jìn)行數(shù)據(jù)的讀取,也就是說參與匯編的C語言子程序在格式上不會有太大的改變,只需要在原本子程序的起始部位增加相應(yīng)的語句就可以了。

EXTERN 函數(shù)名,主要作用是為了反應(yīng)出這個函數(shù)是C語言的子程序,且是外部調(diào)用的、。原本的主程序語句,可以利用外部程序來實(shí)現(xiàn)原本語句的調(diào)用功能,具體的調(diào)用格式如下:CALL NEAR PTR 函數(shù)名,而在將C語言程序當(dāng)做是子程序的過程中,只包含有C函數(shù),并不需要EXTERN來進(jìn)行進(jìn)一步的說明。

4 連接兩種語言

由于匯編語言和C語言二者均存在著一定的問題,通過將兩種語言混合編程,能夠彌補(bǔ)兩種語言各自存在的不足,因此,下面闡述如何連接這兩種語言。

4.1 傳遞參數(shù)

在調(diào)用C語言及匯編語言時,可能會存在匯編語言的參數(shù)傳遞問題,通常都是利用堆棧來進(jìn)行傳遞,通常在匯編C語言的過程中,要把BP基址當(dāng)作原數(shù)據(jù)的儲存器,C語言的匯編參數(shù)全部儲存在堆棧儲存器當(dāng)中,如果在需要使用儲存參數(shù)時,可以把存儲在堆棧當(dāng)中的數(shù)據(jù)進(jìn)行清除處理。

4.2 調(diào)用關(guān)系的確定

對于即將要調(diào)用的函數(shù)或者是過程,要在調(diào)用開始之前明確的說明,建立完整的調(diào)用關(guān)系,詳細(xì)的說明被調(diào)用的子程序是屬于那個外部過程當(dāng)中的,并且被調(diào)用的子程序應(yīng)用在什么模塊當(dāng)中。另外要根據(jù)調(diào)用模塊和儲存方式的不同,對被調(diào)用的C語言匯編子程序進(jìn)行格式的確定,一般情況下被調(diào)用的在大模式下與原本程序類型基本相似,小模式下存在微小的變化

4.3 模塊連接

原有的C語言模塊想要和匯編C語言的模塊進(jìn)行準(zhǔn)確的連接,就需要做到以下兩點(diǎn):

(1)原有C語言模塊必須與匯編C語言模塊的儲存方式相同。

(2)要求匯編模塊要遵守和C語言模塊兼容的相同命名。

因?yàn)榫幾g系統(tǒng)在編譯C源程序的過程當(dāng)中,將會在函數(shù)名以及變量名稱的前面畫有下劃線,想要保證連接前后相同,全部被C語言調(diào)用的匯編子程序其標(biāo)識符前面都要標(biāo)記下劃線。并且,想要使匯編語言的標(biāo)識符在C語言當(dāng)中能夠看見,需要用PUBLIC來定義。要求匯編語言當(dāng)中其C語言的變量以及函數(shù),必須要在二者前面加上下劃線,同時,要求匯編程序開頭的所調(diào)用C函數(shù)以及變量必須要用EXTERN對其進(jìn)行說明。

為了有效保證C語言及匯編語言二者混合情況下設(shè)計的程序標(biāo)準(zhǔn),能夠有效的實(shí)施,必須要保證主要參數(shù)在變成函數(shù)被調(diào)用的過程中具有有效的傳遞作用,并且要求針對程序設(shè)計具體的情況來確定兩個語言之間相互調(diào)用的關(guān)系。

在C語言的程序當(dāng)中包括六種儲存形式,分別是微型和小型以及中型和金丑行,還有大型和巨型這六種儲存的模式。通過這點(diǎn)我們可以知道,主要由空間的大小來區(qū)別儲存模式。在這當(dāng)中微型的儲存模式其程序和蹲站都在同一段中,而小型的儲存模式擁有數(shù)據(jù)以及代碼段,詳細(xì)的數(shù)量為同一個。如果想要混合編程,首先必須要保證這兩個程序所使用的是一個儲存模式,對于匯編語言來講,Model表示程序當(dāng)中用到的偽指令,之后需要連接的內(nèi)容便是儲存的模式,通常是上面所講的儲存模式當(dāng)中的一種模式。若C語言程序所使用的儲存模式是小型的,那么匯編語言當(dāng)中就會表示成Model Small,并且在這個時候這兩種程序使用的儲存模式一定是相同的類型。因?yàn)樾⌒蛢Υ婺J綄ear當(dāng)做是基礎(chǔ)指針,因此,這種儲存模式其運(yùn)行效率極高,所以說在實(shí)際混合編程的情況下,如果符合條件這種情況下最好選擇小型儲存模式。

在編譯C語言的過程當(dāng)中,在變量以及函數(shù)名稱的下面將會添加下劃線,為了保證連接的質(zhì)量,調(diào)用子程序的過程當(dāng)中,任何標(biāo)識符其下方都應(yīng)該添加下劃線。站在C語言程序的角度去看,將會把所調(diào)用的對象其中實(shí)際的變量和函數(shù)作為偽命令,進(jìn)而起到說明的作用。一般把命令放在函數(shù)和變量的外部。除此之外,由于想要保存匯編語言程序標(biāo)示符的完整性,應(yīng)該使用PUBLIC定義相應(yīng)的標(biāo)示符。

5 結(jié)束語

通過本文對匯編語言與C語言的混合程序設(shè)計技術(shù)的進(jìn)一步闡述,使我們了解到在開發(fā)軟件的過程當(dāng)中使用這兩種語言混合的程序設(shè)計的技術(shù),能充分發(fā)揮兩種語言各自的特點(diǎn),揚(yáng)長避短,大大提高了軟件開發(fā)的效率,縮短開發(fā)的周期,達(dá)到事半功倍的效果。通過本文對二者之間混合程序設(shè)計技術(shù)的具體闡述,希望能夠給使用匯編語言及C語言混合程序設(shè)計方面提供一定的幫助,對于我國軟件開發(fā)方面起到促進(jìn)的作用。

參考文獻(xiàn)

[1]陳久婭.C語言與匯編語言的混合程序設(shè)計技術(shù)研究[J].電子制作,2013(04):61.

[2]康晶晶.匯編語言與C語言的混合程序設(shè)計技術(shù)[J].計算機(jī)時代,2013(06):1-2.

[3]印德彬.匯編語言與C語言的混合程序設(shè)計技術(shù)[J].電子技術(shù)與軟件程,2015(02):254.

作者簡介

楊波(1979-),女,侗族,貴州省凱里市人。理學(xué)學(xué)士學(xué)位。現(xiàn)為黔東南民族職業(yè)技術(shù)學(xué)院汽車與機(jī)電工程系講師。主要研究方向?yàn)檐浖_發(fā)。

第12篇

【關(guān)鍵詞】DSP系統(tǒng)編程;main函數(shù);LDF文件

由于DSP在開始工作之前需要對芯片的時鐘和外設(shè)進(jìn)行設(shè)置,并且DSP系統(tǒng)通常一旦啟動,便開始執(zhí)行重復(fù)操作,所以DSP的程序設(shè)計和Windows應(yīng)用程序設(shè)計會有一些不同,大概可歸納為以下3點(diǎn):設(shè)計思想的不同,并行執(zhí)行的不同,時間可預(yù)測性的不同。

首先,在DSP的程序設(shè)計中,通常需要先對DSP和設(shè)備進(jìn)行初始化,初始化完成后的程序?yàn)橐粋€無限循環(huán),在循環(huán)中判斷不同的條件執(zhí)行不同的任務(wù),并通過DSP中斷來處理一些特殊的情況,類似于Windows應(yīng)用程序設(shè)計中的消息機(jī)制;另外目前的DSP中并沒有Windows編程中的多線程,除了DMA可以和DSP運(yùn)算同時進(jìn)行外,其他的操作都是順序執(zhí)行的,例如在執(zhí)行中斷服務(wù)函數(shù)時,需打斷之前的操作過程,保存之前的現(xiàn)場后再開始執(zhí)行中斷服務(wù)函數(shù),在完成中斷服務(wù)函數(shù)后再恢復(fù)現(xiàn)場,并順序執(zhí)行進(jìn)入中斷前的程序;最后,實(shí)時信號處理要求程序的執(zhí)行時間是可預(yù)測的,以判斷系統(tǒng)是否滿足實(shí)時性的要求。高性能的通用處理器普遍采用了CACHE和動態(tài)分支預(yù)測技術(shù),使得程序執(zhí)行時間的預(yù)測變得很困難,而DSP的動態(tài)特性較少,可以較容易地預(yù)測程序的執(zhí)行時間,且DSP中的循環(huán)操作不需要額外消耗時間,而是通過硬件來完成循環(huán)計數(shù)器的衰減和循環(huán)的跳轉(zhuǎn),這對提高含大量循環(huán)程序的數(shù)字信號處理算法的效率是很重要的。

一個典型的DSP程序工程通常是由連接描述文件(*.ldf),頭文件(*h),C語言程序文件(*.C),匯編語言程序文件(*.asm)等組成的。其中連接描述文件(*.ldf)用于描述多處理器的存儲器偏移量、共享存儲區(qū)域和每個處理器的儲存空間;頭文件(*h)主要用于函數(shù)宏定義和變量定義;C語言進(jìn)行設(shè)計(*.C)、匯編語言程序文件(*asm)用于編寫控制DSP運(yùn)行的程序。

在程序設(shè)計過程中,通常需要自行編寫的是C語言程序文件(*.c)和匯編語言程序文件(*asm),其中大部分程序可以通過C語言進(jìn)行設(shè)計,關(guān)鍵的子函數(shù)可以通過匯編語言來實(shí)現(xiàn)以提高運(yùn)行效率。

圖1給出了一個雷達(dá)信號處理系統(tǒng)中單個DSP工作的流程。

圖中,在程序開始之前,有對DSP和外部設(shè)備的初始化,之后一旦判斷到中斷信號,就開始進(jìn)入循環(huán),處理接收到的雷達(dá)數(shù)字信號,處理完成將運(yùn)算結(jié)果輸出后便又開始檢測中斷信號,等待處理后續(xù)的數(shù)據(jù)。該流程是一個典型的DSP信號處理流程。

ADSP-TS01S的編程與一般DSP的編程大同小異,下文將從系統(tǒng)初始化、DMA的使用和中斷的使用這3個比較典型的方面對ADSP-TS201S的程序設(shè)計方法進(jìn)行說明。

根據(jù)上面的介紹,本文DSP系統(tǒng)編程的介紹主要包括以下幾個方面:ADSP-TS201S中LDF文件的編寫、系統(tǒng)配置與初始化函數(shù)的編寫、main函數(shù)的編寫、系統(tǒng)配置與初始化函數(shù)的編寫、main函數(shù)的編寫及典型處理流程等方面。

1、ADSP-TS201S中LDF文件的編寫

LDF文件是ADSP-TS201S工程中不可缺少的一部分,它主要用于多DSP工程中多個處理器工程之間的鏈接描述。通常所使用的DSP工程都是一個工程對應(yīng)一個處理器,因此LDF文件不需要做出修改。

而對于建立多處理器(MP)系統(tǒng),則需要使用到LDF文件。

建立MP系統(tǒng)的第一步是使用鏈接器的多處理器功能創(chuàng)建一個多處理器工程和一個描述系統(tǒng)的LDF文件

其中LDF文件用于描述多處理器的存儲器偏移量、共享存儲區(qū)和每個處理器的存儲空間。在書寫MP系統(tǒng)的LDF文件時,必須考慮以下LDF命令:

①M(fèi)PMEMORY{ },該命令定義了每個處理器在多處理器存儲空間(MMS)中的偏移量。在多處理器鏈接過程中,鏈接器使用該偏移量來鏈接各個處理器。

②MEMORY{ },該命令可定義系統(tǒng)中每個處理器的存儲空間。

③PROCESSOR{ }和SECTIONS{ },利用這兩個命令可定義各個處理器,并可使用存儲器定義將每個處理器的輸出文件放置到程序段中。

④SHARED- MEMORY{ },當(dāng)在系統(tǒng)中使用了外部共享存儲器時,需要使用該命令。該命令能識別共享存儲器項的輸出,并生成駐留在MP系統(tǒng)的共享存儲空間中的共享存儲區(qū)的可執(zhí)行文件(.SM)。

⑤SM文件由工程文件中的源文件(.ASM,.C或.CPP)產(chǎn)生,該文件包含有放置于外部共享存儲器中的數(shù)據(jù)變量的定義。

⑥LINK-AGAINST(),該命令可解析多處理器存儲空間中的符號,并命令鏈接器檢查指定的可執(zhí)行文件(.DXEs and .SMs),以解析局部沒有解析的變量和符號,以及在MMS(也就是系統(tǒng)中其他處理器的內(nèi)部儲存器)中定義的表達(dá)式或變量。通常在LDF文件中,必須使用LINK_GAINST 0命令。

如果命令行中包括.SM和.DXE文件,則必須先放.SM文件,后面接著放其他.DXE文件,只有這樣,鏈接器才能正確的解析變量。一個LDF文件中最多可以說明的處理數(shù)量是由處理器結(jié)構(gòu)指定的(比如ADSP TS201最多支持8片)。應(yīng)該注意的是,在同一個LDF文件中,VisualDSP++4.0尚不支持有不同結(jié)構(gòu)的DSP混合使用(如ADSP-TS201S和ADSP21160混合使用)

2、Main函數(shù)及典型處理流程

DSP程序設(shè)計中,最核心的部分便是main函數(shù)的設(shè)計,DSP中幾乎所有的信號處理工作都在main函數(shù)中完成。

通常地,要設(shè)計一個DSP系統(tǒng),第一步便是根據(jù)系統(tǒng)的需求去設(shè)計好DSP系統(tǒng)所需完成的流程圖,當(dāng)DSP處理流程圖設(shè)計完成后時,剩下的工作便是根據(jù)流程圖,設(shè)計圖中每一個單元所需的子函數(shù),并在主函數(shù)main中逐個調(diào)用這些子函數(shù)以實(shí)現(xiàn)流程圖中的功能。

主站蜘蛛池模板: 库伦旗| 克山县| 朝阳县| 土默特左旗| 亳州市| 泊头市| 祁连县| 阆中市| 清流县| 扎兰屯市| 泰顺县| 平山县| 佛坪县| 忻城县| 松江区| 永寿县| 井研县| 岳西县| 化德县| 连平县| 微博| 海林市| 黄梅县| 玉溪市| 曲周县| 杨浦区| 合江县| 宁陕县| 宜兰市| 论坛| 河津市| 广昌县| 吴旗县| 察哈| 吴桥县| 邮箱| 太白县| 中方县| 辰溪县| 伊川县| 喀喇沁旗|