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

0
首頁 精品范文 c語言函數

c語言函數

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

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

c語言函數

第1篇

關鍵詞:C語言 圖形函數 應用

引言

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

1 與圖形繪制有關的系統硬件[2-3]

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

2 Turbo C 2.0中與繪圖有關的常用圖形函數

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

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

如:

int driver,mode;

driver=IBM8514;

mode=IBM8514HI;

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

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

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

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

2.3 基本繪圖函數

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

功能:從點(x1,y1)到點(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)

功能:用參數pattern所確定的填充模式,用參數color確定的顏色進行填充。

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

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

2.4 字符輸出函數

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

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

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

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

C. getch( )

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

3. 繪制一個圓餅型統計圖的程序如下

#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中上機通過編譯、連接、運行,可得到精美的圓餅型圖。讀者通過閱讀并上機調試運行該程序可以對C語言的圖形設置、繪制;顏色的控制、填充等函數的應用有一個感性的認識,對復雜枯燥的C函數提高學習興趣。

結語

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

參考文獻:

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

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

第2篇

關鍵詞:C語言;程序設計;函數;教學方法

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

C語言一般作為普通高校各理工專業的第一門程序設計語言[1],學好C語言對學生學習后續計算機課程至關重要。C語言的基本單位是函數,函數是C語言教學的一個重點。因為C語言中的函數跟現在所有流行的語言中函數的用法都不太一樣,以函數為切入點,可以比較直觀的辨別出來面向過程和面向對象的一個區別,有利于學生理解到底什么叫面向過程的語言,什么叫面向對象。所以C語言的函數十分重要。

1 教學方法

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

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

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

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

通過調試執行,學生可清楚了解到函數調用與返回的實現過程。程序從主函數main進入,當遇到函數調用時,暫停執行主調函數,然后轉去執行被調函數。首先為被調函數分配調用過程中所需的數據區,包括調用后的返回地址,函數的形參以及各種局部變量,然后把實參的值復制到形參中去,接著把控制權轉移給被調函數,完成調用后,如果函數有返回值,先保存計算結果,然后釋放被調函數的數據區,返回主調函數暫停的位置(調用前保存了返回地址)繼續執行。

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

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

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

4)案例——任務驅動的教學方法

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

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

5)精講多練的教學方法

C程序設計內容多,課時少,課堂上教師要做的不是拼命多講,可以通過作業讓學生去自學。也不是要拼命講明白,因為程序只有學生自己想明白了才能為他所用。不能過于依賴教材,要引導學生將所學知識聯系起來,現場演示設計程序的思維過程,講清知識的深層原理。布置作業,作為課堂內容的補充和深化。學生通過查資料動手實驗,根據完成作業的情況,教師可以發現問題所在,在上機實踐課中重點講解。

通過本案例,使學生理解并掌握函數的幾個重要概念、實現方法和編程技巧。

函數教學案例五:通過調用swap函數,交換主函數中變量a,b的值。

這個作業的要點是swap函數中的形參在調用完畢空間就釋放了,所以,雖然兩個形參變量的值交換了,但是a,b的值卻沒變。

大部分學生接著就想,能否返回兩個值帶回主函數,編程實踐發現無法做到,因為被調函數只能返回一個值。

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

2 結束語

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

參考文獻:

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

[2] 譚浩強.《C程序設計》發行1000萬冊的啟示[J].北京聯合大學學報:自然科學版,2011(4).

第3篇

關鍵詞: Sleep;循環;硬件思維;指針

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

0 引言

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

1 Sleep函數在循環嵌套中的妙用

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

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

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

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

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

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

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

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

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

int a=1000,*p;

p=&a;

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

利用內存結構還很容易在函數中用指針傳參能改變變量的值,而通過普通變量傳參因為作用域的問題而無法改變變量值。例如有如下代碼:

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

以上就是硬件思維在指針學習中的作用。

參考文獻:

第4篇

關鍵詞:C語言;函數;調試技術

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

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

程序調試技術在函數教學中的具體使用:

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

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

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

筆者在實際的函數教學中采用了程序調試技術,讓學生直觀地看到了程序的運行過程,從而加深了學生對函數調用過程、參數傳遞、指針做參數等內容的理解。學生反應良好。計算機技術總是在不斷的發展,教師還要不斷地探索更好的教學方法,使C語言課程的教學質量進一步提高。

參考文獻:

[1]譚浩強.C程序設計(第四版)[M].清華大學出版社,2010.7.

第5篇

關鍵詞:C語言;編程;學習策略

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

