在 C++ 中使用带参数的 Fortran90 子例程

Using a Fortran90 subroutine with arguments in c++

我正在尝试在 C++ 程序中使用一些 Fortran 90 子例程。我有一个没有任何参数的函数 writio 可以正常工作,但是我的函数 twice 没有做它应该做的事情。这是我的第一个 Fortran 函数,所以问题可能出在文件 rocker.f90:

的某处
MODULE rocker

    CONTAINS

    SUBROUTINE writio
        WRITE(*,*) "writings"
    END SUBROUTINE writio

    SUBROUTINE twice(number, double)
        REAL*8, INTENT(IN) :: number
        REAL*8, INTENT(OUT) :: double
        WRITE(*,*) 2.0*number
        double=2.0*number;
    END SUBROUTINE twice

END MODULE rocker

这个我用f95 -c rocker.f90编译的。然后我想在c++程序中使用子程序 testcf.cpp:

using namespace std;
#include <cstdlib> 
#include <iostream>    
#include <iomanip>  
#include <sstream>
#include <fstream>
#include <stdio.h>    
#include <time.h>
#include <string.h>

extern "C" {
    extern void __rocker_MOD_writio();
    extern void __rocker_MOD_twice(double d1, double d2);
}

int main()  {

    __rocker_MOD_writio();
    double d1=3.5, d2;
    __rocker_MOD_twice(d1, d2);
    cout << d1 << "   " << d2 << endl;

    return 0;
}

我使用 g++ testcf.cpp rocker.o -lgfortran -o testcf 编译它,当 运行ning 我得到以下输出:

 writings
  -3.59651870E+36

然后程序就卡住了。所以似乎变量没有从 c++ 正确传递到 f90?

编辑:似乎问题不(仅)在 Fortran 代码中,因为我可以 运行 从 fortran 程序 runrocker.f90:

PROGRAM runrocker
    USE rocker, ONLY: writio, twice
    IMPLICIT NONE 

    REAL*8 :: d1=3.5, d2=0.0    

    CALL writio()
    CALL twice(d1, d2)
    WRITE(*,*) d1, "  ", d2


END PROGRAM runrocker

由于 twice 的第二个参数是 OUT,您可能需要参考:

 extern void __rocker_MOD_twice(double d1, double& d2);