Нечетное значение, возвращаемое простой функцией Фортрана - PullRequest
2 голосов
/ 20 августа 2010

Так же, как форвард, я полный новичок, когда дело доходит до Фортрана.Я потратил некоторое время, рассматривая другие вопросы по SO, но я не смог определить схожий вопрос с этим, поэтому, пожалуйста, прости меня, если мое решение либо очевидно, либо уже получило ответ:)

IЯ пытаюсь узнать, как правильно реализовать самостоятельно написанную библиотеку Fortran DLL в приложении VB.net.Я смог заставить VB распознавать DLL и выполнять функцию без ошибок.Ошибка возникает скорее как ожидаемый результат по сравнению с фактическим выходом.

Моя функция DLL библиотеки Fortran выглядит следующим образом:

function ex(i) 
   integer*4 i
   ex=i+1 
   return 
end

Очень простая функция, которая увеличивает передаваемый параметр на единицу и возвращает значение,(Я думаю).Приложение VB имеет следующий код:

<DllImport("ex.dll")> _
Public Shared Function ex(ByRef val As Integer) As Integer
End Function


Private Sub btn_Fortran_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Fortran.Click
   Console.WriteLine(ex(1))
End Sub

Итак, я передаю функции ex целое значение 1. Поэтому я ожидаю, что значение 2 будет записано в консоль.Вместо этого я получаю значение "1073741824" Не совсем равное.Любые идеи, где я явно не хватает?

Ответы [ 2 ]

2 голосов
/ 20 августа 2010

Изучение языка в смешанном языковом контенте - трудная задача.Обратите внимание, что полученное вами значение равно 2 ** 30.

В части Fortran вы также должны объявить возвращаемое значение функции: "integer * 4 function ex (i)" - это старомодный способ.Вы, вероятно, получаете ex как реальный через неявную типизацию.Это очень хорошая идея, чтобы включить «неявное нет» во все ваши программы и процедуры, чтобы предотвратить неявную типизацию.Многие компиляторы включают опцию для той же цели.

Позднее редактирование: вот программа, которая демонстрирует, что происходит, показывая, какое значение получается, когда действительное значение битовой комбинации 2.0 интерпретируется как целое число.Сначала программа приравнивает вещественное и целое число.В этом случае компилятор «знает» о типах и преобразует значение.Во втором случае необработанный битовый массив передается без преобразования.

program test_tc

   real :: my_real
   integer :: my_int

   my_real = 2.0

   my_int = my_real
   write (*, *) my_int

   my_int = transfer ( my_real, my_int )
   write (*, *) my_int

end program test_tc

Вывод:

           2
  1073741824
0 голосов
/ 20 августа 2010

Похоже, я был почти на правильном пути, но то, как я объявил «я», привело к некоторым странным вещам.При использовании следующего соглашения

integer*4 :: ex, i

Функция возвращает правильное значение.Итак, моя функция выглядит следующим образом

function ex(i) 
   integer*4 :: ex, i
   ex=i+1
   return 
end function

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

...