1 C語言產生的背景

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

C語言是在BCPL語言的基礎上發展起來的。70年代初,美國貝爾實驗室根據工作需要研發出BCPL語言,后來在1973年,貝爾實驗室在BCPL語言的基礎上研發出了C語言程序,后來經過多次改版本,到了80年代初,美國國家標準化協會根據C語言的發展變化,制定了新的C語言標準,一直沿用到現今,為大多數編程者所遵循。

2 C語言的特點及優勢

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

1)C語言簡便,結構嚴謹、操作靈活。

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

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

4)C語言生成目標代碼可操作性強,程序執行效率高。

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

由于C語言這些特點及優勢,使它成為計算機編程者必學的程序設計語言。

3 C語言編程中常見的現象

第一,大一新生剛入校門,心理比較放松,大學的學習生活還未適應,就要開設程序設計語言課程,對于他們來說不知從何學起,心里沒底。上機實踐課時,C語言編程語法較嚴格,出現錯誤就不能運行出結果,導致學生在學習過程中慢慢失去信心和成就感,學習興趣和熱情不高。

第二,C語言的算法和結構有點復雜,理論的東西很難記住,聽起來感覺很枯燥無味,不容易理解。

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

4 C語言編程的學習策略

4.1 熟悉程序開發環境

C語言程序編寫一般經過程序編輯、程序編譯、程序連接到程序運行結果檢測這幾個步驟來實現,建議在Visual C++編程平臺(也可選擇其他平臺)進行實驗,好快速掌握C語言編程環境,熟悉程序代碼的調試過程, 為接下來的學習編程操作打下良好的基礎。

4.2 掌握C語言語法規則,養成良好的編程習慣

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

4.3 精通算法技巧

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

4.4 掌握四種結構

C語言學習中掌握四種結構即順序結構、選擇結構、循環結構和模塊化程序結構非常關鍵,因為這種這四種結構決定了C語言代碼的執行過程,相當于是算法的流程體現,它們彼此可以互相嵌套。C語言對數據的處理是通過“語句”的執行來實現的,一條語句完成一項操作(或功能),一個為實現特定目的的程序應包含若干條語句。

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

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

4.5 熟知函數定義

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

4.6 具備數學知識

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

4.7 會調用C語言庫函數

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

4.8 指針在C語言中的靈活運用

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

4.9 讀代碼和程序

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

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

4.10 借助網絡資源

C語言的學習在課堂上的知識還是有限的,如果想獲取更多的知識,可以借助網絡平臺來完成資料的補充。一方面可以在教學網站上得到相關的學習內容;另一方面可以登錄相關論壇或C語言專題微信群參與討論,獲取學習經驗,探討編程技巧,這樣對于學習者來說都非常便利。

5 結束語

C語言是計算機編程語言中應用最流行的一種高級語言,在C語言學習過程中,本文針對C語言特點、出現的現象和學習策略進行了分析,只要學習者認真領會C語言功能的強大,具備持之以恒的學習韌勁,一定會在實際學習中取得優異的結果。同時,C語言作為高校公共基礎課,學習好它不但能提高自己的編程能力,還對整個計算機語言的學習起到奠基作用,為社會培養綜合型人才更好的服務。

參考文獻:

第6篇

關鍵詞:DSP C語言 并行匯編 混合編程

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

1 C語言與匯編語言混合編程的接口規范和標準

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

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

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

在默認情況下,A3用作返回結構指針寄存器,B3用作被調用函數返回地址寄存器,A15用作幀指針寄存器,B14用作數據頁指針寄存器,B15用作堆棧指針寄存器。這些寄存器在被調用的匯編函數中用到時都要進行保護。

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

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

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

還有一些細節也需要注意,如中斷子程序必須把該子程序將要用到的所有寄存器進行入棧處理;除了全局變量的初始化外,匯編語言的模塊不得因為任何目的而使用.cinit段;匯編代碼的結束需用指令B.s2 B3將程序執行從被調用函數返回到C語言調用函數中。

2 并行匯編代碼的編寫

C6000的匯編代碼格式如下:

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

LDW .D2 B4,B2

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

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

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

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

(3)使用同一條交叉通路的兩條指令不能被安排在同一個執行指令包中,這是因為從寄存器組A~B或者從B~A都只有一條交叉通路。

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

第7篇

(武漢鐵路職業技術學院 湖北 武漢 430205)

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

關鍵詞 :C語言;語句分類;C語言流程;常見錯誤

中圖分類號:TP312 文獻標識碼:A doi:10.3969/j.issn.1665-2272.2015.10.048

