我试图更好地理解 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
有什么建议吗?
最佳答案
使用循环方法时,您将遇到一个问题:当您使用类型选择器时,它必须是一个常量表达式。我将忽略这样一个事实,即您无法进行动态变量选择,例如构造ai
,因为您将其先是a1
,然后是a2
:您会发现与此相关的其他问题。
一个诱人的方法是使用数组作为类型参数。这在某种程度上是好的:
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
但是,这是有效的,因为当 i
是一个时, kind(real(1,i))
只是 i
有效的种类选择器。
在更一般的循环情况下,它不仅需要您想要的类型编号,还需要具有这些类型参数的类型的属性,您希望循环构造每种类型的对象。你想要一些带有 real(1,kinds(i))
的东西,这是一个问题。 kinds(i)
不是常量表达式,因为 i
不是,因此不是有效的种类选择器。
同样,您不能拥有类似于 1._kinds(i)
的文字。
总之,直观上您希望查询编译时已知的属性,但使用循环来保存代码。不过,该循环本质上是一个可执行的东西。
关于fortran - 如何循环访问不同类型且名称仅尾随数字不同的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31193887/