Адрес изменения указателя члена - PullRequest
0 голосов
/ 06 июля 2019

В следующем коде я проверяю адрес int* j из Mystruct внутри и после конструктора Mystruct. Адреса разные в каждом конкретном случае. В чем проблема?

C ++

struct Mystruct
{
    int* j;

    Mystruct()
    {
        j = new int;
        *j = 8;

        check_address();
    }

    void check_address()
    {
        std::cout << j << std::endl;
    }
};        

typedef void* OpaqueObject;

extern "C"
{    
    OpaqueObject allocate_mystruct()
    {
        Mystruct* ms = new Mystruct();
        return reinterpret_cast<OpaqueObject>(ms);
    }    

    void check_address(OpaqueObject** oo)
    {
        Mystruct *ms = (Mystruct*)(**oo);
        ms->check_address();
    }
}

Фортран водитель

program main

    use mpi
    use mymodule, only : f_allocate_mystruct, f_check_address
    IMPLICIT NONE

    integer error

    call MPI_Init(error)    

    call f_allocate_mystruct()
    call f_check_address()

    call MPI_Finalize (error)

    end

Модуль Fortran

module mymodule

    use mpi
    use, intrinsic :: ISO_C_Binding, only: c_ptr, c_null_ptr

    implicit none
    private

    interface            

        function allocate_mystruct() result(optr) bind(C, name="allocate_mystruct")
            import c_ptr
            implicit none
            type(c_ptr) :: optr
        end function allocate_mystruct

        subroutine check_address(optr) bind(C, name="check_address")
            import :: c_ptr
            implicit none
            type(c_ptr), intent(in) :: optr
        end subroutine check_address

end interface

    type(c_ptr), save :: c_mystruct = c_null_ptr

    public :: f_allocate_mystruct, f_check_address

    CONTAINS

        subroutine f_check_address()
            if(c_associated(c_mystruct)) then
                call check_address(c_mystruct);
            end if
        end subroutine f_check_address            

        subroutine f_allocate_mystruct()
            c_mystruct = allocate_mystruct()
        end subroutine f_allocate_mystruct

    end module mymodule

EDIT

Модификация интерфейса check_address в соответствии с комментариями некоторых программистов позволила решить проблему.

void check_address(OpaqueObject* oo)
{
    Mystruct *ms = (Mystruct*)(*oo);
    ms->check_address();
}
...