Fortran程序單元課件_第1頁
Fortran程序單元課件_第2頁
Fortran程序單元課件_第3頁
Fortran程序單元課件_第4頁
Fortran程序單元課件_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Fortran程式單元一個Fortran程式中通常不是只由一個主程序組成,而是由幾個按某種方式劃分的不同程式單元來共同組成。儘管Fortran程式中允許只有主程序而沒有副程式,但絕不允許只有副程式而沒有主程序。在Fortran中,程式的執(zhí)行總是從主程序開始的。Fortran中的程式單元可以大體劃分為主程式、副程式兩種,其中副程式又可以進一步劃分為函數(shù)副程式、子例行副程式和數(shù)據(jù)塊副程式。數(shù)據(jù)塊副程式通常用於實現(xiàn)變數(shù)的初始化賦值,函數(shù)副程式和子例行副程式在用途上基本是一致的,但是也有許多不同之處。本章將詳細介紹Fortran中的程式單元和它們的基本用法。10.1主程序顧名思義,主程序是一個實際程式中的主體,其他類型的程式單元都是以某種方式來輔助主程序的執(zhí)行。在Fortran語言中,一個程式的執(zhí)行始終是從主程序的第一條可執(zhí)行語句開始的,所以每個完整的Fortran程式都必須有且只允許有一個主程序。主程序定義的一般語法形式如下:[PROGRAM[程式名]][說明部分][可執(zhí)行部分][CONTAINS

內部過程]END[PROGRAM[程式名]]10.2語句函數(shù)語句函數(shù)通過一句代碼定義來實現(xiàn)某種特定的處理功能,它是Fortran77時代的遺留產(chǎn)物。嚴格來說,語句函數(shù)不屬於程式單元的範疇。但是在實際應用中,語句函數(shù)以其靈活的應用、小巧的結構在程式中發(fā)揮著重要的作用。在實際的編程過程中,程式員往往會遇到這種情況:一些簡單的函數(shù)會在一個程式單元中的不同地方重複用到,而Fortran系統(tǒng)並不提供這種內部函數(shù);如果採用函數(shù)副程式的形式來描述這些簡單的函數(shù)又會覺得沒有這種必要。例如,要求解函數(shù)的值,將其編寫成函數(shù)副程式可以順利解決。但是,F(xiàn)ortran語言提供了一種更為簡單的手段——語句函數(shù)。10.2.1語句函數(shù)的定義在Fortran中定義一個語句函數(shù)的形式如下:fun([d-arg[,d-arg]...])=expr1.Fun2.d-arg3.Expr4.語句函數(shù)示例5.需要注意的問題:在使用語句函數(shù)進行編程時,下麵一些問題是需要引起注意的:語句函數(shù)通常在函數(shù)比較簡單,能夠用一條語句(包括換行)就能進行定義時才使用;語句函數(shù)是一種非執(zhí)行語句,需要放置在所有可執(zhí)行語句之前和相關的類型說明語句之後;語句函數(shù)的作用範圍僅限於定義它的程式單元之內,不允許跨程式單元進行語句函數(shù)的調用;語句函數(shù)不能作為副程式調用時的實參,也不允許在EXTERNAL語句中出現(xiàn);語句函數(shù)中出現(xiàn)的虛參必須是變數(shù)名,不能是常量、運算式或是數(shù)組元素;語句函數(shù)通過運算式得到的函數(shù)值的類型必須與函數(shù)名的類型一致。10.2.2語句函數(shù)的引用語句函數(shù)在完成定義後,就可以在程式單元中進行引用了。實際上,在前一小節(jié)的例程中已經(jīng)演示了語句函數(shù)引用的一般方式。本小節(jié)將對語句函數(shù)的引用方式進行具體的說明。語句函數(shù)的引用方式與Fortran中內部函數(shù)的引用方式完全一致,就是用程式中定義的實參替換掉語句函數(shù)定義中的虛參。實參必須是與虛參類型相同的常量、變數(shù)或運算式。10.3函數(shù)副程式函數(shù)副程式和子例行副程式是副程式的兩種常用基本形式。它們的共同特徵就是作為數(shù)據(jù)處理過程的集合。但是這兩種子程式也不完全相同,函數(shù)副程式會返回一個函數(shù)值,且通常不會改變啞元的數(shù)值。因此,函數(shù)副程式更像是數(shù)學上的一個函數(shù)。而子例行副程式通常用於完成一項更為複雜的任務,通過啞元或者其他手段返回幾個結果,啞元的數(shù)值通常會在程式的執(zhí)行過程中改變。10.3.1定義函數(shù)副程式下麵給出函數(shù)副程式的一般形式為:[prefix]FUNCTIONname([d-arg-list])[RESULT(r-name)]...END[FUNCTIONname]1.prefix說明項prefix說明項是一個可選參數(shù),可以使用如下兩種形式來書寫:type[keyword]或keyword[type]2.d-arg-listd-arg-list表示函數(shù)的啞元列表。如果函數(shù)副程式不包含啞元,則啞元列表可以省略,但是函數(shù)名後的括弧不能省略。3.RESULT關鍵字RESULT關鍵字用於聲明將函數(shù)的返回值保存在其後的變數(shù)名中,稱為函數(shù)結果名。10.3.2調用函數(shù)副程式函數(shù)副程式的調用與內在函數(shù)的調用形式一樣。在主調程式的任意位置,可以通過下麵的語句形式將函數(shù)副程式的計算結果賦值給變數(shù):V=函數(shù)名(實元表)其中,V表示用於接收函數(shù)計算結果的變數(shù);實元表是程式中實際傳入函數(shù)副程式的變數(shù)列表,除非有特殊說明,變數(shù)列表中的實元個數(shù)以及類型必須與函數(shù)副程式定義時的虛參在個數(shù)和類型上一致。如果函數(shù)不包含啞元,則調用形式是在運算式中直接寫上函數(shù)名再跟空括弧即可:V=函數(shù)名()10.3.3函數(shù)副程式示例——進制轉換下麵來看一段函數(shù)副程式的實例,代碼將一個4位元組的整數(shù)用16進制的形式表示出來。首先給出的是程式的函數(shù)副程式單元HEX。FUNCTIONHEX(n)IMPLICITNONE

