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 (将#修改为@)