如何循环遍历不同种类的变量,其名称只有一个尾随数字

时间:2015-07-02 20:16:49

标签: fortran

我正在努力更好地理解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

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

你将遇到循环方法的一个问题:当你使用一个时,一个类型的选择器必须是常量表达式。我会忽略这样一个事实,即您无法进行动态变量选择,例如构建ai,因为您需要a1然后a2:您&#39 ;我会找到其他问题。

一种诱人的方法是使用数组作为种类参数。这在某种程度上是好的:

integer, parameter :: kinds(2) = [.., ..]
real(kinds(1)) :: a1
real(kinds(2)) :: a2

也就是说,您可以使用命名常量(参数)数组的元素作为种类参数。

对于那些查询功能,由于我们未在循环中选择a1a2,因此请查看未命名的内容(它只是类型和毕竟重要的参数。

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)的文字。

总之,直观地说,您希望查询编译时已知的属性,但使用循环来保存代码。该循环本质上是一个可执行的东西。