就像前锋一样,当谈到Fortran时,我是一个完全的初学者。我已经花了很长时间查看关于SO的其他问题,但我无法确定类似的问题,所以请原谅我,如果我的解决方案要么显而易见,要么已经得到解答:)
我正在尝试学习如何在VB.net应用程序中正确实现自编写的Fortran DLL。我已经能够让VB识别DLL,并执行该函数没有任何错误。与实际输出相比,误差与预期输出相当。
我的Fortran DLL函数如下所示:
function ex(i)
integer*4 i
ex=i+1
return
end
一个非常简单的函数,它将传递的参数递增1并返回值。 (我认为)。 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”不完全相等。我明显不知所措的任何想法?
答案 0 :(得分:2)
学习混合语言内容的语言是“艰难的锄头”。请注意,您获得的值是2 ** 30。
在fortran部分,你还应该声明函数的返回值:“integer * 4 function ex(i)”是老式的方式。你可能通过隐式输入得到了真实的东西。在所有程序和过程中包含“隐式无”以防止隐式类型是一个非常好的主意。许多编译器都包含一个用于相同目的的选项。
延迟编辑: 这是一个程序,它通过显示当位模式实数值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
答案 1 :(得分:0)
看起来我几乎走在正确的轨道上,但我宣称“我”的方式发生了一些奇怪的事情。使用以下
惯例时integer*4 :: ex, i
该函数返回正确的值。所以,我的功能看起来像这样
function ex(i)
integer*4 :: ex, i
ex=i+1
return
end function
感谢你们两位的帮助。我赞成你们俩只是为了让我的眼睛看到我事先并不完全理解的语言的某些方面。