【问题标题】:Fortran 2008 - array variable in classFortran 2008 - 类中的数组变量
【发布时间】:2018-06-03 19:53:01
【问题描述】:

我有一个以下类,我需要在其中存储 neuron_tconnection_t 类型的对象。

!> 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), 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

end type net_t

interface net_t
    !> Constructor of net_t class
    !! Loads complete info about network from file
    !! @param[in] filepath Path to the file with network configuration
    !! @return Returns pointer to the new instance of the class net_t
    module procedure :: new_net_1
end interface net_t

我尝试像这样初始化数组

    allocate(new_obj)

    ! Init object
    do i=1,5
        new_obj%neuron_arr(i) =  mock_neuron_t()
    end do

但我收到以下错误:

         new_obj%neuron_arr(i) =  mock_neuron_t()
        1
Error: Nonallocatable variable must not be polymorphic in intrinsic assignment at (1) - check that there is a matching specific subroutine for '=' operator

你知道,我做错了什么吗? mock_neuron_t 扩展了neuron_t 类型,所以应该没问题。

编辑:

neuron_tconnection_t 类都是抽象的,所以在添加 allocate(new_obj%neuron_arr) 后我现在收到以下错误:

     allocate(new_obj%neuron_arr)
             1
Error: Allocating new_obj of ABSTRACT base type at (1) requires a type-spec or source-expr

         new_obj%neuron_arr(i) =  mock_neuron_t()
        1
Error: Nonallocatable variable must not be polymorphic in intrinsic assignment at (1) - check that there is a matching specific subroutine for '=' operator

【问题讨论】:

标签: arrays fortran fortran2008


【解决方案1】:

您不能只在内部赋值 (=) 中赋值给多态变量。您只能对可分配变量执行此操作,并且数组元素不是可分配变量,即使它是可分配数组的一部分。请记住所有数组元素必须具有相同的动态类型

因此,如果您想让neuron_arr(:) 的不同元素具有不同的类型,这是不允许的。

但是您可以将数组分配给某个单一类型并使用select type 类型保护。

allocate(new_obj)

allocate(new_obj%neuron_arr)  !this allocates it to the declared type neuron_t!

! Init object
select type(a => new_obj%aneuron_arr)
  type is(neuron_t)
    do i=1,5
      a(i) =  mock_neuron_t()
    end do
end select

但是,如果你总是有一种固定类型,type(neuron_t) 就足够了吗?

【讨论】:

  • 非常感谢!老实说,我认为class(neuron_t) 会将其类型牢牢设置为neuron_t...而我不能使用type(neuron_t),因为neuron_t 是一个抽象类。
  • 那么您必须将分配语句中的数组分配给正确的类型,并在select type 中使用该类型。但我担心你的设计是错误的。数组必须一次分配给一种常见的非抽象类型)。 alocate(the_type :: the_array(size))
  • 我已经尝试过了(请参阅我的问题中的编辑 2),但我遇到了分段错误...我真的不知道,现在出了什么问题...
  • 谁知道呢,我认为这应该是一个新问题,新minimal reproducible example
  • 我发现了错误——mock_neuron_t 构造函数返回的是指针而不是实例本身。请将此信息插入您的答案中,我认为它值得被接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 2018-11-07
  • 2019-05-29
相关资源
最近更新 更多