新手,在用vb呼叫dll,傳遞數值程序中出現問題,其中一個變數NELEMS,在vb中賦值為20,可到了fortran中變為一個很大且隨機的數,
fortran的dll宣告代碼:
SUBROUTINE ELEMCA (KK,IH,R01,R02,Z1,Z2,PHY1,PHY2,NELEMS,IA,NH,NNODES,NSIZE,E1,E2,FNU1,FNU2,G,THICK,RHOS,AR,ASS,PHP,SINE,COSINE,CHECK,PHPP,ARCL,SS)
!DEC$ ATTRIBUTES DLLEXPORT ::ELEMCA
!DEC$ ATTRIBUTES ALIAS : "ELEMCA" :: ELEMCA
!DEC$ ATTRIBUTES VALUE ::KK,IH,NELEMS,IA,NH,NNODES,NSIZE
!DEC$ ATTRIBUTES REFERENCE ::R01,R02,Z1,Z2,PHY1,PHY2,E1,E2,FNU1,FNU2,G,THICK,RHOS,AR,ASS,PHP,SINE,COSINE,CHECK,SS,PHPP,ARCL
REAL R01(50),R02(50),Z1(50),Z2(50),PHY1(50),PHY2(50),E1(50),E2(50),FNU1(50),FNU2(50),G(50),THICK(50),RHOS(50),AR(29),ASS(29),PHP(29),SINE(29),COSINE(29),CHECK(8,8),SS(50)
REAL PHPP,ARCL,PHPRIM
REAL PH(29), AM(8,8), PHIMAT(8,8)
INTEGER K,IH,NETP,NETL,NET1,I,J,KK,NET,NELEMS
下面是vb的宣告代碼:
Private Declare Sub ELEMCA Lib "ELEMCA.dll" (ByVal KK As Integer, ByVal IH As Integer, ByRef R01 As Single, ByRef R02 As Single, ByRef Z1 As Single, ByRef Z2 As Single, ByRef PHY1 As Single, ByRef PHY2 As Single, ByVal NELEMS As Integer, ByVal IA As Integer, ByVal NH As Integer, ByVal NNODES As Integer, ByVal NSIZE As Integer, ByRef E1 As Single, ByRef E2 As Single, ByRef FNU1 As Single, ByRef FNU2 As Single, ByRef G As Single, ByRef THICK As Single, ByRef RHOS As Single, ByRef AR As Single, ByRef ASS As Single, ByRef PHP As Single, ByRef SINE As Single, ByRef COSINE As Single, ByRef CHECK As Single, ByRef PHPP As Single, ByRef ARCL As Single, ByRef SS As Single)
呼叫代碼:
Call ELEMCA(KK, IH, R01(1), R02(1), Z1(1), Z2(1), PHY1(1), PHY2(1), NELEMS, IA, NH, NNODES, NSIZE, E1(1), E2(1), FNU1(1), FNU2(1), G(1), THICK(1), RHOS(1), AR(1), ASS(1), PHP(1), SINE(1), COSINE(1), CHECK(1, 1), PHPP, ARCL, SS(1))
求高手們幫忙解答.
uj5u.com熱心網友回復:
不要做A語言代碼修改為B語言代碼的無用功。也不要做用A語言代碼直接呼叫B語言代碼庫這樣復雜、這樣容易出錯的傻事。
只需讓A、B語言代碼的輸入輸出重定向到文本檔案,或修改A、B語言代碼讓其通過文本檔案輸入輸出。
即可很方便地讓A、B兩種語言之間協調作業。
比如:
A將請求資料寫到檔案a.txt,寫完后改名為aa.txt
B發現aa.txt存在時,讀取其內容,呼叫相應功能,將結果寫到檔案b.txt,寫完后洗掉aa.txt,改名為bb.txt
A發現bb.txt存在時,讀取其內容,讀完后洗掉bb.txt
以上A可以替換為任何一種開發語言或開發環境,B可以替換為任何一種與A不同的開發語言或開發環境。
除非A或B不支持判斷檔案是否存在、檔案讀寫和檔案更名。
但是誰又能舉出不支持判斷檔案是否存在、檔案讀寫和檔案更名的開發語言或開發環境呢?
共享臨時文本檔案這種行程之間的通訊方法相比其它方法的優點有很多,下面僅列出我現在能想到的:
·行程之間松耦合
·行程可在同一臺機器上,也可跨機,跨作業系統,跨硬體平臺,甚至跨國。
·方便除錯和監視,只需讓第三方或人工查看該臨時文本檔案即可。
·方便在線開關服務,只需洗掉或創建該臨時文本檔案即可。
·方便實作分布式和負載均衡。
·方便佇列化提供服務,而且幾乎不可能發生佇列滿的情況(除非硬碟空間滿)
·……
“跨語言、跨機,跨作業系統,跨硬體平臺,跨國,跨*.*的”苦海無邊,
回頭是“使用共享純文本檔案進行資訊交流”的岸!
uj5u.com熱心網友回復:
A)FORTRAN 函式需要宣告位 STDCALLB)注意資料型別長度,INTEGER 是2位元組還是4位元組?4位元組VB要用Long。REAL 也是,VB中有Sing、Double。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/96702.html
標籤:VB基礎類
上一篇:用vb6.0+opengl實作巖心外表面三維恢復,求各位大神幫忙啊
下一篇:語言不會寫