CHARACTER(LEN=8)::HEXCHARACTER(LEN=1)::H(0:15)=(/'0','1','2','3','4','5','6','7',&'8','9','A','B','C','D','E','F'/)INTEGER::n,j,nn

HEX=''

DOj=8,1,-1

nn=n/16

HEX(j:j)=H(n-16*nn)

IF(nn==0)EXITn=nnENDDO

ENDFUNCTION10.3.4函數(shù)副程式示例——分形在數(shù)學上有一個特殊的分支——分形(fractal),所謂分形是Mandelbrot將自然界的一些特殊複雜圖形(如海岸線、樹葉外形、雪花結晶類型等)進行數(shù)學理想化後提出的一種概念,其核心思想是圖形的任意細小部分都與圖形的整體具有自相似性,這種圖形的維數(shù)不是整數(shù),而是分數(shù)維。分形的一個典型例子就是Koch曲線,它具有雪花的外形,可以通過對一段直線反復進行某一簡單的操作而得到。把這個過程用數(shù)學語言來描述,就是在複空間內定義的一種簡單迭代過程,它是一個圖形的縮小映射,從而產(chǎn)生自相似曲線。10.4子例行副程式同函數(shù)副程式相比,子例行副程式通常用於完成更為複雜的任務。子例行副程式接受外界傳入的參數(shù)並對其進行處理,子例行程式名不會用來返回處理結果。形象一點來說,函數(shù)副程式像檢驗機,它不改變參數(shù)的值但會告訴外界一個檢測結果;而子例行副程式更像一個加工機器,外界來的參數(shù)經(jīng)過它的加工會以新的形象出現(xiàn)。本節(jié)主要介紹子例行副程式的相關知識。10.4.1定義子例行副程式子例行副程式同函數(shù)副程式非常相似,但是子例行副程式不會有返回值。這種形式的副程式是以SUBROURTINE語句開始,END語句結束的過程。其一般語法形式如下:[首碼]SUBROUTINE副程式名[([啞元列表])]……END[SUBROUTINE[副程式名]]1.啞元列表2.首碼3.副程式名4.END語句10.4.2子例行副程式示例下麵直接來看一段例子,這段代碼依次讀入三個實數(shù),並按它們的大小重新開始排序。程式的執(zhí)行結果如下:請輸入三個實數(shù):1.3452.718282.71827三個實數(shù)的先後次序如下:2.7182802.7182701.345000調用子例行副程式時的實元必須是與啞元類型相同的變數(shù)、數(shù)組、數(shù)組元素和常數(shù)。當用CALL語句進行調用時,啞元和實元才按啞元列表中的順序一一對應,取得同一數(shù)值。10.5副程式的多入口點和多折返點儘管副程式中不允許直接定義其他的副程式,但是在Fortran77時代,可以通過特殊的方式在同一個子程式中定義多個不同的過程入口。通過調用不同的過程定義來實現(xiàn)調用同一個子程式中的不同執(zhí)行段。除了提供多入口點外,F(xiàn)ortran77時代也提供特殊的多折返點來實現(xiàn)特定條件的副程式調用返回方式。10.5.1ENTRY語句與多入口點Fortran語言中的副程式中可以通過ENTRY語句來提供多個入口點。程式的執(zhí)行效果如下:請任意輸入一個實數(shù):-30.0這是一個負數(shù)它的立方根為:-3.107233在上面的代碼中,副程式SIGN內部通過ENTRY語句為一段執(zhí)行代碼定義為一個入口點Negative(A)。在主調程式中,可以根據(jù)情況選擇副程式SIGN中的不同執(zhí)行段:直接調用SIGN將會執(zhí)行入口點Negative(A)前的執(zhí)行代碼,並在ENTRY語句前的RETURN語句返回主調過程;如果調用Negative將執(zhí)行入口點Negative(A)後的執(zhí)行代碼,並在下一個RETURN語句返回主調過程。10.5.2副程式的多折返點一般來說,當副程式執(zhí)行完成之後,通常會直接返回主調程式的調用處繼續(xù)進行執(zhí)行。關於這一點,F(xiàn)ortran語言中也提供了一種特殊的返回方式來改變副程式的折返點,將副程式的返回點指定到主調程式的其他位置。程式的執(zhí)行結果如下:請輸入一個正整數(shù)[負數(shù)-退出]:0計算結果S=0.0000000E+00[=0]請輸入一個正整數(shù)[負數(shù)-退出]:2計算結果S=0.9092974[>0]請輸入一個正整數(shù)[負數(shù)-退出]:5計算結果S=-0.9589243[<0]請輸入一個正整數(shù)[負數(shù)-退出]:0需要注意,能夠實現(xiàn)多折返點的副程式僅限於子例行副程式,不包括函數(shù)副程式,函數(shù)副程式通過RETURN語句只能返回到主調程式中的調用點處。10.6Fortran90/95中的特殊副程式類型在Fortran90/95標準中,除了繼續(xù)對前述的一般副程式類型提供支持外,還新增了三種特殊的副程式類型。這三種子程式類型就是前述章節(jié)中曾經(jīng)提到過的RECURSIVE、PURE和ELEMENTAL三種屬性。RECURSIVE屬性允許過程進行自身調用,也就是常說的遞歸調用;PURE和ELEMENTAL屬性都用於數(shù)組的並行處理。10.6.1RECURSIVE屬性在Fortran90/95標準之前,F(xiàn)ortran中的副程式是不允許進行自身調用的。在新標準中,F(xiàn)ortran副程式開始允許進行自身調用,也就是經(jīng)常在編程中聽到的“遞歸”。能夠進行遞歸調用的一個前提條件就是遞歸過程在被調用時,其中的局部變數(shù)會使用不同的記憶體地址,以便在完成遞歸後能夠依次統(tǒng)計不同記憶體地址上的結果。1.遞歸函數(shù)副程式2.遞歸子例行副程式10.6.2PURE屬性在函數(shù)副程式或是子例行副程式的定義語句前添加PURE語句,將使副程式具有PURE屬性。一般來說,並不需要使用這種屬性,它通常適用於並行計算並在使用上有較多的限制。具有PURE屬性的副程式,其參數(shù)必須是只讀的,即INTENT(IN)。具有PURE屬性的副程式,其參數(shù)都必須有賦值屬性。具有PURE屬性的副程式,其中的變數(shù)不允許具有SAVE屬性。具有PURE屬性的副程式,其包含的內部過程也必須具有PURE屬性。具有PURE屬性的副程式,不能夠使用STOP以及輸入輸出相關語句,如READ、WRITE等。具有PURE屬性的副程式,只能夠讀取而不能改變全局變數(shù)的值。10.6.3ELEMENTAL屬性ELEMENTAL屬性與PURE屬性非常相似,只不過它是一個針對數(shù)組的應用。在具有ELEMENTAL屬性的過程中,不允許出現(xiàn)數(shù)組參數(shù)。該屬性主要用於配合Fortran90/95中對於數(shù)組的整體操作。程式的執(zhí)行結果如下:

1.0000003.0000005.0000007.0000009.0000000.5403023-1.7147170.63428801.994638-2.73339110.7數(shù)據(jù)塊程式單元由於COMMON語句中的變數(shù)不能夠在副程式或主程序中通過DATA語句來直接設置初始值,需要在一個統(tǒng)一的程式單元中進行數(shù)據(jù)的初始化工作。這種統(tǒng)一的程式單元就是數(shù)據(jù)塊程式單元。數(shù)據(jù)塊副程式單元是一種為有名公用塊中的變數(shù)定義初始值的程式單元。它只允許包含變數(shù)聲明和變數(shù)初始值,不可以包含可執(zhí)行語句。數(shù)據(jù)塊程式單元是一種落後的程式設計手段,在新的Fortran90/95標準中已經(jīng)有新的模組程式單元可以完全提供數(shù)據(jù)塊的所有功能。但是一些早期的大型Fortran程式往往會使用這種程式單元來進行變數(shù)的初始化工作,因此有必要對這種過時的語法進行簡單的介紹。10.7.1定義數(shù)據(jù)塊副程式數(shù)據(jù)塊副程式的一般形式如下:BLOCKDATA[塊數(shù)據(jù)名][說明部分]END[BLOCKDATA[塊數(shù)據(jù)名]]數(shù)據(jù)塊副程式中的變數(shù)一般通過DATA語句來進行初始化。公共塊中命名的變數(shù)只能在數(shù)據(jù)塊副程式單元或某個過程中初始化一次。更好的編程方法是使用模組程式單元而不是數(shù)據(jù)塊單元來進行全局變數(shù)的聲明和變數(shù)的初始化工作。10.7.2使用數(shù)據(jù)塊副程式數(shù)據(jù)塊副程式在整個程式結構中是一個獨立的單元,不能出現(xiàn)在其他的程式單元之中。同時,數(shù)據(jù)塊副程式也不需要進行顯示的引用,編譯程序會在編譯階段根據(jù)數(shù)據(jù)塊副程式的定義為其中的變數(shù)做好賦初值的工作。10.7.3數(shù)據(jù)塊副程式示例下麵來看一段數(shù)據(jù)塊程式單元的代碼實例。這段代碼沒有什麼實際的用途,主要用於說明數(shù)據(jù)塊在實際編程中如何應用。程式的運行結果非常簡單,如下所示:ThisisademoofBLOCKDATA1.000000-34.000000.78000003.1415931.000000000000002.000000000000002.000000000000002.000000000000001.00000000000000-1-2-2

