IntelVisualFortran應(yīng)用程序開發(fā)_第1頁
IntelVisualFortran應(yīng)用程序開發(fā)_第2頁
IntelVisualFortran應(yīng)用程序開發(fā)_第3頁
IntelVisualFortran應(yīng)用程序開發(fā)_第4頁
IntelVisualFortran應(yīng)用程序開發(fā)_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、 #IntelVisualFortran應(yīng)用程序開發(fā)第10章IntelFortran與VisualC+ HYPERLINK file:/Basic.NET/Basic.NET的混合編程每種編程語育都冇其特有的優(yōu)勢和局限性,將兒種語言混合起來使用即混合編程,則可充分發(fā)揮各種語言的優(yōu)勢.彌補它們在某些功能上的不足。這樣,既利用了現(xiàn)有程序資源,又加快了應(yīng)用程序的開發(fā)。由于開發(fā)環(huán)境發(fā)生了很大的變化IntelVisualFortran9.0與VisualC+/Basic.NET的混合編程和CompaqVisualFortran6.x與VisualC+/Basic6.0的混合編程在有些方面是不同的。本章主

2、要內(nèi)容:混合編程概述協(xié)調(diào)調(diào)用約定協(xié)調(diào)命名約定傳遞數(shù)據(jù)匹配數(shù)據(jù)類型IntelFortran/VisualC+.NET的編譯和錢接10.1混合編程概述10.1.1混合編程的優(yōu)勢混合(語言)編程.指源程序由兩種或兩種以上語言編寫而成,它涉及一種語言編寫的程序?qū)α硪环N語言編寫的例程實施調(diào)用的問題?;旌暇幊淘试S:調(diào)用由另一種語育編寫的現(xiàn)有程序代碼;使用在特定語言環(huán)境下難以實現(xiàn)的算法; IntelVisualFortran應(yīng)用程序開發(fā)獲得處理速度方而的優(yōu)勢;Fortran/VisualBasic:利用VisualBasic高效地實現(xiàn)用戶界面.Fortran做所有的計算工作,尤梵是浮點計算以充分發(fā)揮兩者的優(yōu)

3、勢;Eortran/C(或C+):可以相互調(diào)用以充分利用兩者現(xiàn)有的程序資源。10.1.2混合編程的前提條件Win32系統(tǒng)下的混合編秤不同于Winl6系統(tǒng)下的但在許多方面更容易實現(xiàn)。利MicrosoftVisualStudio開發(fā)環(huán)境實現(xiàn)混合編程要求開發(fā)工具擁有相同的版本;MicrosoftVisualStudio.NET解決方案資源管理器中的一個工程只能使用一種語言,毎一種語言必須包含在自己的工程中。Win32系統(tǒng)下的IntelFortran.VisualC/C+、InteiC+和VisualBasic之間的混合編程之所以可行,足因為它們實現(xiàn)例程(子程序和國數(shù)的統(tǒng)稱)的方式大致相同:函數(shù)有返冋

4、值,子程序沒有返回值。表lo-i列出r這些語言所對應(yīng)的例程。例如.c語言主函數(shù)可以調(diào)用一個void類型的函數(shù)而該函數(shù)實際由Fortran子程序(subroutine)實現(xiàn)衰101Fortran與C/O+、VisualBasic對應(yīng)的例程兩數(shù)聲程序FortranFUNCTIONSUBROUTINEC/C+function(void)functionVisualBasicFunctionSub10.1.3調(diào)用約定盡管I:述語肓在實現(xiàn)例程的方式上大致相同但它們都遵循各自的規(guī)則來命名II標(biāo)變址和例程、管理堆棧及進行參數(shù)傳遞等;.這一規(guī)則就稱為調(diào)用約定。調(diào)用約定具體包括以下幾個方血的內(nèi)容。堆棧管理被調(diào)用

5、的例程能否接收町選參數(shù)?調(diào)用程序和被調(diào)用例程哪個負(fù)責(zé)清理調(diào)用后的堆棧? #IntelVisualFortran應(yīng)用程序開發(fā)命名約定編譯產(chǎn)生的口標(biāo)實體(指數(shù)據(jù)和例程)名是統(tǒng)一轉(zhuǎn)換成小寫、大寫.還尼保持大小寫混合?目標(biāo)例程名是否有前后綴?參數(shù)傳遞協(xié)議參數(shù)傳遞采取值傳遞還是引用傳遞?實參和煖參的數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)是否對應(yīng)?在單一語育編程中.無須關(guān)注調(diào)用約定的問題;但在混合編程中,必須全面、一致地協(xié)調(diào)兩種語肓所便用的調(diào)用約定,否則會導(dǎo)致混合編程失敗.或出現(xiàn)不確定的結(jié)果10.1.4.NET下的混合編程實現(xiàn)方式在.NET下進行上述語言間的混合編程,可以用IntelFortran構(gòu)造主程序.并調(diào)用其他語育編

6、寫的例程;或者.用其他語苔構(gòu)造主程序,調(diào)用IntelFortran例程(外部例程)被調(diào)用的例程可存放在H標(biāo)對彖文件(.OBJ)、靜態(tài)庫(丄IB)和動態(tài)鏈接庫(.DLL)中,如表102所示。袁10-2Fortran與C+/VisualBasic混合編程方式方式被調(diào)用例程調(diào)用程序優(yōu)點峽點冃標(biāo)對彖文件(OBJ)、靜態(tài)庫(丄IB)IntelFortranIntelC+VisualC卄(非托管)IntelFortranIntelC+VisualC+(非托管)貝冇較高的執(zhí)行性能.IntelFortran使用起來較為方便靜態(tài)庫必須和其他語育支持庫保持兼容動態(tài)鏈接庫(.DLL)IntelFortranInte

7、lC+VisualC+(非托管)VisualBasic(非托管)IntelFortranIntelC+VisualC+VisualBasic具有本機代碼性能使用語言廣泛.不“在語耳支持庫沖突問題在某些講肓環(huán)境中,動態(tài)鏈接庫使用起來絞為煩瑣、閑難NET框架貝仃兩個主要組件:公共語言運行庫和.NET框架類庫。其中,公共語用運行庫是.NETFramework的基礎(chǔ).它作為一個在執(zhí)行時管理代碼的代理.捉供了諸如內(nèi)存管理、線程管理和遠(yuǎn)程處理的核心服務(wù),并強制實施嚴(yán)格的類型安全以及可確保安全性和可靠性的其他形式的代碼準(zhǔn)確性。以公共語言運行庫為冃標(biāo)的代碼稱為托符代碼,而不以運行庫為目標(biāo)的代碼稱為非托管代碼。

