代码之家  ›  专栏  ›  技术社区  ›  AndyPerfect

简单Fortran函数返回的奇数值

  •  2
  • AndyPerfect  · 技术社区  · 14 年前

    就像一个前锋一样,当谈到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”并不完全相等。我有什么明显的不足之处吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   M. S. B.    14 年前

    在混合语言内容中学习一门语言是“很难的事”。请注意,您获得的值是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
    
        2
  •  0
  •   AndyPerfect    14 年前

    看起来我几乎走到了正确的轨道上,但是我宣布“我”的方式让一些奇怪的事情发生了。使用以下惯例时

    integer*4 :: ex, i
    

    函数返回正确的值。所以,我的函数看起来是这样的

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

    谢谢你们两个的帮助。我反对你们两个只是把我的眼睛放在我事先没有完全理解的语言的某个方面。