版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Sun Studio 12: Fortran 編程指南Previous :第10章并行化第 11 章 C-Fortran接口本章論述Fortran與C的互操作性方面的問題,內(nèi)容僅適用于 Sun Studio Fortran 95和C編譯器的特定情況11.9 Fortran 2003 與C的互操作性 簡要說明了 Fortran 2003 標(biāo)準(zhǔn)第15部分中提 到的C綁定功能。(此標(biāo)準(zhǔn)可以從國際Fortran標(biāo)準(zhǔn) Web站點(diǎn)獲得)。Fortran 95編譯器實(shí)現(xiàn)了標(biāo)準(zhǔn)中所述的這些功能。如不特別注明,32位x86處理器視為與 32位SPARC處理器等同。對于 64位 x86處理器和64位SPARC 處
2、理器也是如此,只是 x86系統(tǒng)未定義 REAL*16和 COMPLEX*32 數(shù)據(jù)類型,這些數(shù)據(jù)類型只能用于 SPARC。11.1兼容性問題大多數(shù)C-Fortran接口必須在以下這些方面全部保持一致:? 函數(shù)和子例程的定義及調(diào)用? 數(shù)據(jù)類型的兼容性? 參數(shù)傳遞(按引用或按值)? 參數(shù)的順序? 過程名(大寫、小寫或帶有結(jié)尾下劃線(_)? 向鏈接程序傳遞正確的庫引用某些C-Fortran接口還必須符合:? 數(shù)組索引及順序? 文件描述符和stdio? 文件權(quán)限11.1.1函數(shù)還是子例程?函數(shù)一詞在C和Fortran中有不同的含義。根據(jù)具體情況做出選擇很重要:在C中,所有的子程序都是函數(shù);但 void
3、函數(shù)不會(huì)返回值。 在Fortran中,函數(shù)會(huì)傳遞一個(gè)返回值,但子例程一般不傳遞返回值。當(dāng)Fortran例程調(diào)用C函數(shù)時(shí):?如果被調(diào)用的C函數(shù)返回一個(gè)值,則將其作為函數(shù)從Fortran中調(diào)用?如果被調(diào)用的 C函數(shù)不返回值,則將其作為子例程調(diào)用。當(dāng)C函數(shù)調(diào)用Fortran子程序時(shí):如果被調(diào)用的Fortran子程序是一個(gè)函數(shù),則將其作為一個(gè)返回兼容數(shù)據(jù)類型 的函數(shù)從C中調(diào)用。如果被調(diào)用的Fortran子程序是一個(gè)子例程,則將其作為一個(gè)返回int (與 Fortran INTEGER*4兼容)或void 值的函數(shù)從 C中調(diào)用。如果 Fortran子 例程使用交替返回,則會(huì)返回一個(gè)值,這種情況下它是RE
4、TURN語句中的表達(dá)式的值。如果 RETURN語句中沒有出現(xiàn)表達(dá)式,但在SUBROUTINE語句中聲明了交替返回,則會(huì)返回零。11.1.2數(shù)據(jù)類型的兼容性表11 總結(jié)了 Fortran 95 (與C比較)數(shù)據(jù)類型的數(shù)據(jù)大小和缺省對齊。該表假設(shè) 未應(yīng)用影響對齊或提升缺省數(shù)據(jù)大小的編譯選項(xiàng)。請注意以下事項(xiàng):? C數(shù)據(jù)類型int 、long int 和long 在32位環(huán)境下是等同的(4字節(jié))。 但是,在64位環(huán)境下long和指針為8字節(jié)。這稱為LP64數(shù)據(jù)模型。? 在64位SPARC 環(huán)境下,當(dāng)用任意-m64選項(xiàng)進(jìn)行編譯時(shí),REAL*16和COMPLEX*32與16字節(jié)邊界對齊。? 標(biāo)有4/8的對
5、齊表示缺省情況下與 8字節(jié)邊界對齊,但在COMMON 塊中與 4字節(jié)邊界對齊。COMMON 中的最大缺省對齊為 4字節(jié)。當(dāng)用-m64選項(xiàng)進(jìn) 行編譯時(shí),4/8/16表示與16字節(jié)邊界對齊。? REAL(KIND=16)、REAL*16、COMPLEX(KIND=16)、COMPLEX*32 只 能用于SPARC平臺。? 數(shù)組和結(jié)構(gòu)的元素及字段必須兼容。? 不能按值傳遞數(shù)組、字符串或結(jié)構(gòu)。? 可以在調(diào)用點(diǎn)使用 %VAL(arg),按值將參數(shù)從 Fortran 95例程傳遞到 C例 程。假如Fortran例程具有一個(gè)顯式接口塊, 該接口塊用VALUE屬性聲明了偽 參數(shù),則可以按值將參數(shù)從 C傳遞到F
6、ortran 95。? 數(shù)值序列類型的組件的對齊方式與通用塊的對齊方式相同,也會(huì)受到-aligncommon選項(xiàng)的影響。數(shù)值序列類型是這樣一種序列類型:其中所有組件的類型為缺省整數(shù)、缺省實(shí)數(shù)、雙精度實(shí)數(shù)、缺省復(fù)數(shù)或缺省邏輯,而不 是指針。? 在大多數(shù)情況下,非數(shù)值序列類型的數(shù)據(jù)類型組件以自然對齊的方式對齊,但QUAD 變量除外。對于四精度變量,32位SPARC 平臺和 64位SPARC 平 臺之間的對齊方式不同。? 在所有平臺上,用 BIND(C)屬性定義的VAX結(jié)構(gòu)和數(shù)據(jù)類型的組件始終與C結(jié)構(gòu)具有相同的對齊方式。表11 數(shù)據(jù)大小與對齊一(以字節(jié)表示)按引用傳遞(f95和cc )Fortran
7、 95數(shù)據(jù)類型C數(shù)據(jù)類型大 小對齊BYTE xchar x11rCHARACTERxun sig ned char x ;11CHARACTER (LEN= n)xunsigned char x n;n11COMPLEX xstruct float r,i;84x;COMPLEX(KIND=4) xstruct float r,i;84x;COMPLEX(KIND=8) xstruct double164/8COMPLEX (KIND=16)dr,di; x;324/8/16x (SPARC)struct long double, dr,di; x;DOUBLE COMPLEX xstruct
8、 double dr,164/8di; x;DOUBLE PRECISION xdouble x ;84REAL xfloat x ;44REAL (KIND=4) xfloat x ;44REAL (KIND=8) xdouble x ;84/8REAL (KIND=16)long double x ;164/8/16x (SPARC)1INTEGER xint x ;44INTEGER (KIND=1) xsig ned char x ;14Fortran 95數(shù)據(jù)類型C數(shù)據(jù)類型大 小對齊INTEGER (KIND=2) xshort x ;24INTEGER (KIND=4) xint
9、x ;44INTEGER (KIND=8) xlong long int x;841LOGICAL xint x ;44LOGICAL (KIND=1) xsig ned char x ;14LOGICAL (KIND=2) xshort x ;24LOGICAL (KIND=4) xint x ;44LOGICAL (KIND=8) xlong long int x;8411.1.3大小寫敏感性C和Fortran在區(qū)分大小寫方面采取截然相反的處理方法:? C區(qū)分大小寫一大小寫很重要。?Fortran在缺省情況下忽略大小寫。f95缺省通過將子程序名轉(zhuǎn)換成小寫來忽略大小寫。除了字符串常量以外,它
10、會(huì)將所有大寫字母都轉(zhuǎn)換成小寫字母。對于大/小寫問題,有兩種常用解決方案:? 在C子程序中,使 C函數(shù)名全為小寫。? 用-U選項(xiàng)編譯Fortran程序,該選項(xiàng)會(huì)通知編譯器保留函數(shù)/子程序名稱的現(xiàn)有大/小寫區(qū)別。只能米用這兩種解決方案中的一種,不能同時(shí)米用。本章大多數(shù)示例的 C函數(shù)名均采用小寫字母,并且 沒有使用f95-U 編譯器選項(xiàng)。11.1.4例程名中的下劃線Fortran編譯器通常會(huì)在入口點(diǎn)定義和調(diào)用中都出現(xiàn)的子程序名末尾追加一個(gè)下劃線(_)。該慣例不同于具有相同的用戶指定名稱的C過程或外部變量。幾乎所有Fortran庫過程名都有兩個(gè)前導(dǎo)下劃線,以減少與用戶指定的子例程名的沖突。對于下劃線問
11、題,有三種常用解決方案:? 在C函數(shù)中,通過在函數(shù)名末尾追加下劃線來更改該名稱。? 使用BIND(C)屬性聲明來指明外部函數(shù)是C語言函數(shù)。? 使用f95 -ext_names選項(xiàng)編譯對無下劃線的外部名稱的引用。只能使用上述解決方案中的一種。本章的示例都可以使用 BIND(C)屬性聲明來避免下劃線。BIND(C)聲明可從Fortran調(diào)用的C外部函數(shù),以及可從 C中作為參數(shù)調(diào)用的 Fortran例程。Fortran 編譯器在處理外部名稱時(shí)通常不追加下劃線。BIND(C)必須出現(xiàn)在每個(gè)包含這樣的引用的子程序中。慣常用法是:FUNCTION ABCEXTERNAL XYZBIND(C) ABC, X
12、YZ在此處,用戶不僅指定 XYZ是外部C函數(shù),而且還指定 Fortran調(diào)用程序ABC應(yīng)該 可以從C函數(shù)調(diào)用。如果使用 BIND(C) ,C函數(shù)不需要在函數(shù)名末尾追加下劃線。11.1.5按引用或值傳遞參數(shù)通常,F(xiàn)ortran例程按引用傳遞參數(shù)。 在調(diào)用中,如果非標(biāo)準(zhǔn)函數(shù) VAL()中包含一個(gè) 參數(shù),則調(diào)用例程會(huì)按值傳遞該參數(shù)。Fortran 95按值傳遞參數(shù)的標(biāo)準(zhǔn)方法是通過VALUE屬性和INTERFACE 塊。請參見11.4按值傳遞數(shù)據(jù)參數(shù)。C通常按值傳遞參數(shù)。如果在參數(shù)前加上表示和”的符號(&), C會(huì)使用指針按引用傳遞參數(shù)。C總是按引用傳遞數(shù)組和字符串。11.1.6參數(shù)順序除字符串參數(shù)之
13、外,F(xiàn)ortran和C均以相同的順序傳遞參數(shù)。但對于每個(gè)字符型參數(shù), Fortran例程都會(huì)傳遞一個(gè)附加參數(shù),用以指定串長度。這些參數(shù)在C中是long int數(shù)量,按值進(jìn)行傳遞。參數(shù)順序?yàn)椋? 與每個(gè)參數(shù)相應(yīng)的地址(數(shù)據(jù)或函數(shù))? 與每個(gè)字符參數(shù)對應(yīng)的long int (字符串長度的完整列表位于其他參數(shù)的完 整列表之后)示例:Fortra n 代碼片段:等價(jià)的C代碼片段:CHARACTER*7 SINTEGER B(3)CALL SAM( S, B(2)char s7;int b3;sam( s, & b1, 7L );11.1.7數(shù)組索引和順序Fortran與C的數(shù)組索引和順序不同。11.1
14、.7.1數(shù)組索引C數(shù)組總是從0開始,而Fortran數(shù)組在缺省情況下是從1開始。有兩種常用的索引處理方法。? 如上述示例所示,可以使用 Fortran缺省設(shè)置。此時(shí),F(xiàn)ortran元素B(2)等 同于C元素b1。? 可以指定Fortran數(shù)組B以B(0)開始,如下所示:INTEGER B(0:2)這樣,F(xiàn)ortran元素B(1)就等同于C元素b111.1.7.2數(shù)組順序Fortran數(shù)組按列主順序存儲(chǔ):A(3,2)A(1,1) A(2,1) A(3,1) A(1,2) A(2,2) A(3,2)C數(shù)組按行主順序存儲(chǔ):A32A00 A01 A10 A11 A20 A21 這對于一維數(shù)組不存在任何
15、問題。但對于多維數(shù)組,應(yīng)注意下標(biāo)在所有引用和聲明中是 如何出現(xiàn)和使用的一可能需要做些調(diào)整。例如,在C中進(jìn)行部分矩陣操作,而后在 Fortran中完成余下部分,這樣做可能會(huì)產(chǎn) 生混淆。最好是將整個(gè)數(shù)組傳遞給另一語言中的例程,然后在該例程中執(zhí)行 所有矩陣操作,以避免在 C和Fortran中各執(zhí)行部分操作的情況。11.1.8文件描述符和stdioFortran I/O 通道采用的是單元號。底層SunOS操作系統(tǒng)不處理單元號,而是處理文件描述符。Fortran運(yùn)行時(shí)系統(tǒng)會(huì)不斷變換,所以大多數(shù)Fortran程序沒必要識別文件描述符。許多C程序都使用一組稱為 標(biāo)準(zhǔn)I/O (即stdio )的子例程。有許多
16、 Fortran I/O 函 數(shù)也使用標(biāo)準(zhǔn)I/O,而后者又使用操作系統(tǒng) I/O調(diào)用。下表列出了這些 I/O系統(tǒng)的某 些特性。表11 Fortran 與 C 之間的I/O 比較Fortra n單元標(biāo)準(zhǔn)I/O文件指針文件描述符文件打開為讀寫打開為讀打開、為寫打開、為 讀與打開,或者為追加打開;請參見 open (2)為讀打開、為寫打開 或同時(shí)為讀寫打 開屬性已格式化或未格式化始終未格式化,但可用格 式解釋例程進(jìn)行讀或?qū)懯冀K未格式化I訪問直接或順序直接訪問(如果物理文件 的表示是直接訪問),但 總是可以按順序讀取直接訪問(如果物理 文件的表示是直接 訪問),但總是可以 按順序讀取1結(jié)構(gòu)記錄字節(jié)流字節(jié)
17、流I形式0-2147483647 間的任意非負(fù)整數(shù)指向用戶地址空間中結(jié)構(gòu) 的指針0-1023間的整數(shù)11.1.9庫與使用f95 命令鏈接要鏈接正確的Fortran和C庫,請使用f95命令調(diào)用鏈接程序示例1:用編譯器進(jìn)行鏈接:demo% cc -c someCrouti ne.cdemo% f95 theF95routi ne.f someCrout in e.o r = 32.;double complex zw - i = .007;w = (32., .007)z - r = 66.67;z = (66.67, 94.1)z - i = 94.1;returnend在64位 環(huán)境下,在寄存
18、器中返回 COMPLEX值11.3.3字符串由于沒有標(biāo)準(zhǔn)接口,因此不推薦在C與Fortran例程間傳遞字符串。不過,請注意以下方面:? 所有C字符串均按引用傳遞。? Fortran調(diào)用會(huì)為參數(shù)列表中具有字符類型的每個(gè)參數(shù)傳遞一個(gè)附加參數(shù)。此額外參數(shù)給出串長度,它等同于按值傳遞的 C長整數(shù)。(這要依具體實(shí)現(xiàn)而定。) 額外的串長度參數(shù)出現(xiàn)在調(diào)用中的顯式參數(shù)之后。下例展示了具有字符串參數(shù)的Fortra n調(diào)用及其等同的 C調(diào)用:表 11 -5 傳遞 CHARACTER 串rFortra n 調(diào)用:等價(jià)的C調(diào)用:廠CHARACTER*7 Schar s7;rFortra n 調(diào)用:等價(jià)的C調(diào)用:INT
19、EGER B(3)int b3;CALL CSTRNG( S, B(2)cstrng_( s, & b1, 7L );如果在被調(diào)用例程中不需要串長度,則可以忽略額外的參數(shù)。但要注意,F(xiàn)ortran不會(huì)自動(dòng)以C期望的顯式空字符來終結(jié)字符串。該終結(jié)符必須由調(diào)用程序添加。字符數(shù)組調(diào)用與單個(gè)字符變量調(diào)用看起來一樣。會(huì)傳遞數(shù)組的起始地址,所使用的長度 是數(shù)組中單個(gè)元素的長度。11.3.4 一維數(shù)組在C中數(shù)組下標(biāo)以0開始表11 -6傳遞一維數(shù)組Fortra n調(diào)用 CC 調(diào)用 Fortra nin teger i, Sumexter n void vecref_in teger a(9)(int, int
20、 * );exter nal FixVecint i, sum;call FixVec ( a, Sum )in t v9=.void fixvec_ (vecref_( v, &sum );in t v9, i nt *sum )subrouti ne VecRef( v,total)int i;in teger i, total, v(9)total = 0*sum 一 0;rFortra n調(diào)用 CC 調(diào)用 Fortra nfor ( i = 0;i x;v - x = v - y;SUBROUTINE FFLIP(P)STRUCTURE /POINT/REAL X,Y,ZEND STR
21、UCTURERECORD /POINT/ PREAL TrFortra n調(diào)用 CC 調(diào)用 Fortra n!v - y = t;T = P.Xv - z = -2.*(v- z);P.X = P.YP.Y = TP.Z = -2.*P.Z請注意,在所有平臺上Fortran 77 (VAX)結(jié)構(gòu)與C結(jié)構(gòu)的對齊方式始終相同。但是,平臺之間對齊方式會(huì)有所變化。表11 -9傳遞Fortran 95 派生類型rFortran 95 調(diào)用 CC 調(diào)用 Fortran 95TYPE poi ntstruct point SEQUENCEfloat x,y,z;REAL : x, y, z;END TYPE
22、 poi ntexter n void fflip_ (TYPE (poi nt) basestruct point *);EXTERNAL flipstruct point d;CALL flip( base)struct point *ptx = &d;struct point fflip_ (ptx);float x,y,z;;SUBROUTINE FFLIP( P )void flip_( struct pointTYPE POINT*v )SEQUENCE x;TYPE (POINT) Pv - x = v - y;REAL : Tv - y = t;T = P%Xv- z = -2
23、.*(v- z);P%X = P%YP%Y = TP%Z = -2.*P%Z請注意,F(xiàn)ortran 95標(biāo)準(zhǔn)要求派生類型定義中有 SEQUENCE語句,以確保編譯器保持 存儲(chǔ)序列的順序。在所有平臺上,數(shù)值序列類型的組件缺省情況下與字(4字節(jié))邊界對齊。這與x86平臺上C結(jié)構(gòu)的對齊方式相匹配,但是不同于SPARC平臺上C結(jié)構(gòu)的對齊方式。使用-aligncommon選項(xiàng)可更改數(shù)值序列類型的對齊方式,以便與C結(jié)構(gòu)相匹配。使用-aligncommon=8匹配 32 位 SPARC C 結(jié)構(gòu),使用-aligncommon=16匹配 64 位 SPARC。未使用SEQUENCE顯式聲明的派生類型與 SPA
24、RC平臺上的C結(jié)構(gòu)對齊方式相同, 但與x86平臺上的對齊方式不同。這種對齊方式不隨編譯器選項(xiàng)而改變。11.3.7指針由于Fortran例程按引用傳遞參數(shù),因此可將FORTRAN 77 (Cray)指針作為指針的指針傳遞給C例程。表 11 -10 傳遞 FORTRAN 77 (Cray) 指針1Fortra n調(diào)用 CC 調(diào)用 Fortra nREAL XPOINTER (P2X, X) EXTERNAL PASSP2X = MALLOC(4)X = 0.exter n void fpass_( float* );float *p2x;rFortra n調(diào)用 CC 調(diào)用 Fortra nCALL
25、 PASS(P2X)fpass_(&p2x);void pass_(p)SUBROUTINE FPASS (P2X) float *p;REAL XPOINTER (P2X, X)*p = 100.1;X = 0.C指針與Fortran 95標(biāo)量指針兼容,但與 數(shù)組指針不兼容。Fortran 95 用標(biāo)量指針調(diào)用CFortran 95 例程:INTERFACESUBROUTINE PASS(P) REAL, POINTER : PEND SUBROUTINEEND INTERFACEREAL, POINTER : P2XALLOCATE (P2X)P2X = 0CALL PASS(P2X)PR
26、INT*, P2XENDFortran 95用標(biāo)量指針調(diào)用CC例程:void pass_(p); float *p;*p = 100.1;Cray與Fortran 95指針間的主要區(qū)別是 Cray指針的目標(biāo)始終是已命名的。在許多 上下文中,聲明 Fortran 95指針會(huì)自動(dòng)標(biāo)識其目標(biāo)。另外,被調(diào)用C例程還需要顯式 INTERFACE 塊。要將Fortran 95指針傳遞給數(shù)組或數(shù)組段,需要特定的INTERFACE塊,如下例所示:Fortran 95 例程:INTERFACESUBROUTINE S(P)in teger P(*)END SUBROUTINE SEND INTERFACEin
27、teger, target: A(0:9)in teger, poin ter : P(:)P = A(0:9:2) ! poin ter selects every other eleme nt of A call S(P)C例程:void s_(i nt p)/#i nclude int main (i nt ac, char 請注意,如果要以不同的數(shù)據(jù)類型作為實(shí)際參數(shù)來調(diào)用C例程,應(yīng)該在接口塊中包含!$PRAGMA IGNORE_TKR I,以防止編譯器在實(shí)際參數(shù)和偽參數(shù)之間要求類型、 類別和等級匹配。對于傳統(tǒng)Fortran 77,按值調(diào)用僅對簡單數(shù)據(jù)可用,并且只能為調(diào)用C例程的Fort
28、ran77例程所用。無法做到讓C例程調(diào)用Fortran 77例程并按值傳遞參數(shù)。數(shù)組、字符串或結(jié)構(gòu)最好是按引用傳遞。要將值從Fortran 77例程傳遞到C例程,請使用非標(biāo)準(zhǔn)Fortran函數(shù)%VAL(arg)作為調(diào)用中的一個(gè)參數(shù)。在以下示例中,F(xiàn)ortran 77例程按值傳遞x,按引用傳遞y。C例程同時(shí)增加了 x和 y,但只有y發(fā)生了改變。Fortra n調(diào)用 CFortra n 例程: change middle element */ p2 = 444;請注意,由于C例程S不是Fortran 95例程,因此不能在接口塊中將其定義成假定 的形狀(integerP(:)。如果C例程需要知道數(shù)組
29、的實(shí)際大小,必須將其作為參數(shù)傳遞給C例程。另請注意,C與Fortran間的下標(biāo)編排不同,C數(shù)組以下標(biāo)0開始。11.4按值傳遞數(shù)據(jù)參數(shù)從C中調(diào)用時(shí),F(xiàn)ortran 95程序應(yīng)在偽參數(shù)中使用 VALUE屬性,并且應(yīng)為從 Fortran 95中調(diào)用的C例程提供一個(gè)INTERFACE塊。表11 -11在C與Fortran 95之間傳遞簡單數(shù)據(jù)元素Fortran 95 調(diào)用 CC 調(diào)用 Fortran 95PROGRAM callcINTERFACEINTEGER FUNCTION crtn (I)BIND(C) crtnINTEGER, VALUE,INTENT(IN) : IEND FUNCTION
30、 crtnEND INTERFACEM = 20MM = crtn (M)WRITE (*,*) M, MMEND PROGRAMFortran 95 調(diào)用 CC 調(diào)用 Fortran 95int crtn (i nt x)int y;prin tf(%d input n, x);y = x + 1;prin tf(%d returni ngn,y);return(y);Results:20 in put21 retur ning20 21Fortra n調(diào)用 CREAL x, yx = 1.y = 0.PRINT *, x,yCALL value( %VAL(x), y)PRINT *, x
31、,yENDC例程:void value_( float x, float *y) printf(%f, %fn,x,*y);x = x + 1.;*y = *y + 1.;prin tf(%f, %fn,x,*y);編譯并運(yùn)行會(huì)產(chǎn)生以下輸出結(jié)果:1.00000 0.x and y from Fortra n1.000000, 0.000000x and y from C2.000000, 1.000000new x and y from C1.00000 1.00000new x and y from Fortra n11.5返回值的函數(shù)返回 BYTE、INTEGER、REAL、LOGICAL
32、、DOUBLE PRECISION 或 REAL*16 類 型值的Fortran函數(shù)與返回兼容類型的 C函數(shù)是等同的(請參見 表11 -1 )。字符型函數(shù)的返回值存在兩個(gè)額外參數(shù),復(fù)數(shù)型函數(shù)的返回值存在一個(gè)額外參數(shù)11.5.1返回簡單數(shù)據(jù)類型下例返回一個(gè) REAL 或 float 值。BYTE、INTEGER、LOGICAL、DOUBLEPRECISION 和 REAL*16 的處理方式類似:表11 -2返回 REAL 或Float值的函數(shù)Fortra n調(diào)用 CC 調(diào)用 Fortra n1real ADD1, R, Sfloat r, s;external ADD1exter n float
33、 fadd1_();R = 8.0r = 8.0;S = ADD1( R )s = fadd1_( &r );float add1_( pf )real fun cti on fadd1 (p)float *pf;real pfadd1 = p + 1.0float f ;returnf = *pf;endf+;return ( f );11.5.2 返回 COMPLEX 數(shù)據(jù)COMPLEX數(shù)據(jù)的互操作性情況在 SPARC 32位和64位實(shí)現(xiàn)之間有所不同11.5.2.1 32 位平臺在32位平臺上,返回 COMPLEX 或DOUBLE COMPLEX 的Fortran函數(shù)等同于 具有一個(gè)指向內(nèi)
34、存中返回值的附加第一參數(shù)的C函數(shù)。Fortran函數(shù)及其相應(yīng)的 C函數(shù)的一般樣式如下:Fortra n函數(shù)C函數(shù)COMPLEX FUNCTIONCF( a1,a2,.,an)cf_ ( retur n, a1, a2,., an)struct float r, i; * return表11 -13返回COMPLEX 數(shù)據(jù)的函數(shù)(32位SPARC )Fortra n 調(diào)用 CC 調(diào)用 Fortra nCOMPLEX U, V, RETCPX EXTERNAL RETCPXU = ( 7.0, -8.0)V = RETCPX(U)struct complex float r, i; ;struct
35、 complex c1, c2; r = 7.0;u - i = -8.0;retfpx_( v, u );struct complex float r, i; ;void retcpx_( temp, w )struct complex *temp, *w;temp-r = w-r + 1.0;temp-i = w-i + 1.0;return;COMPLEX FUNCTIONRETFPX(Z)COMPLEX ZRETFPX = Z + (1.0, 1.0)RETURNEND11.5.2.2 64 位 SPARC 平臺在64位SPARC環(huán)境下,在浮點(diǎn)寄存器中返回 COMPLEX值:在%f0和
36、%f1中返回 COMPLEX和 DOUBLECOMPLEX 在%f0、f1、%f2 和 %f3 中返回COMPLEX*32。對于64位SPARC,返回結(jié)構(gòu)(其字段均為浮點(diǎn)型)的 C函數(shù)將在浮點(diǎn)寄存器中返回該結(jié)構(gòu),但條件是最多需要4個(gè)這樣的寄存器進(jìn)行此操作。在64位SPARC 平臺上,F(xiàn)ortran函數(shù)及其相應(yīng)的 C函數(shù)的一般樣式如下:Fortra n函數(shù)C函數(shù)COMPLEX FUNCTION CF( a1,a2, ., an)struct float r,i; cf_ (a1,a2, ., an)表11 -14返回 COMPLEX 數(shù)據(jù)的函數(shù)(64位SPARC )Fortra n調(diào)用 C1CO
37、MPLEX U, V, RETCPXEXTERNAL RETCPXU = ( 7.0, -8.0)V = RETCPX(U)struct complex float r, i; ;struct complex retcpx_(struct complex *w ) struct complex temp;temp.r = w-r + 1.0;temp.ii = w-i + 1.0;return (temp);1C 調(diào)用 Fortra n1struct complex float r, i; ; struct complex c1, c2;Fortra n調(diào)用 CC 調(diào)用 Fortra nstr
38、uct complex *u=&c1;extern struct complex retfpx_(struct complex *); u - r = 7.0;u - i = -8.0;retfpx_( u );COMPLEX FUNCTION RETFPX(Z)COMPLEX ZRETFPX = Z + (1.0, 1.0)RETURNEND11.5.3 返回 CHARACTER 串不鼓勵(lì)在C與Fortran例程之間傳遞字符串。但是,具有字符串值的 Fortran函數(shù)等 同于具有兩個(gè)附加第一參數(shù)(數(shù)據(jù)地址和串長度)的C函數(shù)。Fortran函數(shù)及其相應(yīng)的C函數(shù)的一般樣式如下:Fortra n函
39、數(shù)C函數(shù)CHARACTER*! FUNCTION C( a1, ., an)void c_ (result, le ngth, a1,.,an)char result ;long len gth;以下是一個(gè)示例表11 -15返回 CHARACTER 串的函數(shù)CHARACTER STRING*16,CSTR*9STRING =STRING = 123 /CSTR( * ,9)void cstr_( char *p2rslt, longrslt_le n,char *p2arg, int *p2 n,longarg_le n ) /* return n copies of arg*/int cou
40、n t, i;char *cp;count = *p2 n;cp = p2rslt;for (i=0;ico unt;i+)*cp+ = *p2arg ;void fstr_( char *, lo ng,char *, int *,long );char sbf9 = 123456789;char *p2rslt = sbf;int rslt_le n =sizeof(sbf);char ch = *;int n = 4;int chen = sizeof(ch);/* make n copies of ch insbf*/fstr_( p2rslt, rslt_le n,&ch, &n,
41、ch_le n );FUNCTION FSTR( C, N)CHARACTER FSTR*(*), C FSTR =DO I = 1,NFSTR(I:I) = CEND DOFSTR(N+1:N+1) = CHAR(0)END在本例中,C函數(shù)和調(diào)用C例程必須在列表(字符參數(shù)的長度)末尾提供兩個(gè)額外的 初始參數(shù)(指向結(jié)果字符串和串長度的指針)和一個(gè)附加參數(shù)。請注意,在從C中調(diào)用的Fortran例程中,需要顯式添加一個(gè)末尾空字符。缺省情況下,F(xiàn)ortran字符串不以空字符終結(jié)。11.6帶標(biāo)號的COMMON可以在 C中使用全局struct 來模擬 Fortran帶標(biāo)號的 COMMON表11 -16模擬帶標(biāo)號的 COMMONFortran COM MON 定義C “ COMMO 定義COMMON /BLOCK/ALPHA,NUMextern struct block float alpha;int num;extern struct block block_ ;main ()block_.alpha = 32.;block_. num += 1;請注意,C例程建立的外部名稱必須以下劃線
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度農(nóng)業(yè)循環(huán)農(nóng)業(yè)項(xiàng)目合同3篇
- 養(yǎng)殖場地租賃合同-2025年度智能化養(yǎng)殖基地3篇
- 2025年度農(nóng)村土地流轉(zhuǎn)交易服務(wù)合同
- 河北省石家莊市橋西區(qū)維明路小學(xué)-2024-2025年第一學(xué)期年級組工作總結(jié)(履踐致遠(yuǎn)赴星辰)【課件】
- 七年級歷史與社會(huì)下冊說課稿(圖片版)第8單元第1課 原始先民的家園1
- DB32T-政務(wù)服務(wù)“一件事一次辦”服務(wù)規(guī)范編制說明
- 2024幼兒園幼兒膳食制作勞務(wù)派遣合同3篇
- 2024年版權(quán)許可使用合同(影視)
- 2024年跨區(qū)域鋼材物流配送合同
- 2024年版土地使用權(quán)轉(zhuǎn)讓合同標(biāo)的及付款方式
- 石油產(chǎn)品密度基本知識認(rèn)知
- 《公安機(jī)關(guān)人民警察內(nèi)務(wù)條令》
- 第三章熱力學(xué)第二定律物理化學(xué)
- 中國聯(lián)通MPLS VPN業(yè)務(wù)開通測試報(bào)告
- 中國風(fēng)鎏金年終總結(jié)PPT模板
- 年產(chǎn)萬噸丁二烯畢業(yè)設(shè)計(jì)
- 醫(yī)學(xué)課件-檢驗(yàn)科質(zhì)量控制教學(xué)課件
- T-CAAMM 8-2018 動(dòng)力換檔拖拉機(jī) 通用技術(shù)條件
- 收款賬戶確認(rèn)書
- 消防水池 (有限空間)作業(yè)安全告知牌及警示標(biāo)志
- 修復(fù)學(xué)全口義齒
評論
0/150
提交評論