8、顯然.托管代碼運行在公共語言運行庫下.且獨立于特定的系統(tǒng); IntelVisualFortran應(yīng)用程序開發(fā)而非托管代碼是本機代碼,它依賴于待定的系統(tǒng)。IntelFortran創(chuàng)建和使用動態(tài)鏈接庫已在第9章進行了介紹,而基于目標(biāo)對象文件的方式主要是Winl6下的混合編程方式。故此,本章后續(xù)部分主要探討在.NET集成開發(fā)環(huán)境(IDE)下,基尸靜態(tài)庫的IntelFortran與VisualC+NET(非托管)及基于動態(tài)鏈接庫的IntelFortran與VisualBasic.NET(非托管)的混合編程問題10.2協(xié)調(diào)調(diào)用約定闊用約定決定了如何調(diào)用例程、如何傳遞參數(shù)及如何命名目標(biāo)例稈。在單一語肓編程

9、中,使用默認(rèn)的調(diào)用約定,并通過頭文件或包含接【的Fortran模塊在調(diào)用程序與被調(diào)用例程間保持一致性,所以其調(diào)用約定總是正確的。在混合語育編程中,各種語言不能共享相同的頭文件,假如它們使用不同的凋用約定,那么在編譯和鏈接時難以發(fā)現(xiàn)錯溟,但在運行時必然盧生錯謀的調(diào)用。錯誤的調(diào)用引發(fā)不確定的結(jié)果.或產(chǎn)生嚴(yán)重錯謀,并導(dǎo)致內(nèi)存/堆棧岀現(xiàn)“腐爛”。因此,必須使調(diào)用約定在不同的語言間協(xié)商一致。具體講,調(diào)用約定從以下5個方面對混合編程產(chǎn)生影響:凋用程序利用調(diào)用約定確定向被調(diào)用例程傳遞參數(shù)的順序,而被調(diào)用例程利用調(diào)用約定確定接收參數(shù)的順序Fortran.VisualC/C+及VisualBasic都是按從左到

10、右的順序傳遞參數(shù)。調(diào)用程序和被調(diào)用例程使用調(diào)用約定來確定它們中的哪一個負(fù)責(zé)清理調(diào)用后的堆??臻g。調(diào)用程序和被調(diào)用例程使用調(diào)用約定來傳遞可選參數(shù)。調(diào)用程序和被調(diào)用例程使用調(diào)用約定來確定參數(shù)傳遞采取值傳遞還是引用傳遞。調(diào)用程序和被調(diào)用例程使用調(diào)用約定來建立目標(biāo)實體命名規(guī)則。10.2.1屬性編譯指令和調(diào)用約定在IntelFortran中,可以通過規(guī)定不同的屈性(ATTRIBUTES)編譯指令,來選擇使用不同的調(diào)用約定其中,C、STDCALL、REFERENCE.VALUE和VARYING指令屬性都對調(diào)用約定產(chǎn)生影響。對整個例程可規(guī)定C、STDCALL、REFERENCE和VARYING屬性;對參數(shù)可

11、單獨規(guī)定VALUE和REFERENCE傳遞屬性。 #IntelVisualFortran應(yīng)用程序開發(fā)笫*10章IntelFortran與VisualC*/Basic.NET的涙合編程 默認(rèn)悄況下IntelFortran以引用方式傳遞所有參數(shù)(隱含長度字符串參數(shù)除外)。假如規(guī)定C或STDCALL調(diào)用約定選項那么IntelFortran以值方式傳遞所有參數(shù)(數(shù)組參數(shù)除外)。在調(diào)用約定選項C和STDCALL之外,還可單獨對參數(shù)規(guī)定VALUE和REFERENCE傳遞展性,以強制參數(shù)分別以值方式和引用方式傳遞,此時,C和STDCALL調(diào)用約定選項對參數(shù)傳遞的影響被覆蓋。而數(shù)組參數(shù)只能以引用方式傳遞.且傳

12、遞的是數(shù)組首地址?!纠?0-1在1A-32系統(tǒng)下IntelFortran調(diào)用混合大小寫命名的C函數(shù):位于靜態(tài)庫中的C語言函數(shù)(c)為:includeexternvoidMy_Sub(inti)printfC=%d”,i);C語育編譯器使用缺省調(diào)用約定(_cdecl),其參數(shù)傳遞方式采取值傳遞,產(chǎn)生的口標(biāo)例程名(_My_Sub)保持編譯前的大小寫混合形式,并添加一前導(dǎo)下畫線。調(diào)用該函數(shù)的IntelFortran控制臺程序(.20)為:programEx_limplicitnoneINTERFACESUBROUTINEMY_SUB(I)!DEC$ATTRIBUTESC,ALIAS:_My-Sub:

13、MY_SUBINTEGERIENDSUBROUTINEMY_SUBENDINTERFACEcallmy_sub(5)endprogramEx_l IntelVisualFortran應(yīng)用程序開發(fā)笫*10章IntelFortran與VisualC*/Basic.NET的涙合編程 Fortran子稈序與C語言void函數(shù)相對應(yīng)。在建立外部例程接I塊時聲明MY_SUB貝有C約泄屬性,使梵與C語育的缺省調(diào)用約定及參數(shù)傳遞保持一致;InFortran的ALIAS屬性可以利其他的屬性選項結(jié)合使用,以使產(chǎn)生的目標(biāo)例程名呈現(xiàn)待定的形式.這里,ALIAS屬性使MY_SUB產(chǎn)生的冃標(biāo)例程名限定為_My.Sub.恰

