我正在尝试在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
答案 0 :(得分:1)
由于您twice
的第二个参数是OUT
,您可能需要参考:
extern void __rocker_MOD_twice(double d1, double& d2);