Fortran 2008 - Пользовательский ввод / вывод класса, содержащий указатели - PullRequest
0 голосов
/ 04 июня 2018

У меня есть следующий класс

type :: net_t
    private

    character(:), allocatable                 :: net_type              !< Type of the net
    integer(kind=integer_4neuro)              :: num_of_neurons        !< Number of neurons in the net
    character(:), allocatable                 :: training_method       !< Used training method

    class(neuron_t), allocatable              :: neuron_arr(:)         !< Array containing all neurons
    integer(kind=integer_4neuro), allocatable :: input_neuron_arr(:)   !< Array of input neuron indices
    integer(kind=integer_4neuro), allocatable :: output_neuron_arr(:)  !< Array of output neuron indices
    class(connection_t), allocatable          :: connection_arr(:)     !< Array of all connections

contains
    !> Prints information about the network to the standard output.
    procedure :: print_info => print_info_impl

    !> Saves the network instance to the Fortran binary file
    procedure :: save_net_bin => save_net_bin_impl

    !> Implementation of write function enabling the storage of
    !! allocatable arrays.
    procedure :: write_sample => write_sample_impl

    !> Implementation of read function enabling to read
    !! the whole instance of net_t stored as binary file.
    procedure :: read_sample  => read_sample_impl

    generic   :: write(unformatted) => write_sample
    generic   :: read(unformatted) => read_sample
end type net_t

Мне нужно реализовать свой собственный write и прочитать functions, чтобы иметь возможность сериализовать экземпляры net_t, поскольку он содержит размещаемые массивы.

Я пытался реализовать функцию write следующим образом:

subroutine write_sample_impl(this, unit, iostat, iomsg)
    class(net_t), intent(in)    :: this
    integer, intent(in)         :: unit
    integer, intent(out)        :: iostat
    character(*), intent(inout) :: iomsg
    integer                     :: i !< Counter

    ! Write a record giving sizes for the allocation
    write(unit, iostat=iostat, iomsg=iomsg) SIZE(this%neuron_arr), &
                                            SIZE(this%input_neuron_arr), &
                                            SIZE(this%output_neuron_arr), &
                                            SIZE(this%connection_arr)
    write(unit, iostat=iostat, iomsg=iomsg) (this%neuron_arr(i)%get_id(), &
                                             this%neuron_arr(i)%get_potential(), &
                                             this%neuron_arr(i)%get_state(), &
                                             i=1,SIZE(this%neuron_arr)), &
                                            this%input_neuron_arr, &
                                            this%output_neuron_arr, &
                                            (this%connection_arr(i)%get_input_neuron(), &
                                             this%connection_arr(i)%get_output_neuron(), &
                                             this%connection_arr(i)%get_weight(), &
                                             i=1,SIZE(this%connection_arr))

end subroutine write_sample_impl

Но теперь возникла другая проблема - я получаю следующую ошибку :

    (this%connection_arr(i)%get_input_neuron(), &
                                             1
Error: Data transfer element at (1) cannot be polymorphic unless it is processed by a defined input/output procedure

    this%connection_arr(i)%get_output_neuron(), &
                                             1
Error: Data transfer element at (1) cannot be polymorphic unless it is processed by a defined input/output procedure

Я вижу проблему в том, что класс connection_t содержит указатели на нейроны, как мы можем видеть здесь:

!> Represents a connection between two neurons.
type, extends(abstract_base_t) :: connection_t
    private 

    class(neuron_t), pointer :: input_neuron   !< Pointer to an input neuron
    class(neuron_t), pointer :: output_neuron  !< Pointer to an output neuron
    real(kind=real_4neuro)   :: weight         !< Weight of the connection

contains
    ! Implementation of methods
end type connection_t

Возможно ли сериализовать указатели таким образом? Я хотел использовать нейроны, чтобы предотвратить копирование neuron_t самих экземпляров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...