14、好與C語言編譯產(chǎn)生的目標(biāo)函數(shù)名相同。在ltanium系統(tǒng)下,目標(biāo)例程名沒冇前導(dǎo)下畫線.故相應(yīng)的屬性聲明應(yīng)為:!DEC$ATTRIBUTESC,ALIAS:,My-Sub,:MY_SUB要便編譯的代碼既能運行在IA32乂能運行在Itanium系統(tǒng)平臺上.可以使用條件編譯指令;也可使用預(yù)定義的預(yù)處理器指令宏(如JvlX86、_MA64);還可便用DECORATE編譯選項結(jié)合ALIAS別名屈性,便產(chǎn)生的口標(biāo)例稈名能依據(jù)特定的系統(tǒng)添加正確的前綴和后綴。例如,上列屈性編譯指令可改寫為:!DEC$ATTRIBUTESC,DECORATE,ALIAS:MySub:MY_SUB表103.表104及表10-5分

15、別列岀了IntelFortran各種屈性編譯指令下的參數(shù)傳遞、冃標(biāo)例程命名及堆棧清理悄況.各表中的術(shù)語解釋見表10-6o在IntelFortran中.除了規(guī)定調(diào)用約定屈性編譯指令外,還可通過規(guī)定/iface編譯選項來建立特定的調(diào)用規(guī)則,如衷107所示。從中可以看出/iface編譯選項對參數(shù)的傳遞n標(biāo)例程命名、堆棧清理等均產(chǎn)生影響10.2.2堆棧清理及可選參數(shù)傳遞Fortran與C/C+的例程調(diào)用均通過堆棧進行:調(diào)用程序在傳遞參數(shù)時.將例程地址、例程參數(shù)壓入堆棧;被調(diào)用例程在接收參數(shù)時,依次將例程參數(shù)和例程地址從堆棧中彈出。進棧時,例稈參數(shù)從左到右;出棧時,例程參數(shù)從右到左,即先進棧的參數(shù)后出棧

16、。在IntelFortran的缺省約定和C約定下,當(dāng)執(zhí)行流程由被調(diào)用例程返回時.調(diào)用程序(Caller)負(fù)責(zé)清理堆棧(表105)這便得調(diào)用程序的冃標(biāo)代碼稍大一些,因為在毎一例程調(diào)用點處都要插入直建堆棧的代碼;在STDCALL約定下,被調(diào)用例程(Callee)負(fù)責(zé)控制堆棧,重建堆棧的代碼駐留在被調(diào)用例程內(nèi),貝只出現(xiàn)一次O正因為在C約定下由調(diào)用程序消理堆棧.不管傳遞多少個參數(shù).總能保持相對于框架指針的同一個地址.所以、調(diào)用稈岸知道冇多少參數(shù)被傳遞、這些參數(shù)占多少字節(jié)、它們都駐留在堆棧的什么位置等信息,它可以不連續(xù)地傳遞參數(shù)(即跳過某些參數(shù))因此C約定可以傳遞可變數(shù)址的參數(shù),即可選參數(shù)。衰103In

17、telFortran各種岡性編譯指令下的參數(shù)傳遞裁數(shù)DefaultcSTDCALLC,REFERENCEREFERENCEScalarReferenceValueValueReferenceReferenceScalarvalueValueValueValueValueValueScalarrefcrcnccIReferenceReferenceReferenceReferenceReferenceSiringReference,Lcn:End/Lcn:MixcdString(l:l)String(l:l)Reference,Len:End/Len:MixcdReference,Lcn:End

18、/Len:MixcdStringvalueErrorString(I:I)String(1:1)String(l:l)String(1:1)String(reference)Reference,NoLcn/Len:MixcdReferenceNoLenReference,NoLenReference.NoLenReference.NoLenArrayReferenceReferenceReferenceReferenceReferenceArrayvalueErrorErrorErrorErrorErrorArrayreferenceReferenceReferenceReferenceRef

19、erenceReferenceDerivedTypeReferenceValue.SizedependentValue.SizedependentReferenceReferenceDerivedTypevalueValue,SizedependentValue,SizedependentValue.SizedependentValue,SizedependentValue.SizedependentDerivedTypereferenceReferenceReferenceReferenceReferenceReferenceF90PointerDescriptorDescriptorDes

20、criptorDescriptorDescriptorF90PointervalueErrorErrorErrorErrorErrorF90PointerreferenceDescriptorDescriptorDescriptorDescriptorDescriptor*10-4IntelFortran各種嵐性編譯指令下的目標(biāo)例程命名例程名DefaultCSTDCALLC.REFERENCESTDCALL.REFERENCESuffixnonenonen(1A-32)nonen(IA-32)CaseUpperCaseLowerCaseLowerCaseLowerCaseLowerCase10

21、-5IntelFortran各種屬性編譯指令下的堆棧滴理項目DefaultCSTDCALLC,REFERENCESTDCALL,REFERENCE堆棧清理CallerCallerCalleeCallerCallee表10-6衰10-3.表10-4及表10-5中的術(shù)語解釋術(shù)語|描述(value)聲明參數(shù)具有VALUE屬性reference)聲明參數(shù)貝有REFERENCE屬性Value值傳遞.即參數(shù)值被壓入堆棧Reference引用傳遞在1A-32系統(tǒng)中.4字節(jié)的參數(shù)地址被壓入堆棧;在IntelEM64T和Itanium系統(tǒng)中.8字節(jié)的參數(shù)地址被爪入堆棧Len:End/Lcn:Mixed針對某些字

