Fortran 2008 - хранить класс с выделяемыми свойствами с использованием двоичного потока

у меня есть класс

!> Class representing a general network
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), выделяемый :: connection_arr(:) !‹ Массив всех соединений

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

end type net_t

Он содержит несколько массивов (размещаемых переменных), которые размещаются в конструкторах (модульных процедурах).

Мне нужно сохранить класс или его свойства, по крайней мере, в бинарный файл. Я попытался сделать это, реализовав метод сохранения:

!> Saves the network instance to the Fortran binary file
subroutine save_net_bin_impl(this, filename)
    type(net_t), intent(in)      :: this      !< Instance of the class 'net_t'
    character(len=*), intent(in) :: filename  !< Name of the file, where the net will be saved into

    open(unit=11, file=filename, form="unformatted", access='stream', position='append')
    write(11) this
    close(unit=11)
end subroutine save_net_bin_impl

Но я получаю следующую ошибку:

     procedure :: save_net_bin => save_net_bin_impl
             1
Error: Non-polymorphic passed-object dummy argument of ‘save_net_bin_impl’ at (1)

Я понимаю, что причиной моей проблемы являются выделяемые переменные, но я понятия не имею, как правильно решить эту проблему. Не могли бы вы помочь мне с сохранением этого класса? write(11) this 1 Error: Элемент передачи данных в (1) не может иметь ALLOCATABLE компоненты, если он не обрабатывается определенной процедурой ввода/вывода

     read(11) new_obj
                    1
Error: Data transfer element at (1) cannot have ALLOCATABLE components unless it is processed by a defined input/output procedure

person Eenoku    schedule 04.06.2018    source источник
comment
Вы можете найти этот вопрос связанный.   -  person francescalus    schedule 04.06.2018
comment
Вам придется вручную создать процедуру «записи», которая выводит каждый компонент производного типа, включая, возможно, формы массивов. Если бы вы инициализировали тип только для одного процесса в MPI, вам пришлось бы сделать то же самое для MPI_BCAST.   -  person Ross    schedule 04.06.2018