-2-110.8副程式的參數(shù)函數(shù)副程式和子例行副程式在有些時候都會涉及到大量外部傳遞的參數(shù)。這些參數(shù)在傳遞過程中的行為如何?有些什麼特性?在過程中如何發(fā)揮作用?這就是本節(jié)將要介紹的基本內容。10.8.1參數(shù)傳遞規(guī)則副程式中的啞元在與實元進行啞實結合時的一條基本規(guī)則就是對應位置上的數(shù)據(jù)要類型正確。參數(shù)類型如果不一致,則很可能發(fā)生不可預料的結果。由於Fortran語言在進行參數(shù)傳遞時採用的是傳地址的方式,即傳遞變數(shù)所占的第一個地址。進行參數(shù)傳遞的啞元和實元會用自身的數(shù)據(jù)類型規(guī)則來解讀同一片存儲單元,一旦數(shù)據(jù)類型不一致就很容易發(fā)生解讀錯誤的問題。1.參數(shù)傳遞錯誤示例2.類型不匹配解決方法10.8.2副程式的介面在前一節(jié)的最後一個例程中,介紹了一種新的程式單元——介面。通過ITERFACE語句可以向調用程式單元說明過程的某些資訊。1.顯示介面2.隱式介面3.介面塊4.過程介面塊10.8.3介面塊使用情況在實際編程中,介面塊並不是每個主調程式都具有的。如果僅使用Fortran77語言編寫副程式,則無需在主調程式單元中編寫介面塊;但是如果使用Fortran90/95中提供的一些現(xiàn)代化手段來編寫程式,通常需要在主調程式單元中寫入調用程式的介面塊,否則在編譯過程中很容易出錯。此外,F(xiàn)ortran90/95中不提倡使用COMMON語句進行程式單元間的數(shù)據(jù)傳遞和共用,該語句的功能已經(jīng)由模組中的介面塊代替。確切一點,如果遇到下列情況時,在主調程式中必須聲明被調過程的介面塊。(1)如果外部過程具有以下特徵:過程的啞元有可選擇屬性。過程的啞元是假定形數(shù)組、指針變數(shù)、目標變數(shù)。過程的結果是數(shù)組或指針。對於字元型函數(shù)過程的結果,其長度不是常數(shù),也非假定長度。(2)如果調用過程時出現(xiàn)下列情況:使用了變元關鍵字(如範例TEST1009)。使用類屬名來進行調用。使用超載賦值號(對於副程式)。使用超載操作符(對於函數(shù))。在要求純過程的上下文中。(3)如果過程首碼關鍵字是ELEMENTAL。10.8.4INTENT屬性應用在Fortran語言中,虛實結合是在不同程式單元之間進行數(shù)值傳遞的主要手段。例如,主程序中實元A與副程式中的啞元X結合,就是將實元A在內存中的地址傳遞給啞元X,也就是將主程序中A的值傳遞給副程式中的X,該值可供副程式運算;反之,如果副程式中的變數(shù)Y在副程式執(zhí)行完後有值M,則Y與實元R結合後會使主調程式單元中的實元變數(shù)R的值也變成M。在Fortran77時代,在編寫程式時無法確切地說明過程中啞元的目的。過程中的啞元到底是用來將數(shù)據(jù)傳入到過程中的,還是用來將數(shù)據(jù)傳出到主調程式單元中,或者是兩種功能都兼而有之。這個概念是含糊的。在進行調用時只能由程式員自行記住過程中各個啞元的性質。進入到Fortran90/95時代,為了避免當過程內部變數(shù)的值發(fā)生變化後返回到主調程式單元時可能造成的混淆情況,在過程的變數(shù)類型定義中,可以為啞元指定INTENT屬性(字面資訊就是意圖屬性)。啞元按照其在參數(shù)傳遞過程中的作用可以分為輸入輸出兩用、僅用於輸入和僅用於輸出。10.8.5關鍵字變元關鍵字變元其實已經(jīng)在前面提到過了,這裏單獨進行更詳細一點的講解。一般來說,啞實結合必須遵循三個一致的原則,否則會出現(xiàn)錯誤。所謂三個一致,是指:啞元與實元的位置一致;啞元與實元的個數(shù)一致;啞元與實元的類型一致。上述要求需要程式員記住每個啞元的名稱及位置,在書寫或閱讀過程中的實元表時要對其中每個運算式追溯到它原來的啞元是什麼,非常不方便。針對這一問題,F(xiàn)ortran90/95中通過三種方法來放寬這三個一致的原則:用關鍵字變元放寬位置一致;用可選擇變元放寬個數(shù)一致;用類屬過程放寬類型一致。10.8.6可選擇變元與OPTIONAL屬性在調用的三個一致原則中,實元與啞元個數(shù)一致是另一個比較嚴格的要求。但在某些過程中,雖然啞元列表中列出了好幾個啞元,但在實際調用時不一定每次都需要全部用到。對於這種情況,F(xiàn)ortran90/95標準中允許只對啞元表中的部分啞元進行啞實結合,另一部分啞元則按需要進行有選擇的結合,這部分啞元又被稱為可選擇變元。例如Fortran語言中的內在數(shù)組函數(shù)SUM,它的完整函數(shù)及啞元表如下:SUM(ARRAY,DIM,MASK)10.8.7啞元改名廣泛的通用性是過程的一大優(yōu)點。一旦針對某個通用處理操作的過程被編好,求解具體問題的主程序就可以對它進行調用。但是在應用於不同的目的時,具體問題的物理名稱可能是不同的。為了加強程式的可讀性與可維護性,在不同的場合使用某一個過程時,需要將啞元名稱改為與該領域械奈錮礱埔恢?。訤ortran90/95中,允許改變過程中變元的名稱。變元名稱的改變是在介面塊中進行的,所以在主調程式中需要寫出相應的介面塊。例如上面求多邊形邊長的副程式,如果調用時想要將表示邊長的啞元名A、B、C和D改為物理意義明確的名稱Upper、Down、Left和Right,只需在主調程式中編寫相應的介面塊,在介面塊的啞元表中使用新的啞元名稱就可以了。10.8.8INTRINSIC屬性與EXTERNAL語句或屬性說明的實元是外部過程相對應,INTRINSIC語句或屬性用來說明實元實際上是內在過程。說明一個對象名具有INTRINSIC屬性可以有兩種方法,一種就是在類型說明語句中加入INTRINSIC屬性,具體的形式如下:類型說明語句,INTRINSIC::內在函數(shù)名[,內在函數(shù)名]…另一種方法是直接使用INTRINSIC語句進行說明,具體的形式如下:INTRINSIC::內在過程名[,

溫馨提示

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

評論

0/150

提交評論