22、符串參數(shù)Len:End對應(yīng)/iface:nomixedstrlenarg編譯選項.字符申的長度值在所冇的其他參數(shù)后壓入堆棧(碩杯設(shè)唾);Len:Mixcd則對應(yīng)/ifacc:mixedstrlenarg編譯選項字符串的長度值緊接肴字符串的起始地址壓入堆祕NoLen/Len:Mixcd針對某些字符申參數(shù).NoLen對應(yīng)/iface:nomixcdstrlenarg編譯選項.字符串的長度不傳入被凋用例程(缺省設(shè)就匚Lcn:Mixed則對應(yīng)/iface:mixed_str_len.arg編譯選項字符串的長度值緊接若字符串的起始地址壓入堆棧NoLen針對字符串參數(shù)字符串的長度不傳人被調(diào)用例程Strin

23、g(l:l)針對字符申參數(shù)其首字符通過ICHAR(string(l:l)轉(zhuǎn)換為1NTEGER(4),然后被壓入堆棧Error產(chǎn)生編譯錯誤Descriptor在IA-32系統(tǒng)下.傳遞數(shù)組描述子的4字節(jié)地址;在IntelEM64T和Itanium系統(tǒng)下.傳遞數(shù)組描述子的8字節(jié)地址n在IA-32系統(tǒng)下n代我參數(shù)表所占據(jù)的字節(jié)數(shù)(十進制)Sizedependent在IA-32系統(tǒng)下,由值屬性規(guī)定的派生類型:14字節(jié)的參數(shù)按值方式傳遞;5-8字節(jié)的參數(shù)放在兩個寄存器(對應(yīng)兩個參數(shù))中并按值方式傳遞;多于8字節(jié)的參數(shù)按引用方式傳遞一個臨時存儲地址.該“儲地址與待定的數(shù)據(jù)類型相關(guān)聯(lián)UpperCase目標(biāo)例程

24、全部為大寫LowerCase冃標(biāo)例程全部為小寫Callee被凋用例程負(fù)責(zé)清理調(diào)用后的堆找Caller調(diào)用程序負(fù)責(zé)清理調(diào)用后的堆棧 IntelVisualFortran應(yīng)用程序開發(fā)第10章IntelFortran與VisualC+/Basic.NET的混合編程 #衰10-7/iface編譯選項對調(diào)用約定的影響編譯選項參數(shù)傳遞方式9n后綴(IA-32)堆棧清理可選鑫數(shù)傳遞/ifaccxrcfByreferenceNoCallerYes/ifacc:stdrcfByreferenceYesCalleeNo/iface:defaultByreferenceNoCallerYes/iface:CByva

25、lueNoCallerYes/iface:STDCALLByvalueYesCalleeNo/iface:CVFByreferenceYesCalleeNo在IntelFortran中,通過在C約定之外聲明外部例程擁有VARYING屬性,可以調(diào)用具冇可選參數(shù)的外部例程。VARYING選項,可使Fortran在執(zhí)行例程調(diào)用時放弄匹配參數(shù)個數(shù)的要求;若要調(diào)用具有可選參數(shù)的Fortran90系統(tǒng)例程,則無須添加該選項。10.2.3匹配IntelFortran與C/C+的調(diào)用約定IntelFortran調(diào)用約泄屬性與C/C+調(diào)用約泄的匹配情況見表108。VisualC/C+IntelFortran_c

26、dccl(dcfault)C(default)_stdcallSTDCALL表108IntelFortran調(diào)用約定屐性與C/C+*調(diào)用約定的匹配注:WindowsAPI使用的用約定U&CVF的缺省約定齣為STDCALL在默認(rèn)悄況下,VisualC+開發(fā)環(huán)境便用缺省調(diào)用約定(_cdecl)來調(diào)用函數(shù)。如果C語言程序要調(diào)用采用STDCALL約定的Fortran外部例程.那么可以在外部函數(shù)原型聲明中直接添加_stdcall關(guān)鍵字。該調(diào)用約定既址WindowsAPI便用的調(diào)用約定也是CVF使用的缺省約定?!纠?0-2在IA-32系統(tǒng)下,C程序調(diào)用具有_stdcall約定屬性的Fortran函數(shù):位于

27、靜態(tài)庫中的Fortran國數(shù)為:FUNCTIONMYJFUN(n)IMPLICITNONE!DEC$ATTRIBUTESSTDCALL:MY_FUNINTEGERMY_FUN,n #IntelVisualFortran應(yīng)用程序開發(fā)第10章IntelFortran與VisualC+/Basic.NET的混合編程 MYFUN-nnENDFUNCTIONMY_FUN聲明Fortran函數(shù)MY_FUN具有STDCALL約定屬性.在該約定下目標(biāo)例程名被轉(zhuǎn)換成小寫.參數(shù)傳遞采取值傳遞。相應(yīng)的c語言控制臺程序為:#includeexternint_stdcallmyfun(intn);voidmain(vo

28、id)printfVmy_fun(5)=%diT,my_fun(5);C語言主函數(shù)只能使用缺省調(diào)用約定(_cdecl),但它調(diào)用的外部函數(shù)卻可以聲明使用_stdcall調(diào)用約定。C語言中的調(diào)用約定對參數(shù)傳遞(以值方式傳遞)沒有影響;目標(biāo)函數(shù)名總保持編譯前的形式,這里外部函數(shù)名采用小寫,恰好與Fortran目標(biāo)函數(shù)名(_my_fun4)致。如果IntelFortran程序要調(diào)用C語言函數(shù),不必修改C語言程序使用的缺省約定(_cdecl),而是直接在IntelFortran外部例程接口中聲明外部例程具有C約定屈性,這樣.既使調(diào)用約定保持匹配.又使參數(shù)傳遞保持一致,如例101所示。10.3協(xié)調(diào)命名約

29、定在IntelFortran中,C和STDCALL約定屬性不僅規(guī)定了調(diào)用約定.同時也規(guī)定了命名約定。調(diào)用約定建立了參數(shù)傳遞和存儲的規(guī)則,而命名約定則建立了目標(biāo)對象文件(.OBJ)中標(biāo)識符的命名規(guī)則。這里的標(biāo)識符指在調(diào)用程序與被調(diào)用例程間共 IntelVisualFortran應(yīng)用程序開發(fā)第10章IntelFortran與VisualC+/Basic.NET的混合編程 #亨的實體名.如外部例程名、模塊名等.它們標(biāo)識了一個特定的內(nèi)存位置(地址),在調(diào)用程序與被調(diào)用例程中必須保持相同。由于C語言區(qū)分字母的大小寫(即大小寫敏感).Fortran不加以區(qū)分C+乂添加了待定的修飾,導(dǎo)致編譯后的目標(biāo)標(biāo)識符發(fā)

30、生改變,在上述語言的混合編程中如果命名約定不一致,將在鏈接目標(biāo)對彖文件時產(chǎn)生“unresolvedextemaP鏈接錯誤。為避免鏈接失敗.必須協(xié)調(diào)Fortran與C/C+的命名約定,以使產(chǎn)生的目標(biāo)實體名保持致O1031IntelFortran和C/C+的命名約定Fortran和C/C+的命名約定列于表10-9o從中可以看出,C/C+的目標(biāo)例程名保持編譯前的大小寫混合形式而Fortran的目標(biāo)例程名統(tǒng)一被轉(zhuǎn)換成大寫(缺省約定)或小寫(C和STDCALL約定)。不過,IntelFortran提供了ALIAS屬性編譯指令.可用來消除C/CM與Fortran在目標(biāo)例程命名上出現(xiàn)的分歧.使產(chǎn)生的目標(biāo)例程

31、名呈現(xiàn)大小寫混合形式,從而覆蓋IntelFortran的調(diào)用約定所建立的命名規(guī)則。衰10-9IntelFortran和C/C+的命名約定WW調(diào)用約定(屬性)目標(biāo)例程名目標(biāo)例程名大.小寫Fortran!DEC$ATTRIBUTESCnameAlllowercaseFortran!DEC$ATTRIBUTESSTDCALL_namcnAlllowercaseFortrandefault_nameAlluppercaseCcdecl(default)nameMixedcasepreservedC_stdcall_namcnMixedcasepreservedC+Default_namedecorat

32、ionMixedcasepreserved注:&中H標(biāo)例程名的輸詁卜*線和n(n播琴數(shù)列設(shè)所占字D散以卜逬制喪示)只適用TIA-32系統(tǒng);4:Itanium系fit下Kt不仔在前導(dǎo)下線電不冇在后綴nC+與C使用相同的調(diào)用約定和參數(shù)傳遞協(xié)議,但它們便用的命名約定不同。當(dāng)位于.cpp文件中的C+源代碼被編譯成目標(biāo)對象文件時,C+編譯器在冃標(biāo)例程名上添加J待定的修飾.導(dǎo)致和其他語言的目標(biāo)文件鏈接失敗,通過規(guī)定C+外部函數(shù)真冇extern9”鏈接選項,可消除C+的命名修飾.從而使C+目標(biāo)文件能夠與Fortran目標(biāo)文件共享數(shù)據(jù)和例程。C+程序若要調(diào)用Fortran例程.可以像C語言程序那樣聲明外部隨數(shù)

33、.但須規(guī) #IntelVisualFortran應(yīng)用程序開發(fā)第10*IntelFortran與VisualC*/Basic.NET的混合編程 定C”鏈接選項。例如:externHCHintFACT(intn);具中,F(xiàn)ACT是具有缺省約定屬性的Fortran外部函數(shù)。當(dāng)從C+中調(diào)用其他語言編寫的外部例程,或從其他語言中調(diào)用C+函數(shù)時,extern”C鏈接選項可用來調(diào)整C+的命名約定,但該鏈接選項只能在C+內(nèi)部使用。假如其他語言要調(diào)用C+函數(shù),而在C+內(nèi)又不規(guī)定extern“C”鏈接選項,那么只能設(shè)法使其他語言編譯器產(chǎn)生包含C+特定修飾的目標(biāo)例程名。這-做法只能作為最后的解決方法,因為不能保證C

34、+不同版本的編譯器會使用相同的命名修飾方案。extern鏈接選項的使用存在下列限制:(】)不能聲明類的成員函數(shù)具有extern“C”選項;(2)只能規(guī)定重載更數(shù)的一個實例具有extern“C”鏈接選項,重載函數(shù)的其他實例須使用C+鏈接。10.3.2協(xié)調(diào)口標(biāo)實體名的大、小寫大寫假如C/C+調(diào)用IntelFortran例程,而IntelFortran采用缺省約定,且其代碼不能被重新編譯,那么在其編譯產(chǎn)生的目標(biāo)對彖文件中,目標(biāo)例稈名統(tǒng)一被轉(zhuǎn)換成大寫。與之相適應(yīng).C/C+要用大寫命名外部函數(shù).【例10-3在IA-32系統(tǒng)下,C+調(diào)用使用缺省約定的IntelFortran函數(shù)。位于靜態(tài)庫中的IntelF

35、ortran國數(shù)為:FUNCTIONSquare(n)IMPLICITNONEREAL(8):Square,nSquare=n*nENDFUNCTION默認(rèn)悄況下IntelFortran使用C調(diào)用約定,但目標(biāo)例程名統(tǒng)一被轉(zhuǎn)換成大寫 IntelVisualFortran應(yīng)用程序開發(fā)第10*IntelFortran與VisualC*/Basic.NET的混合編程 #(SQUARE).參數(shù)傳遞采取引用傳遞(即地址傳遞)。調(diào)用該函數(shù)的C+控制臺程序為:#includeusingnamespacestd;extern9”doubleSQUARE(double&n);voidmain(intargctch

36、ar*argv(J)doublei=5.0;coutHSquare(5.0)=uSQUARE(i)endl;其中,extern“C”鏈接選項旨在消除C+產(chǎn)生的命名修飾;通常.C/C+參數(shù)傳遞采取值傳遞,若要進行地址傳遞,C+除了像C語言那樣使用指針參數(shù)外.還可便用引用參數(shù),如該例所示。小寫假如Fortran采用C或STDCALL約定,其冃標(biāo)外部例程名統(tǒng)一被轉(zhuǎn)換成小寫.那么C/C+除使用與Fortran對應(yīng)的缺省約定(_cdecl)或stdcall約定聲明外部函數(shù)原型外,還須便用小寫命名外部噸數(shù)(例I0-2)o下列Fortran函數(shù)使用C約定:REALFUNCTIONFFARCTAN(Angle

37、)!DEC$ATTRIBUTESC:FFARCTANREAL(4):AngleC約定下,F(xiàn)ortran以值方式傳遞參數(shù)(數(shù)組參數(shù)除外),與C/C+的參數(shù)傳遞方式一致。在這種情況下,相應(yīng)的C/C+函數(shù)原型聲明分別為:externfloatffarctan(floatangle);extcmMCHfloatffarctan(floatangle);在IA-32和Itanium系統(tǒng)下.編譯產(chǎn)生的目標(biāo)例程名分別為ffarctan和ffarctan。大小寫混合假如C/C+的外部函數(shù)名采取大小寫混合形式,在Fortran中若要保持一樣的形 #IntelVisualFortran應(yīng)用程序開發(fā)第10*Inte

38、lFortran與VisualC*/Basic.NET的混合編程 式.必須采用ALIASJgn來限定產(chǎn)生的目標(biāo)例程名。詳見例lO-lo10.3.3IntelFortran模塊命名規(guī)則馬英他外部實體(數(shù)據(jù)和例程)的命名規(guī)則不同.Fortran模塊目標(biāo)實體命名為:_MODULENAME_mpENTITYstacksize其中,MODULENAMEM模塊名.缺省悄況下被統(tǒng)一轉(zhuǎn)換成大寫;ENTITY是模塊中的數(shù)據(jù)或例程名.缺省情況下也轉(zhuǎn)換成大寫;_mp_是模塊名與模塊實體名間的分隔符,總采取小寫形式。例如下列模塊:MODULEmymodINTEGERaCONTAINSSUBROUTINEb(j)INT

39、EGERjENDSUBROUTINEENDMODULE該模塊在IA-32系統(tǒng)的目標(biāo)對象文件(.OBJ)中其a、b實體命名為:_MYMOD_mp_A_MYMOD_mp_B在Itanium系統(tǒng)中則為:MYMOD_mp_AMYMOD_mp_B在不同的屬性編譯指令下,上列模塊例程b的目標(biāo)模塊例程命名悄況列于表10-10.從中可見.目標(biāo)模塊實體名中的模塊名總保持大寫,而和屈性選項(ALIAS屬性除外)無關(guān)。表10-10不同尺性編譯指令下的模塊例程命名屬性選項IA-32系統(tǒng)中的目標(biāo)模塊例程Itanium系統(tǒng)中的目標(biāo)模塊例程NoneMYMOD_mp_BMYMODmp_BC_MYMOD_mp_bMYMODmp

40、_bSTDCALL-MYMOD_mp_b4MYMOD_mp_bALIAS故蓋其他選項的命名彫響便II標(biāo)模塊例程保持alias選項規(guī)定的形式覆蓋氏他選項的命名影響.使目標(biāo)模塊例程保持alias選項規(guī)定的形式 IntelVisualFortran應(yīng)用程序開發(fā)第10*IntelFortran與VisualC*/Basic.NET的混合編程 #當(dāng)IntelFortran與C/C+共享模塊數(shù)據(jù)和例程時,往往使用ALIAS屬性選項.使冃標(biāo)模塊實體名呈現(xiàn)較為簡單的形式。10.4傳遞數(shù)據(jù)在IntelFortran與C/C+間傳遞數(shù)據(jù)的方式有:使用例稈參數(shù)、模塊和外部變10.4.1例程參數(shù)通過例程參數(shù)在Inte

41、lFortran和C/C+間共享數(shù)據(jù),是常用的數(shù)據(jù)傳遞方式,也是IntelFortran與VisualBasic間共享數(shù)據(jù)的唯一方式。參數(shù)傳遞方式共有兩種:值傳遞,即傳遞參數(shù)的值。引用傳遞或地址傳遞,即傳遞參數(shù)的地址在IA-32系統(tǒng)中,Fortran與C/C+的參數(shù)地址占4個字節(jié);而在IntelEM64T和Itanium系統(tǒng)中參數(shù)地址占8個字節(jié)。Fortran的參數(shù)傳遞方式取決于調(diào)用約定。在缺省約定下,IntelFortran以引用方式傳遞所有參數(shù)(隱含長度的字符串參數(shù)除外);假如規(guī)定例程具有C或STDCALL約定屬性,那么IntelFortran以值方式傳遞所有參數(shù)(數(shù)組參數(shù)除外);假如規(guī)定

42、例程具有REFERENCE屬性以及C/STDCALL約定屆性則Fortran以引用方式傳遞所有參數(shù)。建立參數(shù)傳遞規(guī)則,除通過規(guī)定上述例程屬性外,還可對參數(shù)規(guī)定VALUE和REFERENCE屬性使參數(shù)分別以值方式和引用方式傳遞。若例程屬性和參數(shù)屬性同時存在,則參數(shù)傳遞最終由參數(shù)屈性(VALUE和REFERENCE)決定。例如.聲明下列IntelFortran例程原型:SUBROUTINETESTPROC(VALPARM,REFPARM)!DEC$ATTRIBUTESVALUE:VALPARM!DEC$ATTRIBUTESREFERENCE:REFPARMINTEGERVALPARMINTEGER

43、REFPARMENDSUBROUTINE此處,例程TESTPROC采用缺省約定,在該約定下參數(shù)以引用方式傳遞;但VALUE和REFERENCE參數(shù)屬性使VALPARM和REFPARM最終以值方式和引用方式傳 #IntelVisualFortran應(yīng)用程序開發(fā) IntelVisualFortran應(yīng)用程序開發(fā)遞。盡管這里規(guī)定REFPARM的REFERENCE參數(shù)屬性不是必須的.但顯式規(guī)定參數(shù)的傳遞方式是混合編程的一個好習(xí)慣。C/C+以值方式傳遞除數(shù)組外的所有參數(shù).而數(shù)組參數(shù)以引用方式傳遞,且傳遞的是數(shù)組首地址,不像IntelFortran.C/C+無法通過調(diào)用約定指令來規(guī)定參數(shù)的傳遞要以引用方式

44、傳遞非數(shù)組參數(shù),C語言只能使用指針參數(shù);要以值方式傳遞C數(shù)組,只能將數(shù)組作為結(jié)構(gòu)體的成員進行傳遞。例如,聲明上述IntelFortran例程的C蘋數(shù)原型為:externvoidTESTPROC(intValPRefParm);表10-11列出了IntelFortran與C/C+的參數(shù)傳遞悄況。表10-11IntelFortran與C/C*的參數(shù)傳遞語言約定隅性參數(shù)類型引用傳遞值傳遞DefaultScalarsandderivedtypesDefaultVALUEoptionFortranC/STDCALLScalarsandderivedtypesREFERENCEoptionDefaultD

45、efaultArraysDefaultNoC/STDCALLArraysDefaultNoNon-arraysPointerargument_nameDefaultC/C+ArraysDefaultStructtypearrayname注:&叩不包存Fortran90/95針忿數(shù)和字符小參數(shù)10.4.2模塊C/C+訪問模塊數(shù)據(jù)和例程C/C+nr以玄接訪問IntelFortran模塊中的數(shù)據(jù)和例程,因此模塊成為IntelFortran與C/C+間交換批圮數(shù)據(jù)的最簡單方式?!纠?0-4學(xué)生派生類熨或結(jié)構(gòu)體由學(xué)號和成績構(gòu)成要求找出戢高分的學(xué)生,并算出該班學(xué)生的平均分。我們設(shè)計一個IntelFortr

46、an模塊.當(dāng)中包含一模塊例程(負(fù)數(shù))和一模塊變量(代表平均分).C+主程序?qū)⒁粋€班級的學(xué)生成績作為實參傳入模塊函數(shù),該函數(shù)返冋最高分的學(xué)生并將算得的平均成績存入模塊變雖供O+訪問。下列為IntelFortran模塊: IntelVisualFortran應(yīng)用程序開發(fā)第10*IntelFortran與VisualC*/Basic.NET的混合編程 #MODULEExampIMPLICITNONEREAL:Aver!DEC$ATTRIBUTESALIASAver1:AverTYPEStudentSEQUENCEINTEGERNREALMarkENDTYPEStudent!DEC$ATTRIBUTE

