微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Fortran C++ 绑定 - 在 DLL(C++) 中读取错误值

如何解决Fortran C++ 绑定 - 在 DLL(C++) 中读取错误值

我正在尝试将 Fortran 与 C++ 结合使用。我按照这个 guide 创建了一个 DLL(C++)。但是,我没有创建调用此 DLL 的 C++ MathClient.cpp 程序(如指南中所述),而是创建了调用此 DLL 的 Fortran MathClient.F90 程序。

Fortran 主要代码

PROGRAM MAIN

  USE MOD_INTERFACE

  IMPLICIT NONE
  
  INTEGER(C_INT) :: A,B
  INTEGER(C_INT) :: INDEX
  INTEGER(C_INT) :: CURRENT
  LOGICAL(C_BOOL) :: BOLEAN
  
  A = 1
  B = 1

  ! Initialize a Fibonacci relation sequence.
  CALL FIBONACCI_INIT(A,B)
  ! Write out the sequence values until overflow.
  DO
      
    BOLEAN = FIBONACCI_NEXT()
    IF (.NOT. BOLEAN) EXIT
    INDEX = FIBONACCI_INDEX()
    CURRENT = FIBONACCI_CURRENT()
    WRITE(*,*) INDEX,': ',CURRENT
  
  END DO
  
  WRITE(*,*) FIBONACCI_INDEX() + 1,&
  'Fibonacci sequence values fit in an unsigned 64-bit integer.'

  END PROGRAM MAIN

Fortran 模块代码

MODULE MOD_INTERFACE

USE,INTRINSIC :: ISO_C_BINDING

INTERFACE
    SUbroUTINE FIBONACCI_INIT ( A,B ) bind ( C,name = "fibonacci_init" )
      IMPORT
      IMPLICIT NONE
      INTEGER (C_INT) :: A,B
    END SUbroUTINE FIBONACCI_INIT
    
    LOGICAL(C_BOOL) FUNCTION FIBONACCI_NEXT ( ) bind ( C,name = "fibonacci_next" )
      IMPORT
      IMPLICIT NONE
    END FUNCTION FIBONACCI_NEXT
  
    INTEGER(C_INT) FUNCTION FIBONACCI_CURRENT ( ) bind ( C,name = "fibonacci_current" )
      IMPORT
      IMPLICIT NONE
    END FUNCTION FIBONACCI_CURRENT

    INTEGER(C_INT) FUNCTION FIBONACCI_INDEX ( ) bind ( C,name = "fibonacci_index" )
      IMPORT
      IMPLICIT NONE
    END FUNCTION FIBONACCI_INDEX

END INTERFACE

END MODULE MOD_INTERFACE

MathLibrary.cpp 中的 C++ 函数与上述指南中的相同。唯一的区别是,我添加了一些 std::cout,以便在 C++ 函数中打印接收到的变量的值。

问题是,C++ 函数从 Fortran 主代码接收错误整数(C_INT) 值。例如,void fibonacci_init 函数应在初始化期间接收值 current_ = 1,prevIoUs_ = 1。取而代之的是,这些值是一些巨大的整数 (current_ = 45028402782009632)。

我正在使用英特尔 Parallel Studio 和 Visual Studio。如有任何帮助,我将不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。