收稿日期:2015-03-16

1 初識C語言程序

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

2 C語言的特點

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

3 C語言程序的開發流程

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

4 C語言常見錯誤及分析

4.1.1 遺漏分號出現的錯誤

這個錯誤一般常出現在初學者所編程序中。

5 結論

C語言程序設計是一門強調實踐練習的課程,沒有捷徑可走,只有不斷地實踐、練習、發現問題,不斷解決問題,才能孰能生巧,舉一反三才能將所學知識鞏固發揮,最終掌握結構化程序的精髓,獨自編寫優秀高效的C語言程序。

參考文獻

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

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

第8篇

關鍵詞:C語言;文件處理;程序

中圖分類號:TP312文獻標識碼: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語言具有較強的文件處理功能。C文件是典型的流式文件。在c語言中,文件被視為一個字符的序列,是由一個一個字符的數據順序組成,而文件的存取是以字符為單位。根據數據的組織形式,C文件可分為文本文件(ASCⅡ文件)和二進制文件。

運用C語言,可以編制程序實現對一個已經存在的記錄文件中的數據進行處理,結果信息既可顯示到屏幕終端,也可再次保存到磁盤文件中去。本文以“評分處理程序”的實現為例,闡述了C語言文件處理的一般流程和方法。

1 需求分析

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

1.1 處理流程

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

1.2 具體任務

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

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

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

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

2 源文件分析

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

3 程序設計與實現

用C語言實現評分處理程序,使其具有讀源數據文件、求總分、平均分、最高分、最低分、排序和寫結果文件等功能。

3.1 序設計思路

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

3.2 程序流程圖

本程序的執行流程如圖4所示。

3.3 程序實現方法

1) 主函數:按一定順序調用各功能函數,串起整個程序,實現本程序功能。

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

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

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

/*求最高分函數*/

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) 求最低分函數:主要實現求某位選手的最低分。方法與求最高分類似,就不做說明。

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

實現代碼如下:

/*排序函數*/

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

4 結論與分析

C語言中文件處理的一般步驟可歸納為:先利用fopen()函數配合恰當的使用方式打開文件,再選擇適當的讀寫函數讀寫文件,最后切記一定要利用fclose()函數關閉該文件,以避免意外的發生。

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

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

參考文獻:

[1] 譚浩強.C語言程序設計[M].北京:清華大學出版社,2005.

第9篇

關鍵詞: Fortran 90;接口塊;C++;面向對象程序設計;函數重載

中圖分類號:TP314 文獻標識碼:A 文章編號:1671-7597(2011)1210193-02

0 引言

面向對象方法更加符合人類思維習慣,在軟件開發中被公認為是能夠提高代碼重用性和可維護性的有效方法。C++支持面向對象程序設計,其函數重載機制可以提高程序設計的可讀性和靈活性,是面向對象程序設計的一個常用方法。

Fortran語言是最早誕生的高級語言,廣泛應用于科學與工程計算領域。與Fortran 77相比,Fortran 90增加了模塊、自定義類型、指針、接口塊等新工具[1],使其具有了一些現代語言特征,但仍是面向過程的編程語言,不直接支持函數重載等面向對象程序設計[2]。

本文利用Fortran 90新提供的接口塊等工具,對C++函數重載進行模擬,并通過實例進行驗證。C++開發環境為Visual C++ 6.0,Fortran 90開發環境為Compaq Visual Fortran 6.6。

1 函數重載

1.1 函數重載現象

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

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

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

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

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

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

2)實現的功能必須相同,函數名必須相同;

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

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

值得注意的是:C/C++與Fortran同屬編譯型語言,其實現例程(函數和子程序統稱為例程)的機制相同,Fortran有返回值的例程為函數(Function),無返回值的例程為子程序(Subroutine);C/C++中

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

1.2 函數重載的實現

在C++中,以交換兩個整數和兩個實數為例分析函數重載的實現。

#include

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

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

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

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

void main( void ) // 主函數

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

swop(a, b); cout

swop(c, d); cout

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

實質上,C++編譯器在編譯重載函數時,會依據參數表的不同給目標重載函數添加不同的修飾,依此來對重載函數加以區分。這樣,才使得函數重載機制得以成立。

2 模擬函數重載

2.1 模擬手段-接口塊

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

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

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

Subroutine PrintReal (x)

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

Real x

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

End Subroutine

調用該外部例程的主程序為:

Program Main

Implicit None

External PrintReal ! 聲明PrintReal為外部例程