47、SALIASrStudcnt1:TYPEStudentCONTAINSFUNCTIONFindMax(Stud,M)!DEC$ATTRIBUTESC,ALIASJFindMax:FindMaxINTEGERMTYPE(Student)Stud(M),FINDMAXINTEGER:I,J=0REAL:T=0.0,S=0.0DO1=ltM1F(T=Stud(I)%Mark)THENJ=Stud(I)%NT=Stud(I)%MarkENDIFENDDOFINDMAX%N=JFINDMAX%Mark=TDOI=1,MS=S+Stud(I).MarkENDDOAver=S/MENDFUNCTIONEND

48、MODULEExamp #IntelVisualFortran應(yīng)用程序開發(fā)第10*IntelFortran與VisualC*/Basic.NET的混合編程 為了使目標(biāo)模塊實體名呈現(xiàn)簡單形式,模塊中用ALIAS屈性限定編譯產(chǎn)生的目標(biāo)實體名,尤其是派生類型名(注意:這里采取的特殊格式);模塊丙數(shù)FindMax采用了C約定,使其參數(shù)采取值傳遞,以便與C+的參數(shù)傳遞方式保持一致。訪問上列模塊的C+控制臺程序(CPP)為:#includeextern”CfloatAver;externHCMstructStudentintN;floatMark;#defineSTUstructStudentextern

