У меня есть подпрограмма, написанная на фортране, которую мне нужно вызвать из VB.NET, где написаны все остальные мои функции. Я не писал фортран, и вряд ли знаю фортран. Я получаю ниже исключение на мой вызов функции DLL и не знаю, как это исправить. Интересно, связано ли это с неконгруэнтной переменной длиной?
У меня есть источник для моего фортрана, и я скомпилировал его с помощью компилятора g95. Я попытался скомпилировать его с флагом, на котором все реалы должны быть установлены в 32 бита (-r4). Меня убеждает, что вам не нужно инициализировать переменные перед использованием в Фортране. Я думал, что это должен быть язык с ребрами.
В любом случае, вот исключение, которое я получаю:
System.AccessViolationException было
необработанное сообщение = попытка чтения
или запишите защищенную память. Это
часто указание на то, что другая память
поврежден. Источник = PTPWrapper
Трассировки стека:
в PTPWrapper.Module1.pointtopoint (одиночный &
IELEVAT, Single & IDIST, Single & FREQ,
Single & HTAMSL, Single & DLOSS, Одноместный &
Беспорядок)
в PTPWrapper.Module1.Main () в C: \ Documents and Settings \ SGoldman \ my
документы \ визуальная студия
2010 \ Projects \ PTPWrapper \ PTPWrapper \ Module1.vb: линия
18
в System.AppDomain._nExecuteAssembly (RuntimeAssembly
сборка, строка [] args)
в System.AppDomain.ExecuteAssembly (String
AssemblyFile, Доказательства
AssemblySecurity, String [] args)
в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly ()
в System.Threading.ThreadHelper.ThreadStart_Context (Object
государство)
в System.Threading.ExecutionContext.Run (ExecutionContext
executeContext, ContextCallback
обратный вызов, состояние объекта, логическое значение
ignoreSyncCtx)
в System.Threading.ExecutionContext.Run (ExecutionContext
executeContext, ContextCallback
обратный вызов, состояние объекта)
в System.Threading.ThreadHelper.ThreadStart ()
InnerException:
вот мое объявление функции VB и вызов функции:
Declare Sub pointtopoint Lib "diff5z11.dll" (ByRef IELEVAT As Single, ByRef IDIST As Single, ByRef FREQ As Single, ByRef HTAMSL As Single, ByRef DLOSS As Single, ByRef CLUTTER As Single)
pointtopoint(elevation(0), distance, freq, height, dlo, clut)
здесь все переменные определены как 32-битные синглы в VB.
и вот первые несколько строк кода фортрана:
subroutine pointtopoint(IELEVAT, IDIST, FREQ, HTAMSL, DLOSS, CLUTTER)
real ielevat(*)
dimension oblim(2)
dd = 0.1
EK = 1.333 ! Earth curvature (4/3 earth)
HR = 9.1 ! Rcvr Ant ht (m), for 30 feet
HRAMSL = IELEVAT(IDIST) + HR
DIST = float(idist)*dd
FRESMIN = HR + 1.0
DLOSS = 0.0
TDLOSS = 0.0
RDLOSS = 0.0
ADJ = 0.0
есть идеи, как я могу получить вызов на работу и вернуть свои данные? Спасибо!