在 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);
我正在尝试在 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);