49、,rCMSTUFindMax(STUsJntn);voidmain(intargc,char*argv)STUm,s(3=1001,70,l002,80,1003,90;m=FindMax(s,3);printfT%d:%fn”,mN,mMark);printf(M%fnH,Aver);C+將Fortran模塊實體作為苴外部實體看待,Fortran中的派生類型與C+的結(jié)構(gòu)體相對應(yīng)。需要注意的是,該示例由C+來鏈接,而在被調(diào)用的IntelFortran例程中又使用了派生類型和數(shù)組參數(shù).須將IntelFortran的libifcoremd.lib運行庫鏈接到執(zhí)行文件中。C/C+函數(shù)并入模塊通過在I

50、ntelFortran模塊中建立例程接口塊,町以將C/C+函數(shù)作為模塊例程使用 IntelVisualFortran應(yīng)用程序開發(fā)第10*IntelFortran與VisualC*/Basic.NET的混合編程 #例10-5將求平方根的C+噸數(shù)轉(zhuǎn)換為IntelFortran模塊例程。C+函數(shù)(cpp)為:includeexternrCnvoidcsqrt(floata,floatb,float&c)c=(float)sqrt(a*a+b*b);在C+中,用簡便的引用參數(shù)(c)代替指針參數(shù),其實質(zhì)都是地址傳遞使用模塊的InlelFortran控制臺程序為:MODULECprocIMPLICITNO

