使用带有c+中参数的Fortran90子例程+; 我试图在C++程序中使用一些FORTRAN 90子程序。我有一个函数writio,没有任何参数可以正常工作,但是我的函数两次都做不到它应该做的事情。这是我的第一个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 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
我用使用带有c+中参数的Fortran90子例程+; 我试图在C++程序中使用一些FORTRAN 90子程序。我有一个函数writio,没有任何参数可以正常工作,但是我的函数两次都做不到它应该做的事情。这是我的第一个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 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,c++,function,scope,fortran,C++,Function,Scope,Fortran,我用f95-c rocker.f90编译了这个。然后我想使用C++程序中的子程序 TestCCF.CPP: using namespace std; #include <cstdlib> #include <iostream> #include <iomanip> #include <sstream> #include <fstream> #include <stdio.h> #include <
f95-c rocker.f90
编译了这个。然后我想使用C++程序中的子程序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;
}
然后程序冻结。看来变量可能没有从C++正确地传递到F90?< /P>
编辑:问题似乎不仅仅出现在Fortran代码中,因为我可以从Fortran程序runrocker.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
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
由于
两次
的第二个参数是OUT
,因此您可能需要一个参考:
extern void __rocker_MOD_twice(double d1, double& d2);
谢谢我只是注意到,在我使用的教程中,我也应该仔细阅读。