2017-02-11 8 views
2

кодекса VB6.0 является:Fortran `чтения (*, *) 'в DLL вызывает "ошибка времени выполнения (39)" при вызове из 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

Я не могу рекомендовать смешивать ввод-вывод с двух разных языков. Только один должен читать и писать. –

ответ

2

Это очень просто - код Fortran пытается прочитать с консоли, и в приложении VB его нет. Как правило, вы должны делать все свои операции ввода-вывода на одном языке. Вы можете вызвать подпрограмму Windows API AllocConsole для создания консоли перед выполнением READ в Fortran, но это кажется глупым для приложения VB с графическим интерфейсом.

0

Самый подходящий способ - сделать все операции ввода-вывода на одном языке (например, помощники).

Howerver, как временное решение, я обнаружил, что функция «AllocConsole()» позволяет избежать ошибок, поскольку окно консоли можно установить.

Смежные вопросы