我正在努力更好地理解kind
规范,所以我编写了以下程序。
program main
implicit none
real(kind = selected_real_kind(1)) :: a1
real(kind = selected_real_kind(2)) :: a2
print *, "Kind = ", kind(a1), "Range = ", range(a1)
print *, "Kind = ", kind(a2), "Range = ", range(a2)
end program main
该计划运行良好。但是,我的问题不是kind
。我的问题是关于使用do循环。我想让这个项目更大,但我不想一遍又一遍地写出声明和印刷声明。
我不认为我对声明有很多选择。我想我一定要一次写出来。这是对的吗?
但是,我认为有一种方法可以为print语句使用do循环。也许是这样的:
program main
implicit none
integer :: i
real(kind = selected_real_kind(1)) :: a1
real(kind = selected_real_kind(2)) :: a2
do i = 1, 2
print *, "Kind = ", kind(ai), "Range = ", range(ai)
end do
end program main
有什么建议吗?
答案 0 :(得分:2)
你将遇到循环方法的一个问题:当你使用一个时,一个类型的选择器必须是常量表达式。我会忽略这样一个事实,即您无法进行动态变量选择,例如构建ai
,因为您需要a1
然后a2
:您&#39 ;我会找到其他问题。
一种诱人的方法是使用数组作为种类参数。这在某种程度上是好的:
integer, parameter :: kinds(2) = [.., ..]
real(kinds(1)) :: a1
real(kinds(2)) :: a2
也就是说,您可以使用命名常量(参数)数组的元素作为种类参数。
对于那些查询功能,由于我们未在循环中选择a1
和a2
,因此请查看未命名的内容(它只是类型和毕竟重要的参数。
do i=1, 2
print *, "Kind = ", kinds(i) ! KIND(ai) is just kinds(i)
end do
但是,由于kind(real(1,i))
只是i
的关系,i
是有效的种类选择器,这种情况起作用。
在更一般的循环情况下,它不仅仅是您想要的类型数,而是具有这些类型参数的类型的属性,您希望循环构造每种类型的对象。您喜欢real(1,kinds(i))
的内容,这是一个问题。 kinds(i)
不是常量表达式,因为i
不是,因此不是有效的种类选择器。
同样,您不能拥有类似1._kinds(i)
的文字。
总之,直观地说,您希望查询编译时已知的属性,但使用循环来保存代码。该循环本质上是一个可执行的东西。