问题描述
我想使用子例程 sum_real 访问数组派生类型中数组的元素.即:对所有人的权重中的第一个条目求和.
I would like to access the the elements of an array in a an arrayed derived type using the subroutine sum_real. That is: sum over first entry in the weight for all people.
type my_type
real, dimension(:), allocatable :: weight
real :: total_weight
end type my_type
type (my_type), dimension (:), allocatable :: people
type (my_type) :: answer
allocate (people (2))
allocate (people (1)%weight(2))
allocate (people (2)%weight(2))
people (1) % weight(1) = 1
people (2) % weight(1) = 1
people (1) % weight(2) = 3
people (2) % weight(2) = 3
call sum_real ( people (:) % weight(1), answer % total_weight )
我想做的类似于在派生类型数组中找到的答案:选择条目,除了我在数组派生类型而不是单个元素中分配了一个数组.
What I want to do is similar to the answer found in Array of derived type: select entry, except for the fact that I have an allocated array in an arrayed derived type instead of an single element.
但是,我收到一个编译器错误:
But, I get a compiler error:
error #7828: The part-name to the right of a part-ref with nonzero rank has the ALLOCATABLE attribute (6.1.2). [WEIGHT]
推荐答案
如果您的组件是可分配的,那么您的尝试是不可能的.引用(6.1.2
)其实是引用了官方的标准文档,禁止这样做.
What you try is not possible if your component is allocatable. The reference (6.1.2
) is actually a reference to the official standard documents, which prohibits this.
原因很简单,可分配的组件(标量或数组)存储在与派生类型本身不同的内存部分.因此如果你写
The reason is simple, the allocatable components (scalar or arrays) are stored in a different part of memory than the derived type itself. Therefore if you write
sum(people%total_weight)
或
people%total_weight = 0
没问题,total_weight
不可分配,它存储在派生类型中,编译器只是进入一个简单的循环并将一个又一个字段设置为零.可以事先知道每个%totalweight
的地址.
it is no problem, total_weight
is not allocatable, it is stored within the derived type and the compiler just goes in a simple loop and sets one field after another to zero. You can know the address of each %totalweight
beforehand.
另一方面
sum(people%weight)
或
people%weight = 0
每个 %weight
都存储在别处,您没有任何简单的公式来计算每个 %weight(i)
的位置.
each %weight
is stored elsewhere and you don't have any simple formula to compute where is each %weight(i)
.
解决方案是,如果可能,固定数组的大小
The solution is either, to fix the size of the array, if possible
real, dimension(2) :: weight
或使用 do 循环
s = 0
do i = 1, size(people)
S = S + sum(people(i)%weight)
end do
这篇关于错误:具有非零等级的部件引用右侧的部件名称具有 ALLOCATABLE 属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!