fortran - 如何循环访问不同类型且名称仅尾随数字不同的变量

标签 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

有什么建议吗?

最佳答案

使用循环方法时,您将遇到一个问题:当您使用类型选择器时,它必须是一个常量表达式。我将忽略这样一个事实,即您无法进行动态变量选择,例如构造ai,因为您将其先是a1,然后是a2:您会发现与此相关的其他问题。

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

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

但是,这是有效的,因为当 i 是一个时, kind(real(1,i)) 只是 i有效的种类选择器。

在更一般的循环情况下,它不仅需要您想要的类型编号,还需要具有这些类型参数的类型的属性,您希望循环构造每种类型的对象。你想要一些带有 real(1,kinds(i)) 的东西,这是一个问题。 kinds(i) 不是常量表达式,因为 i 不是,因此不是有效的种类选择器。

同样,您不能拥有类似于 1._kinds(i) 的文字。

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

关于fortran - 如何循环访问不同类型且名称仅尾随数字不同的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31193887/

相关文章:

c++ - 我如何向只用 Fortran 77 编码的人解释面向对象的编程?

fortran - 用户定义通信器的 MPI 减少

fortran - 现代 Fortran 等效于嵌套 DO 和 GO TO 共享的操作语句

c++ - 在 Mac OS X 上构建 Trilinos(科学计算库)时遇到问题

macros - Fortran 使用宏替换子例程名称

fortran - 求解二次方程但得到奇怪的错误

python - 计算 shell 脚本中矩阵中沿行和列而非对角线连接的非零数的数量

c++ - FORTRAN 中的 POINTER 关键字相当于 C/C++ 中的 POINTER 关键字

compiler-errors - 更改续行限制的 Fortran 77 选项出现问题

fortran - 梯形规则的问题