У меня есть подпрограмма, написанная в fortran, которую мне нужно вызвать из VB.NET, где написаны все мои другие функции. Я не написал фортран и почти не знаю фортран. Я получаю следующее исключение в вызове функции dll и не знаю, как это исправить. Интересно, связано ли это из-за неконгруэнтной переменной длины?AccessViolationException был необработанным, вызывая fortran dll из vb net
У меня есть источник для моего fortran и скомпилирован с помощью компилятора g95. Я попытался скомпилировать его с флагом, на котором предполагается, что все реалы будут вынуждены 32 бита (-r4). Это странно, что вам не требуется инициализировать переменные перед использованием в fortran. Я думал, что это должен быть ребристый язык.
Во всяком случае, ниже исключение я получаю:
System.AccessViolationException был необработанное Сообщение = Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена. Источник = PTPWrapper
StackTrace: в PTPWrapper.Module1.pointtopoint (Single & IELEVAT, Одиночный & IDIST, Одиночный & FREQ, Одно & HTAMSL, Одиночный & DLOSS, Одиночный & загромождать) в PTPWrapper.Module1.Main () в C: \ Documents и Settings \ SGoldman \ мои документы \ Visual Studio 2010 \ Projects \ PTPWrapper \ PTPWrapper \ Module1.vb: линия в System.AppDomain._nExecuteAssembly (RuntimeAssembly сборки, String [] арг) на System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [] арг) на Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() в System.Threading.ThreadHelper.ThreadStart_Context (Объект состояние) в системе .Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback обратного вызова, состояние объекта, логическое ignoreSyncCtx) в System.Threading.ExecutionContext.Run ( исполнения ExecutionContext ExecutionContext, ContextCallback обратного вызова, объект состояния) в System.Threading.ThreadHelper .ThreadStart() Внутренний Исключение:
вот мой 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.
и вот первые несколько строк кода FORtran:
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
любые идеи, как я могу получить вызов на работу и получить обратно свои данные? Благодаря!
спасибо, я должен буду бардак вокруг с подпрограммой и посмотреть, не могу ли я устранить некоторые из этих двусмысленностей. HTAMSL - высота передатчика выше среднего уровня моря HRAMSL - высота приемника выше среднего уровня моря так, по крайней мере, это не то, что нарушает это. Я дам всем знать, если я получу работу. Еще раз спасибо. –