2010-08-19 3 views
2

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

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

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

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 

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

+1

Я просто догадываюсь, так что это комментарий. Кажется, что передача константы 1 может быть неверной, поскольку параметр import определяется как ByRef. На самом деле мне кажется, что он не должен был строиться. Попробуйте объявить целое число и передать его 'ex'. Помимо этого, я попытался бы сузить, если это проблема с параметром или само возвращаемое значение. Измените функцию 'ex', чтобы просто вернуть константу; что могло бы помочь определить, был ли параметр принят неверным, или если возвращаемое значение не возвращается правильно. –

ответ

0

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

integer*4 :: ex, i 

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

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

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

+0

Странные вещи были не из объявления «i», а из-за отсутствия объявления типа для «ex», которое по умолчанию стало реальным.Таким образом, возвращаемое значение представляло собой битовый шаблон для реального значения 2, который затем интерпретировался как целое. –

2

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

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

Late edit: Вот программа, которая демонстрирует, что происходит, показывая, какое значение получается, когда реальное значение битового шаблона 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 
Смежные вопросы