51、NEINTERFACESUBROUTINEC_Sqrt(a,b,res)!DEC$ATTRIBUTESC:C_Sqrt!DEC$ATTRIBUTESREFERENCE:resREALa,b,resENDSUBROUTINEENDINTERFACEENDMODULEPROGRAMEx_5USECprocIMPLICITNONEREALXCALLCSqrt(3.0,4.0,X)PRINT化XENDPROGRAM #IntelVisualFortran應(yīng)用程序開發(fā)第10*IntelFortran與VisualC*/Basic.NET的混合編程 這里,接門塊的作用類似于C+中的頭文件:聲明例程原型,貞

52、正的例程實現(xiàn)體由C/C+給出。在接口塊中規(guī)定了和C+缺省約定(_cdecl)相匹配的C約定,目標(biāo)例程名統(tǒng)一被轉(zhuǎn)換成小寫,參數(shù)傳遞采取值傳遞;REFERENCE屬性使res參數(shù)最終采取引用傳遞。10.4.3外部變量外部變位包括Fortran共用區(qū)、C/C+結(jié)構(gòu)體及全局(外部)變id,所有這些變IS在聲明它們的單元外部可以訪問。全局變Fortran與C/C+共享全局變鈕時,在一種語言中聲明為全局的(包括Fortran共用區(qū)),而在另一種語肓中則作為外部變量訪問。例10-6】ln(clFortran訪問C+中的全局變鼠整型數(shù)組。位于靜態(tài)庫中的C+文件(.CPP)為:externHCHintIdata

53、3=1,2,3;C+文件只包含一整型數(shù)組并進行了初始化。C+的命名修飾不只是針對函數(shù).對全局變戢也產(chǎn)生影響,故此使用了externC”鏈接選項聲明全崗變量。訪問C+全局變呈的IntelFortran控制臺程序為:programEx6implicitnone!DEC$ATTRIBUTESEXTERN,ALIAS:”dala”:idataINTEGERidata(3)PRINT化idataendprogramEx_6 IntelVisualFortran應(yīng)用程序開發(fā)第10章IntelFortran與VisualC*/Basic.NET的混合編程 #此處.除用EXTERN(EXTERN通知編譯歸:該

54、變g:實際是在另一個源文件中聲明的)向明與C+對應(yīng)的全局變址外還使用了ALIAS屈性限定產(chǎn)生的冃標(biāo)變址名使其與C+產(chǎn)生的目標(biāo)變呈名保持一致。反之,C/C+也可以訪問Fortran中聲明的全局變呈(共用區(qū))。【例10-7C語育訪問IntelFortran中的單變呈共用區(qū)。位于靜態(tài)庫中的IntelFortran數(shù)據(jù)塊為:blockdataimplicitnonerealPlcommon/Pl/PldataPI/10.0/end變量及存放變址的共用區(qū)取相同的名稱Pio訪問上述全局變屋PI的C語言(C)控制臺程序為:#includevoidmain(intargc,char*argv)externfl

