Fortran 2008 - пользовательская процедура ввода /вывода для CLASS (*)

Я пытаюсь создать тип, который будет служить оберткой для произвольных других типов, поэтому я мог бы создать гетерогенный массив, как рекомендуется в Гетерогенный массив классов Fortran и Создание гетерогенных массивов в Фортране .

Итак, я попытался реализовать это так:

module m
implicit none

type :: container
    class(*), pointer, public :: item
end type container
end module m

program mwe 
use m

implicit none

type(container) :: cont
integer, target :: i

i = 5 
cont = container(i)

write(*,*) cont%item

end program mwe 

Теперь я получаю ошибку

test4.f90(20): error #5513: A polymorphic I/O list item requires a user-defined derived-type input/output procedure.
    write(*,*) cont%item
----^
compilation aborted for test4.f90 (code 1)

Поэтому я попытался реализовать ввод /вывод следующим образом:

module m
    implicit none

    type :: container
        class(*), pointer, public :: item
    contains
        procedure :: write_sample => write_container_sample_impl
        procedure :: read_sample  => read_container_sample_impl

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

contains

    subroutine write_container_sample_impl(this, unit, iostat, iomsg)
        class(container), intent(in)    :: this
        integer, intent(in)         :: unit
        integer, intent(out)        :: iostat
        character(*), intent(inout) :: iomsg

        write(unit, iostat=iostat, iomsg=iomsg) this%item
    end subroutine write_container_sample_impl

    subroutine read_container_sample_impl(this, unit, iostat, iomsg)
        class(container), intent(inout) :: this
        integer, intent(in)         :: unit
        integer, intent(out)        :: iostat
        character(*), intent(inout) :: iomsg

        read(unit, iostat=iostat, iomsg=iomsg) this%item
    end subroutine read_container_sample_impl

end module m

program mwe 
    use m

    implicit none

    type(container) :: cont
    integer, target :: i

    i = 5 
    cont = container(i)

    write(*,*) cont%item

end program mwe 

Но такая же ошибка возникает даже в моих новых методах:

test4.f90(22): error #5513: A polymorphic I/O list item requires a user-defined derived-type input/output procedure.
        write(unit, iostat=iostat, iomsg=iomsg) this%item
--------^
test4.f90(31): error #5513: A polymorphic I/O list item requires a user-defined derived-type input/output procedure.
        read(unit, iostat=iostat, iomsg=iomsg) this%item
--------^
test4.f90(47): error #5513: A polymorphic I/O list item requires a user-defined derived-type input/output procedure.
    write(*,*) cont%item
----^

Итак, у меня есть два вопроса :

  1. Как мне правильно это реализовать?
  2. Лучше /проще объявить переменную item в качестве указателя или в качестве размещаемой переменной?
4 голоса | спросил Eenoku 6 J0000006Europe/Moscow 2018, 13:04:22

2 ответа


0
Работа с неограниченным количеством полиморфных объектов требует усилий.Добавление определенных процедур ввода /вывода для типа контейнера не решит вашу проблему, потому что проблема не в самом контейнере.Вместо этого это компонент контейнера, который является полиморфным и требует определенной процедуры ввода /вывода.К сожалению, хотя, поскольку этот компонент является неограниченно полиморфным, определить такую ​​процедуру невозможно.1Кроме того, определенные вами процедуры ввода /вывода для типа контейнера фактически не будут использоваться.Вы определили процедуры только для неформатированного ввода и вывода, но ---- +: = 0 =: + ---- это форматированный вывод.Что касается того, как вы можете решить эту проблему: в какой-то момент вы должны решить, какова ваша неограниченная полиморфная сущность.Одна из причин, по которой работа с неограниченными полиморфными объектами является хитрой, заключается в том, что внутренние и производные типы не могут обрабатываться одинаково.Как и в предыдущем вопросе, если вы можете использовать ---- +: = 1 =: + ---- вместо ---- +: = 2 =: + ----, вы найдете жизнь проще.С такими вещами, как они есть, ---- +: = 3 =: + ---- , вероятно, ваша лучшая надежда.1 Определенные процедуры ввода /вывода могут существовать только для производных типов.
ответил francescalus 6 J0000006Europe/Moscow 2018, 13:40:57
0
То, как я реализовал нечто подобное, было такимПроцедуры были определены такПроверьте этот репозиторий, так как он реализует контейнерный класс и использует его в абстрактном гетерогенном массиве.Как только вы извлечете содержимое массива, я боюсь, что вы не сможете обойтись с печатниками, это Fortran для вас.Если вы найдете способ, пожалуйста, дайте мне знать.
ответил RBC 7 J0000006Europe/Moscow 2018, 00:32:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132