2010-08-19 83 views
2

就像前锋一样,在Fortran中,我是一个完整的初学者。我花了很长时间来看看其他问题,但我无法找到类似的问题,所以请原谅我,如果我的解决方案是明显的,或已经被回答:)通过简单的Fortran函数返回的奇数值

我是试图学习如何在VB.net应用程序中正确实现一个自写的Fortran DLL。我已经能够让VB识别DLL,并且没有任何错误地执行该函数。与实际产出相比,错误来自预期产出。

我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 

所以,我通过ex函数的整数值1.所以我期望值2写入控制台。相反,我得到的值“1073741824”不完全相等。任何想法,我明显不足?

+1

我只是猜测,所以这是一个评论。但是,似乎传递常量1可能不正确,因为导入参数被定义为ByRef。事实上,在我看来,它不应该建立。尝试声明一个整数并将其传递给'ex'。除此之外,如果它是一个param问题或返回值本身,我会试图缩小范围。改变你的函数'ex'来简单地返回一个常量;这可能有助于确定传入的参数是否错误或返回值是否无法正确恢复。 – 2010-08-19 23:06:41

回答

0

看来,我几乎是在正确的轨道上,但是我声明的方式“我”做了一些奇怪的事情发生了。当使用

integer*4 :: ex, i 

以下约定函数返回正确的值。所以,我的功能看起来像这样

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

谢谢你们的帮助。我提高了你们两个人的看法,因为我只是对我之前并不完全了解的语言的某些方面开放眼界。

+0

奇怪的东西不是来自“我”的声明,而是缺少“ex”的类型声明,默认情况下它变成了真实。所以返回值是实数值2的位模式,然后将其解释为一个整数。 – 2010-08-22 16:12:05

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