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

时间:2015-02-03 10:51:12

标签: c++ function scope fortran

我正在尝试在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编译它,在运行时我得到以下输出:

 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

1 个答案:

答案 0 :(得分:1)

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

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