Я пытаюсь передать 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;
}