如何在c ++代码中调用模块中包含的Fortran90函数?

编程入门 行业动态 更新时间:2024-10-26 05:33:11
本文介绍了如何在c ++代码中调用模块中包含的Fortran90函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我在我的C ++项目中包括一个不是我的fortran90程序。

I m including a fortran90 program that is not mine in my C++ project .

在第一个步骤中,我尝试通过它们的name_()调用函数,并通过显示obj文件的符号来获得错误未定义的引用mp_mpi_cartesian_init_使用nm)我发现,函数被调用他们的模块作为module_function_所以我添加模块名称和我获得相同的问题,但在fortran obj之间,如Constants.f90 :(。文本+ 0x36):未定义引用__powi4i4

In the first stept I try to call the function by their name_() and i get the error "undefined reference to mp_mpi_cartesian_init_ "by dispalying the symbol of the obj file (using nm) i found that the function are called by their module as module_function_ so i add the module name and i Get the same problem but between fortran obj such as "Constants.f90:(.text+0x36): undefined reference to __powi4i4"

这里是c ++代码:

#include <iostream> #include <complex> using namespace std; extern"C" { void mod_save_wave_mp_read_it_psi_(int * it,complex<double>* psi_E1E2 ); void mod_mpi_cartesian_mp_mpi_cartesian_init_( ); extern int mod_mpl_h_mp_iproc_ ; } int main(){ complex<double> psi_local[512*24*512*24]; int it ; mod_mpi_cartesian_mp_mpi_cartesian_init_(); cout << "proc :" << mod_mpl_h_mp_iproc_ << "avant lecture\n"; mod_save_wave_mp_read_it_psi_(&it,psi_local); cout << "psi ="<< psi_local[0] << "poiur le proc "<<mod_mpl_h_mp_iproc_ <<"\n"; }

这是模块的示例:

MODULE mod_save_wave USE mod_constants USE mod_MPI_CARTESIAN USE mod_time_mesure, ONLY : tempsEcoule USE mod_input_data, ONLY : Nt_laserPsansLaser USE mod_input_data, ONLY : n_phi, n_rho1_seg, n_rho2_seg USE mod_input_data, ONLY : Nt_periode, save_periodique !//////////////////////////////////////////////////////////////// IMPLICIT NONE ! REAL(kind=d_t) :: prog_start_time, time_max_second ! character(len=80) :: IntermedWaveDir !================================================================ CONTAINS SUBROUTINE begin_count_time() IMPLICIT NONE prog_start_time = tempsEcoule() ! END SUBROUTINE begin_count_time SUBROUTINE READ_IT_PSI( it, psi_E1E2 ) IMPLICIT NONE !//////////////////////////////////////////////////////////////////////////////// INTEGER :: it ! COMPLEX(kind=d_t), DIMENSION(n_phi,n_rho1_seg,n_phi,n_rho2_seg) :: psi_E1E2 ! !================================================================================ integer :: c do c = 0, c_max-1 if( mod(iproc,c_max)==c ) then !//////////////////////////////////////////////////////////////////////////////// OPEN( unit=11,file=concat(trim(IntermedWaveDir),concat(concat('BACK/wave_',str_iproc),'_2p2p2')),& status='old', form='unformatted', MODE='READ' ) READ(11) it ! READ(11) psi_E1E2 ! CLOSE(11) ! print*,'iproc,readed it=',iproc, it endif CALL MPI_BARRIER(MPI_COMM_WORLD,infompi) ! !================================================================================ enddo !================================================================================ END SUBROUTINE READ_IT_PSI SUBROUTINE WRITE_IT_PSI( it, psi_E1E2 ) IMPLICIT NONE !//////////////////////////////////////////////////////////////////////////////// INTEGER :: it ! COMPLEX(kind=d_t), DIMENSION(n_phi,n_rho1_seg,n_phi,n_rho2_seg) :: psi_E1E2 ! !================================================================================ integer :: c do c = 0, c_max-1 if( mod(iproc,c_max)==c ) then !//////////////////////////////////////////////////////////////////////////////// OPEN( unit=11,file=concat(trim(IntermedWaveDir),concat(concat('wave_',str_iproc),'_2p2p2')),& form='unformatted') ! WRITE(11) it+1 !---- recommence a partir de la prochaine iterat! write(11) psi_E1E2 ! CLOSE(11) ! endif CALL MPI_BARRIER(MPI_COMM_WORLD,infompi) ! !================================================================================ enddo END SUBROUTINE WRITE_IT_PSI END MODULE mod_save_wave

推荐答案

我假设你使用的是g ++,gfortran,mpif90工具链。如果您有一个模块

I am assuming you are using the g++, gfortran, mpif90 toolchain. If you have a module

module rocker contains subroutine bye_baby ... end subroutine

C ++中的外部C语言声明是

The external C declaration for it in C++ is

extern "C" { // ,-- 2 Leading underscores to start // | ,-- then the module name // | | ,-- then _MOD_ // | | | ,-- then the subroutine name // V V V V extern void __rocker_MOD_bye_baby(); }

您可能还需要添加属性< stdcall))之后。默认情况下,C假定为cdecl,它以不同的方式堆叠参数。

You may also need to add attribute((stdcall)) after the extern. By default, C assumes cdecl which stacks the parameters differently.

更多推荐

如何在c ++代码中调用模块中包含的Fortran90函数?

本文发布于:2023-06-04 19:06:44,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/503322.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:函数   模块   代码   如何在

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!