首页 > 解决方案 > Fortran C++ 绑定 - 在 DLL(C++) 中读取错误值

问题描述

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

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

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

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

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

标签: c++fortranfortran-iso-c-binding

解决方案


推荐阅读