Integer :: a = 1.0

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

End Program

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

Interface

Subroutine PrintReal (x)

Real x

End Subroutine

End Interface

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

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

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

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

3)外部例程具有假定形狀數組、指針或目標參數;

4)例程做參數。

接口塊的構造形式為:

Interface

接口體

End Interface

當中的接口體,類似于C/C++中的函數原型聲明,只包括外部例程的接口信息。通常,接口塊位于調用程序的聲明區。

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

2.2 實現模擬

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

2.2.1 外部例程重載

以交換兩個整數和兩個實數的重載為例,重載的外部例程實現分別為:

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

在調用程序的聲明區建立如下的接口塊:

Interface Swop ! 建立有名接口塊

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

Integer x, y

End Subroutine

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

Real x, y

End Subroutine

End Interface

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

2.2.2 模塊例程重載

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

Module MyMod ! 模塊程序單元

Implicit None

Contains

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

……

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

……

End Module

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

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

Module procedure SwopInteger, SwopReal

End Interface

正因為模塊的缺省訪問屬性為Public,所以模塊例程重載的接口塊既可以置于模塊的聲明區,也可以置于引用模塊的調用程序的聲明區。程序運行結果表明,模塊例程同樣可以被重載。

3 結語

Fortran 90不支持面向對象程序設計,但具備了一些現代語言特征,本文正是利用其提供的接口塊這一利器,對C++函數重載進行了成功模擬,給出了外部例程和模塊例程兩種重載方法,為Fortran 90的應用擴展積累了經驗。

參考文獻:

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

[2]周振紅、余明輝、張成才等,Fortran 90模擬C++主要面向對象特性[J].武漢大學學報(工學版),2006,39(2):42-46.

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

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

[5]任慧、周振紅,Fortran與C/C++共享模塊中的數據和例程[J].鄭州大學學報(工學版),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篇

關鍵詞:System Verilog;芯片模擬器

中圖分類號:TP311文獻標識碼: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概述

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

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

2 System Verilog與C語言接口介紹

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

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

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

2.1數據類型映射

表1給出了System Verilog和C語言子程序輸入輸出之間數據類型的映射關系,C結構類型在頭文件svdpi.h中定義,在使用時需要包含此頭文件。

在使用兩種語言進行對接交互的時候,函數參數和返回值的數據類型參照上表進行相應轉換即可保證兩者的數據是兼容并可以互相通信使用的。

2.2開放數組

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

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

2.3復合類型

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

3芯片模擬器的設計與實現

通過以上介紹,筆者針對芯片的整體架構及功能,采用上述的System Verilog與C對接的方式對芯片模擬器整體架構及主要功能模塊的設計和實現進行詳細說明。

3.1芯片模擬器整體架構

在基于System Verilog與C對接的模擬器實現中,System Verilog作為整個驗證環境的平臺,將測試數據分別發送給芯片的硬件邏輯和芯片模擬器,然后收集兩者的數據輸出結果進行比較,以期判斷芯片邏輯的正確與否[3],具體的結構如圖1所示。

圖1

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

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

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

圖2

3.2配置接口

配置接口負責芯片參數的配置以及驗證所配置參數的正確性。由于需要配置的參數比較多,這里通過地址譯碼的方式來進行配置;同樣,讀取芯片參數時也需要相應的地址來讀取所需的芯片參數,基于此兩個函數的結構就確定了。

配置芯片參數的函數接口如下:

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

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

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

讀取芯片參數的函數接口如下:

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

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

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

這里需要注意的是此處data的數據方向為output,因為這里是讀取芯片參數,data的數據空間需要在System Verilog中先分配好[5]。

3.3發送方向

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

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

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

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

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

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

通過函數將data轉換為C語言中的指針類型,這樣就可以通過指針訪問System Verilog中的數據,實現System Verilog和C的數據共享,完成芯片相應功能的模擬。

3.4接收方向

接收方向的數據處理和發送方向類似,函數接口如下:

int recv(const svOpenArrayHandle data);

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

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

數據處理以及數據共享的實現和發送方向的處理類似,這里不再贅述。

4結論及下一步工作

本文首先介紹System Verilog和C語言之間數據交互的方法以及兩者互相調用子函數的方式,然后通過筆者以該方式實現的芯片模擬器為例進行詳細說明,以此方式來對整個芯片的功能進行驗證,具有一定的普遍性。通過這種方式實現的芯片模擬器比較靈活,并且實現起來相對硬件描述語言簡單,同時通過數據共享,能夠對芯片功能的各個方面進行比較詳盡的模擬,在芯片驗證工作中具有非常出色的表現。

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

