似乎Fortran 90不允许派生数据类型中的命名常量。这是真的? 以下代码不起作用。
program my_prog
implicit none
type :: my_type
integer, parameter :: a = 1
real(kind(1.d0)) :: b
end type my_type
type (my_type) :: complex_type
end program my_prog
编译器在派生类型定义中不允许使用参数语句。
当我删除parameter
关键字时,一切正常。但是,我如何确保组件a
未在其他地方修改?
答案 0 :(得分:5)
使常量(参数)成为主程序的本地实体而不是类型。如果您想要更多地控制常量的标识符的可见性和范围,那么将常量放在模块中。
答案 1 :(得分:5)
根据标准,不允许。 Fortran 2003中的组件属性说明符可能只有pointer
和dimension
(第4.4.1节),另外还有allocatable
(第4.5节) .3),以及Fortran 2008的codimension
和contiguous
(第4.5.4.1节)。
您可以获取文档here。
我遇到了与target
说明符类似的问题,这也是不允许的。
编辑:
为什么不试试private
组件?
module typedef
type :: my_type
integer, private :: a_int = 1
real(kind(1.d0)) :: b
contains
procedure :: a
end type my_type
contains
function a(complex_type)
class(my_type),intent(in) :: complex_type
integer :: a
a = complex_type%a_int
end function
end module
program my_prog
use typedef
implicit none
type (my_type) :: complex_type
complex_type%b = 2.d0 ! This should work
write(*,*) complex_type%a(), complex_type%b
! complex_type%a_int = 3 ! This should fail
end program my_prog
答案 2 :(得分:3)
问题是:你为什么要这样做?
想象一下,您想要创建一个包含1000个值my_type
的数组。结果是,a
的值将被存储1000次。这浪费了近4kb的内存(假设int4
)。更好的方法是在相应的模块中定义参数。
顺便说一句,在Clerman and Spector的 Modern Fortran 一书中,规则编号133指出,您应该在自己的模块中定义每个派生类型。对于这样一个常数,这将是一个很好的地方。
答案 3 :(得分:1)
您可以将其定义为private并生成get()函数,但不能生成set()函数。 通过这种方式,您的数据将得到很好的封装。