2017-02-11 27 views
2

代碼調用時是:的Fortran`讀取(*,*)`在DLL導致 「運行時錯誤(39)」,在VB6.0 VB6.0從

Private Declare Sub suba Lib "D:\try_vb\c_dll\Dll1\Dll1\Debug\Dll1.dll" (ByRef a As Single, ByRef b As Single, ByRef c As Single) 
Private Sub Command1_Click() 
    Dim a As Single 
    Dim b As Single 
    Dim c As Single 
    a = 10# 
    b = 2# 
    Call suba(a, b, c) 
    Text1.Text = c 
End Sub 

代碼使用Fortran的DLL是:

subroutine suba(a,b,c) 
!DEC$ ATTRIBUTES stdcall,DLLEXPORT ::suba 
!DEC$ ATTRIBUTES ALIAS:"suba"::suba 
!DEC$ ATTRIBUTES reference :: a,b,c 
    implicit none 
    real::a 
    real::b 
    real::c 
    real::aaa 

    c=a+b 
    read(*,*)aaa  !This sentence seems wrong 
end subroutine 

如果行read(*,*)aaa不存在,該程序可以返回正確的答案c=12,見下圖: Fig 1

但當read(*,*)aaa存在S,一個錯誤發生了,那就是

forrtl:severe(39):error during read,unit -4,file CONIN$ 

forrtl:severe(39):error during read,unit -4,file CONIN$

我應該怎麼辦?

+0

什麼是Fortran/MD或/ MT的鏈接模型?讀取試圖從控制檯讀取。如果你處理VB的所有讀取操作並且只是在Fortran中進行計算,那將會更好。 – cup

+1

我不建議混合來自兩種不同語言的I/O。只有一個人應該閱讀和寫作。 –

回答

2

這很簡單 - Fortran代碼試圖從控制檯讀取,並且在VB應用程序中沒有一個。通常你應該用一種語言來完成你所有的I/O操作。您可以在執行Fortran中的READ之前調用Windows API例程AllocConsole來創建控制檯,但對於具有圖形界面的VB應用程序來說,這似乎很愚蠢。

0

最合適的方法是用一種語言來完成所有的I/O操作(比如幫助者說的)。作爲臨時解決方案,我發現「AllocConsole()」函數可以避免錯誤,因爲可以設置控制檯窗口。