55、oatPI;printf(uPl=%fPI);這里,C語言聲明的外部變屋實際為Fortran共用區(qū)名.而不是共用區(qū)中的變量名。因此.C/C+無法訪問Fortran無名共用區(qū)中的變童。共用區(qū)和結(jié)構(gòu)體在例107中.Fortran共用區(qū)和變量取相同的名稱.可以和C語肓中的外部變 #IntelVisualFortran應(yīng)用程序開發(fā)第10章IntelFortran與VisualC*/Basic.NET的混合編程 斌相對應(yīng)。浪然,若共用區(qū)中包含多個變呈,無法使多個變就都取共用區(qū)的名稱。在這種悄況下,就需要利用結(jié)構(gòu)體與共用區(qū)交換數(shù)據(jù)。為了實現(xiàn)結(jié)構(gòu)體與共用區(qū)間的數(shù)抿交換.必須考慮兩者在存儲成員變量方式上的差別

56、Fortran以緊湊格式存儲共用區(qū)變顯:.并遵循下列規(guī)則:諸如BYTE、INTEGER(l)、LOGlCAL(l)和CHARACTER類型的單個成員變員緊接著前一個成員變址或數(shù)組的地址存儲。其他類型的單個成員變坦,緊接君前一個成員變就或數(shù)組的偶數(shù)地址存儲。除CHARACTER類型外的數(shù)組成員.緊接著前一個成員變応或數(shù)組的偶數(shù)地址存儲;CHARACTER類型的數(shù)組成員,總處緊接著前一個成員變繪或數(shù)組的地址存儲。(4)所有的共用區(qū)從4字節(jié)對齊的地址開始存儲。正因為共用區(qū)存在上述封裝規(guī)則,在C結(jié)構(gòu)體與Fortran共用區(qū)交換數(shù)據(jù)時,必須確保結(jié)構(gòu)體成員與共用區(qū)成員的對齊方式是一致的??梢钥紤]在這兩種語

57、言中只便用4字節(jié)和8字節(jié)數(shù)據(jù)類型;或者在C程序中便用pragmapack(2)預(yù)處理指令,來硬性規(guī)定結(jié)構(gòu)體采取共用區(qū)的成員對齊方式。共用區(qū)與結(jié)構(gòu)體的數(shù)據(jù)交換存在兩種方式:一是直接訪問,二是傳遞共用區(qū)地址。直接訪問共用區(qū)和結(jié)構(gòu)體通過在C程序中聲明與共用區(qū)對應(yīng)的外部結(jié)構(gòu)體,并保證兩者成員的對齊方式是一致的.就可以在C程序中直接訪問共用區(qū)?!纠?0-8C程序通過結(jié)構(gòu)體直接訪問IntelFortran共用區(qū)中的多個成員變址。位于靜態(tài)庫中的IntelFortran數(shù)據(jù)塊單元為:blockdataimplicitnone!DEC$ATTRIBUTESALlASrReally*:ReallyREAL(4)x

58、,y,z(3)REAL(8)ydblCOMMON/Really/x,y,z,ydbldatax.y,z,ydbl門.0,2.0,10.0,20.0,/end IntelVisualFortran應(yīng)用程序開發(fā)第10章IntelFortran與VisualC*/Basic.NET的混合編程 #這里對數(shù)據(jù)塊中的共用區(qū)規(guī)定了ALIAS屆性.以便和C程序結(jié)構(gòu)體變呈的混合大小寫目標(biāo)名保持一致。值得注意的是,共用區(qū)中的成員數(shù)組只規(guī)定數(shù)組名,而不能采取聲明時的形式。訪問上述共用區(qū)的C語育控制臺程序為:#pragmapack(2)externstructfloatx、y,z3;doubleydbl;Really

59、;#pragmapack()#includevoidmain(void)printf(nx=%f,y=%fn*Really.x,Really.y);printKMz0=%Czl=%f,z2=%fnReally.z0,Really.z1,Really.z2J);printf(Mydbl=Rcally.ydbl);C程序通過規(guī)定pragmapack預(yù)處理指令,使Really外部結(jié)構(gòu)體采取和IntelFortran共用區(qū)一致的對齊方式;為了恢復(fù)先前的結(jié)構(gòu)體封裝模式,在結(jié)構(gòu)體定義的后面必須添加pragmapack()預(yù)處理指令。另外,這里的Really是結(jié)構(gòu)體變星名,而不是結(jié)構(gòu)體類型名。只要保證結(jié)構(gòu)體

60、和共用區(qū)采取相同的對齊方式.就既能通過結(jié)構(gòu)體從C語肓中訪問共用區(qū),也能通過共用區(qū)從IntelFortran中訪問結(jié)構(gòu)體,2)共用區(qū)(結(jié)構(gòu)體)作為引用參數(shù)傳遞如果共用區(qū)(結(jié)構(gòu)體)作為值參數(shù)傳遞,那么需要拷貝其每一成員的值,效率比 #IntelVisualFortran應(yīng)用程序開發(fā) IntelVisualFortran應(yīng)用程序開發(fā)較低下;但作為引用參數(shù)傳遞,則只需傳遞其4字節(jié)(在IA-32系統(tǒng)下)的地址。如同數(shù)組中第一個元素的地址為數(shù)組首地址一樣,共用區(qū)(結(jié)構(gòu)體)中第一個成員的地址即代表其首地址。這樣.就可以在C函數(shù)中聲明結(jié)構(gòu)體指針參數(shù);而在對應(yīng)的Fortran例程中聲明和共用區(qū)第一個成員同類型的

溫馨提示

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

最新文檔

評論

0/150

提交評論