小编Fed*_*ini的帖子

具有延迟函数和non_overridable关键字的分段错误

我正在开发面向对象的Fortran代码,以实现具有抽象类型支持的多态性的数值优化。由于这是一种良好的TDD做法,因此我尝试以抽象类型编写所有优化测试class(generic_optimizer),然后由每个实例化的类(例如by)运行该测试type(newton_raphson)

所有优化测试都具有对的调用call my_problem%solve(...),该调用的定义deferred与抽象类型相同,并且在每种派生类型中当然具有不同的实现。

问题是:如果在每个非抽象类中都将延迟函数定义为non_overridable,则会出现分段错误,例如:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()

(gdb) where
#0  0x0000000000000000 in ?? ()
#1  0x0000000000913efe in __newton_raphson_MOD_nr_solve ()
#2  0x00000000008cfafa in MAIN__ ()
#3  0x00000000008cfb2b in main ()
#4  0x0000003a3c81ed5d in __libc_start_main () from /lib64/libc.so.6
#5  0x00000000004048f9 in _start ()
Run Code Online (Sandbox Code Playgroud)

经过反复试验,我注意到如果删除non_overridable声明,就可以避免该错误。在这种情况下,这不是问题,但是我想强制执行此操作,因为此代码不太可能具有两个级别的多态性。我是否违反了该标准的任何要求?

这是重现该错误的示例代码。我一直在用gfortran 5.3.0和6.1.0进行测试。

module generic_type_module
    implicit none
    private

    type, abstract, public :: generic_type
        real(8) :: some_data
        contains
        procedure (sqrt_interface), deferred …
Run Code Online (Sandbox Code Playgroud)

oop fortran fortran2003 fortran2008

5
推荐指数
1
解决办法
215
查看次数

如何使用iso_c_binding将MPI通信器句柄从Fortran传递到C

我正在尝试将并行 MPI Fortran 程序链接到也使用 MPI 的并行 C 库。软件架构以 Fortran 为中心,所以我试图尽可能多地保留 Fortran 方面的内容。

所以我需要将 C 例程传递给 MPI 通信器的句柄。它们的形式

  int CFunction(int *something, MPI_Comm *Ccomm)
Run Code Online (Sandbox Code Playgroud)

MPI 带有将 Fortran 转换为 C 通信器句柄的接口:

MPI_Comm MPI_Comm_f2c(MPI_Fint comm)
Run Code Online (Sandbox Code Playgroud)

但是,这些例程应该从 C 调用,所以现在我必须添加 C 包装函数,我可以将 Fortran 通信器传递给:

int CFunction_FMPI(int *something, MPI_Fint *Fcomm)
{   MPI_Comm Ccomm; int status;
    Ccomm = MPI_Comm_f2c(*Fcomm); // Convert Fortran->C communicator
    status = CFunction(*something,*Ccomm); // Call original function
    return status;
}
Run Code Online (Sandbox Code Playgroud)

然后我不得不编写第二个接口——CFunction_FMPI使用 Fortran 的 C 绑定来允许它从 Fortran 调用。

我的问题是:有没有更好的方法可以做到这一点,即避免使用 Fortran->C 通信器转换的 C 包装器?我认为MPI_Comm_f2c …

c fortran mpi fortran2003 fortran-iso-c-binding

5
推荐指数
1
解决办法
1190
查看次数

标签 统计

fortran ×2

fortran2003 ×2

c ×1

fortran-iso-c-binding ×1

fortran2008 ×1

mpi ×1

oop ×1