声明在边界之间具有非线性功能的一维数组

时间:2017-10-28 13:18:14

标签: fortran gfortran

这是我的代码:

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_iterResult_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次计算。

怎么做?

1 个答案:

答案 0 :(得分:0)

所以你想得到一个数组,例如从索引1开始,在索引12结束,但不包含其中的所有索引,只是其中的一部分?

使用Fortran阵列是不可能的。实际上,我所知道的任何其他语言的数组都不可能。

可以使用字典数据结构来实现类似的东西,这在某些语言中是固有的,但不是Fortran。 Fortran中有类似数据结构的外部库。见http://fortranwiki.org/fortran/show/Hash+tables

您还可以使用具有所有常见缺点和优点的链接列表(无直接索引等)。

除非您需要一些非常大范围的索引,比您的示例大得多,否则请使用包含所有索引的常规数组。

您还可以使用一个包含数据(索引为1到4)的数组和另一个相同大小的数组,它们将包含全局位置(1,3,7和12)。或者是具有这两个组件的派生类型。但它与你提议的用法不同。