Передача MPI_Comm из Fortran в C / C ++ вызывает ошибку сегментации - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь передать MPI-коммуникатор из Фортрана в C / C ++.Я не уверен, какой тип указателя передать: type(MPI_Comm), MPI_Fint или просто целое число.Я пробовал несколько комбинаций упомянутых опций, но либо не смог скомпилировать, либо получил ошибку сегментации.Следующие коды выдают сообщение об ошибке:

Программный полученный сигнал SIGSEGV: Ошибка сегментации - недопустимая ссылка на память.

Интерфейс

module Tailor_module

use mpi
use, intrinsic :: ISO_C_Binding, only: C_int, C_double, C_char, c_associated
use, intrinsic :: ISO_C_Binding, only: c_ptr, C_NULL_ptr

implicit none
private

interface

    function Tailor__getobject(comm) result(optr) bind(C, name="Tailor__getobject")
        import c_ptr
        implicit none
        integer, intent(in), value :: comm
        type(c_ptr) :: optr
    end function Tailor__getobject

end interface

type(c_ptr), save :: obj = c_null_ptr

public :: Create

CONTAINS

    subroutine Create(com)
        integer, intent(in) :: com
        obj = Tailor__getobject(comm=com)
        return
    end subroutine Create

end module Tailor_module

Драйвер Фортрана

program main

use mpi
use Tailor_module, only : Create
IMPLICIT NONE

integer error

call MPI_Init(error)
call Create(MPI_COMM_WORLD);
call MPI_Finalize (error)

end

C ++

typedef void * OpaqueObject;

extern "C"
{
    OpaqueObject Tailor__getobject(MPI_Fint *f_handle);
}

OpaqueObject Tailor__getobject(MPI_Fint *f_handle)
{
    MPI_Comm comm;
    comm = MPI_Comm_f2c(*f_handle); 
    OpaqueObject s;
    return s;
}
...