1

我有以下课程

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实例本身的复制。

4

0 回答 0