Можно передать объект в качестве параметра методу Фортрана? - PullRequest
2 голосов
/ 26 августа 2010

В настоящее время я работаю над тем, чтобы импортировать DLL, написанную на Фортране, в Visual Basic.У меня есть все основы, так что теперь я пытаюсь сделать еще один шаг вперед.Заголовок в основном говорит сам за себя, но я все равно объясню, что именно я пытаюсь сделать., возможно, представляет точку в пространстве в трех измерениях.В моем методе Fortran я хочу взять этот объект, распечатать значение x, а затем изменить значение x на 7.5.Вот мой код на Фортране, который делает именно это.

module test
   type Point
      double precision x, y, z
   end type Point
end module test

function ex1(ThreeDubs)
   use test
   type (Point) :: ThreeDubs
   print *, ThreeDubs%x
   ex1 = 1
   return
end function

И этот код прекрасно работает! ... Только для структур.Другими словами, давайте предположим, что у меня есть следующая структура и класс в VB

Public Structure StructurePoint
   Public x As Double
   Public y As Double
   Public z As Double
End Structure

Public Class ObjectPoint
    Public x As Double
    Public y As Double
    Public z As Double
End Class

Создание экземпляра StructurePoint дает идеальные результаты: метод Fortran выводит значение x, а затем изменяет значение x.Отлично.Теперь проблема.Когда я передаю экземпляр ObjectPoint, программа выводит значение, подобное 1.523E-306.По сути, говорит мне, что местоположение, в котором он считает значение x, не является значением x.Итак, в этом и заключается мой вопрос.Можно ли даже передать Объект в DLL-библиотеку Фортрана и получить к нему правильный доступ, и если да, то как мне поступить?

Решение

ИзменениеОбъявление класса - ЕДИНСТВЕННАЯ вещь, которую нужно сделать, чтобы передать этот объект в Фортран.

<StructLayout(LayoutKind.Sequential)> _
Public Class CustomPoint3d
    Public x As Double
    Public y As Double
    Public z As Double
End Class

<DllImport("passPoint3d.dll")> _
Public Shared Function PrintX(ByVal point As CustomPoint3d) As Boolean
End Function

Ответы [ 2 ]

1 голос
/ 26 августа 2010

Это может быть сложно, и я не думаю, что есть какая-то польза, поэтому я советую вам не беспокоиться!

Здесь все равно идет! Я думаю, что объект VB.Net будет маршалироваться как указатель. В Fortran 90 есть некоторая поддержка для указателей. Это может сработать, если вы добавите pointer в объявление Fortran ThreeDubs.

function ex1(ThreeDubs) 
   use test 
   type (Point), pointer :: ThreeDubs ! Note additional pointer keyword
   print *, ThreeDubs%x 
   ex1 = 1 
   return 
end function 

Я сомневаюсь, что вы когда-нибудь сможете вызывать методы в объекте ThreeDubs из Фортрана, поэтому я не уверен в преимуществах передачи объекта.

Вот две статьи на PInvoke: PInvoke - это имя .Net для вызова oldschool "неуправляемых" DLL, таких как ваш Fortran. В статьях объясняется, как аргументы .Net «маршалируются» (переводятся) в библиотеку Fortran DLL. Вы можете контролировать маршаллинг с помощью атрибутов: статьи объясняют больше. Они, как правило, используют C и C # для примеров: (

1 голос
/ 26 августа 2010

Я не знаю о Visual Basic, но у меня есть общие пользовательские типы между Fortran & C. Это поддерживается привязкой ISO C Fortran 2003, которая уже широко поддерживается компиляторами Fortran 95.Вы объявляете определяемый пользователем тип Fortran и присваиваете ему атрибут C привязки и имя привязки.Пока все подкомпоненты типа взаимодействуют с C, пользовательский тип также может взаимодействовать с C. И этот метод является стандартным и переносимым.Я сделал это, передав информацию с помощью пользовательской переменной типа Fortran, являющейся переменной модуля, и структурной переменной C, находящейся в глобальной памяти посредством объявления в верхней части файла.Возможно, вы можете использовать привязку ISO C на стороне Fortran и как-то сказать Visual Basic использовать интерфейс, подобный C?

...