这是我的代码:
Program Arrays_0
Implicit none
Integer :: i , Read_number , Vig_Position , Vipg_Position , n_iter
Integer , parameter :: Br_gra = 12
Integer , parameter , dimension ( Br_gra ) :: Vig = [ ( i , i = 1 , Br_gra) ]
Integer , parameter , dimension ( Br_gra ) :: Vipg = [ 0 , 1 , 1 , 1 , 2 , 2 , 3 , 4 , 4 , 7 , 7 , 7 ]
Integer :: Result_of_calculation
Write(*,*)"Enter the number (From 1 to Br_gra):"
Read(*,*) Read_number
Vig_Position = Vig(Read_number)
Vipg_Position = Vipg(Vig_Position)
!K_str( Vig_Position_temp ) = Vig_Position_temp + 2.3
n_iter = 0
Result_of_calculation = Vig_Position
Do while( Vipg_Position .ne. Vipg(1) )
n_iter = n_iter + 1
Vig_Position = Vipg_Position
! K_str( Vig_Position_temp ) = Vig_Position_temp + 2.3
Result_of_calculation = Result_of_calculation + Vig_Position
Vipg_Position = Vipg(Vig_Position)
End Do
Write(*,'(a,1x,i0)')"The number of iteration is:",n_iter
Write(*,'(a,1x,i0)')"The result of calculation is:",Result_of_calculation
End Program Arrays_0
如果我想对n_iter
和Result_of_calculation
进行计算,代码没有问题,但我对K_str
的声明方式有问题,可以正确使用这两个变量(我在计算中使用这个变量的意图在评论中显示)。
所以问题是如何声明,例如,Read_number
是12?
在那种情况下,我有:K_str(12), K_str(7), K_str(3) and K_str(1)
。
我能做的是:
Real, dimension (Br_gra):: K_str
但在这种情况下,必须为Vig
的所有元素再导入一个循环(12计算)。我想防止这个数量的计算,在这种情况下,我希望我的代码只进行4次计算。
怎么做?
答案 0 :(得分:0)
所以你想得到一个数组,例如从索引1开始,在索引12结束,但不包含其中的所有索引,只是其中的一部分?
使用Fortran阵列是不可能的。实际上,我所知道的任何其他语言的数组都不可能。
可以使用字典数据结构来实现类似的东西,这在某些语言中是固有的,但不是Fortran。 Fortran中有类似数据结构的外部库。见http://fortranwiki.org/fortran/show/Hash+tables
您还可以使用具有所有常见缺点和优点的链接列表(无直接索引等)。
除非您需要一些非常大范围的索引,比您的示例大得多,否则请使用包含所有索引的常规数组。
您还可以使用一个包含数据(索引为1到4)的数组和另一个相同大小的数组,它们将包含全局位置(1,3,7和12)。或者是具有这两个组件的派生类型。但它与你提议的用法不同。