2010-08-25 8 views
2

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

Для ударов и хихиканья, давайте просто предположим, что я хочу передать объект с тремя двойными значениями в нем, возможно представляя точку в пространстве в трех измерениях. В моем методе Fortran я хочу взять этот объект, распечатать значение x, а затем изменить значение x на 7.5. Вот мой код Fortran, который делает именно это.

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 дает отличные результаты: Фортран метод выводит значением х, а затем изменяет значение х. Отлично. Теперь проблема. Когда я передаю экземпляр ObjectPoint, программа выводит значение, аналогичное 1.523E-306. В основном, говоря, что местоположение, в котором он считает, что значение x находится, не является значением x. Итак, в этом мой вопрос. Возможно ли даже передать объект в библиотеку Fortran и получить доступ к нему правильно, и если да, то как мне это сделать?

Решение

Изменение декларации класса является только то, что должно быть сделано для того, чтобы передать этот объект в Fortran.

<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 

ответ

1

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

Здесь все равно! Я думаю, что объект VB.Net будет сортироваться как указатель. Для указателей в Fortran 90 существует some support. Это может сработать, если вы добавите 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 объекта из Fortran, так что я не уверен в пользу передачи объекта.

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

+0

hmm, что делает тип Point в моем коде указателем, дает точные результаты. Я потрачу немного на эти ссылки, которые вы положили. Спасибо =) – AndyPerfect

+1

OK вот еще одно предположение из другой статьи: http://msdn.microsoft.com/en-us/library/xedhyxyd(VS.71).aspx Храните «указатель» в Fortran, а в VB.Net добавьте эту строку ' _' непосредственно перед определением VB.Net 'Public Class ... '. Вы не отправили свой оператор declare: ему понадобится что-то вроде 'Declare Function ex1 Lib '???. Dll" (<[In], Out> ByVal x As ObjectPoint) Как Integer' Или 'ex1' возвращает double? – MarkJ

+0

Это сделало это моим хорошим сэром! Я обновлю свой код, чтобы отразить то, что решение оказалось похоже на передачу объекта Fortran. Огромное спасибо. – AndyPerfect

1

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

+0

Я думаю, что у Энди уже есть эта работа: определенный пользователем тип Fortran для и из структуры Vb.Net, которая является эквивалентным типом данных в VB, похожей на C struct. Но Энди хочет передать объект VB.Net в Fortran. – MarkJ

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