Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 如何循环遍历不同类型的变量,这些变量的名称只相差一个尾随数字_Fortran - Fatal编程技术网

Fortran 如何循环遍历不同类型的变量,这些变量的名称只相差一个尾随数字

Fortran 如何循环遍历不同类型的变量,这些变量的名称只相差一个尾随数字,fortran,Fortran,我试图更好地理解这类规范,所以我编写了以下程序 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)

我试图更好地理解
这类规范,所以我编写了以下程序

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
程序运行得很好。然而,我的问题不是关于种类的。我的问题是关于使用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
,然后
a2
:您将发现其他有关这方面的问题

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

integer, parameter :: kinds(2) = [.., ..]
real(kinds(1)) :: a1
real(kinds(2)) :: a2
也就是说,可以使用命名常量(参数)数组的元素作为种类参数

对于那些查询函数,因为我们不是在循环中选择
a1
a2
,让我们看看未命名的东西(毕竟,重要的只是类型和参数)

然而,这是有效的,因为当
i
是有效的种类选择器时,
kind(real(1,i))
就是
i

在更一般的循环情况下,不只是您想要的种类编号,而是具有这些种类参数的类型属性,您需要循环构造每种类型的对象。您希望使用
real(1,种类(i))
这是一个问题<代码>种类(i)
不是常量表达式,因为
i
不是常量表达式,因此不是有效的种类选择器

同样,不能有一个看起来像
1.\u kinds(i)
的文本


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

如果我把它弄得更复杂怎么办。比如:
print*,“a?=”,a?,“kind=”kinds(i)
这应该是一个全新的问题吗?我/我们是否应该编辑该问题?对不起,我还是有点新的堆栈溢出。感谢您的耐心。对于“我如何才能通用/动态引用不同类型/类型的
a1
a2
”,是的,这可能是一个新问题。只是因为答案是你不能:如果你可以,这已经是这个问题的答案,作为你想要的方法。但一定要仔细搜索,因为这方面已经有问题了。(恐怕现在没有链接。)。嗯,有多态性,但在这种情况下,它实际上对你没有帮助。你也可以选择类似于in的东西。我很想建议复制,但我认为有一些不同,或背景缺失。
do i=1, 2
  print *, "Kind = ", kinds(i)  ! KIND(ai) is just kinds(i)
end do