參考文獻:

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

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

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

第11篇

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

【關鍵詞】匯編語言 C語言 設計技術 混合程序

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

1 C語言程序設計技術方法

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

(2)可以在C語言編程當中適當的增加語句編輯,保證實現C語言無法控制硬件的缺陷。

(3)然而使用C語言程序時可以通過內部函數的使用加入匯編語言中的相應語句。

2 匯編程序設計技術及方法

在C語言編程當中,可以將匯編語言的代碼直接的編寫進去,并且融入匯編語言的過程當中可以不使用分號,詳細的語法是:

asm

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

asm {

mov ax,dataA

xchg ax,dataB

mov dataA,ax

}

一般想要在C語言程序當中編入匯編語言,有四種類型,分別是一般指令、跳轉指令、串聯指令和局部定義指令。

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

MYCODE SEGMENT PARA PUBLIC‘CODE

PUBLIC_函數名;

公共符號說明DGROUP GROUP MYDATA,MYBBS

MYDATA SEGMENT WORD PUBLIC‘CODE’

...定義變量,初始化數據

MYDATA ENDS

MYBBS SEGMENT WORD PUBLIC‘CODE’

...非初始化數據,開辟內存區

MY BBS END

ASSUME

CS:MYCODE,DS:DGROUP,SS:DGROUP

...

_函數名 PROC NEAR/FAR

PUSH BP

MOV BP,SP

PUSH SI

PUSH DI

...程序主體語句

POP DI

POP SI

POP BP

RET

_函數名 END UP

...

MYCODE ENDS

END

3 C語言匯編語言需要調用其它子程序的語言格式

把被調用程序其格式和普通匯編語言程序分布情況加以比較能夠發現:

因為C語言程序和進行匯編的子程序需要共用同一個程序運行區間,所以在剛剛開始進行子程序的C語言匯編時就需要運行PUSH BP和MOVE BO,SP這兩個命令。

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

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

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

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

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

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

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

4 連接兩種語言

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

4.1 傳遞參數

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

4.2 調用關系的確定

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

4.3 模塊連接

原有的C語言模塊想要和匯編C語言的模塊進行準確的連接,就需要做到以下兩點:

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

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

因為編譯系統在編譯C源程序的過程當中,將會在函數名以及變量名稱的前面畫有下劃線,想要保證連接前后相同,全部被C語言調用的匯編子程序其標識符前面都要標記下劃線。并且,想要使匯編語言的標識符在C語言當中能夠看見,需要用PUBLIC來定義。要求匯編語言當中其C語言的變量以及函數,必須要在二者前面加上下劃線,同時,要求匯編程序開頭的所調用C函數以及變量必須要用EXTERN對其進行說明。

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

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

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

5 結束語

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

參考文獻

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

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

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

作者簡介

楊波(1979-),女,侗族,貴州省凱里市人。理學學士學位。現為黔東南民族職業技術學院汽車與機電工程系講師。主要研究方向為軟件開發。

第12篇

【關鍵詞】DSP系統編程;main函數;LDF文件

由于DSP在開始工作之前需要對芯片的時鐘和外設進行設置,并且DSP系統通常一旦啟動,便開始執行重復操作,所以DSP的程序設計和Windows應用程序設計會有一些不同,大概可歸納為以下3點:設計思想的不同,并行執行的不同,時間可預測性的不同。

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

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

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

圖1給出了一個雷達信號處理系統中單個DSP工作的流程。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2、Main函數及典型處理流程

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

通常地,要設計一個DSP系統,第一步便是根據系統的需求去設計好DSP系統所需完成的流程圖,當DSP處理流程圖設計完成后時,剩下的工作便是根據流程圖,設計圖中每一個單元所需的子函數,并在主函數main中逐個調用這些子函數以實現流程圖中的功能。

主站蜘蛛池模板: 三门峡市| 唐山市| 恩施市| 永胜县| 杨浦区| 富源县| 濉溪县| 丹棱县| 芜湖市| 雷州市| 寿阳县| 荣成市| 德庆县| 阳春市| 顺义区| 太康县| 八宿县| 融水| 夏邑县| 蒲江县| 新巴尔虎左旗| 五峰| 星子县| 永胜县| 防城港市| 区。| 南投市| 克拉玛依市| 克东县| 横山县| 大兴区| 潞城市| 银川市| 章丘市| 五峰| 漳州市| 洞头县| 高阳县| 安徽省| 尚义县| 鸡泽县|