Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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_Gfortran - Fatal编程技术网

Fortran 每次迭代的变量值

Fortran 每次迭代的变量值,fortran,gfortran,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 , dimensi

这是我的代码:

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)

   n_iter = 0

   Result_of_calculation = Vig_Position

   Do while( Vipg_Position .ne. Vipg(1) )

      n_iter = n_iter + 1

      Vig_Position = Vipg_Position

      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
目的是在变量的每次迭代中获得值:
Vig\u位置、Vig\u计算结果和Vipg\u位置
。 如何为这种计算声明变量? 一般来说,是否有其他方法计算迭代次数?
在代码设置类似于计算结果的数值之前,如何在迭代次数的函数中声明变量?

问题已经澄清,下面是用Fortran解决该问题的典型方法。这不是唯一可能的方法,但却是最普遍的方法。例程resize中将旧大小加倍的策略是合理的-您希望将调用次数最小化。示例程序中的数据集很小,因此为了显示效果,我首先将数组分配得非常小。事实上,您可能需要一个相当大的初始分配(比如,至少100个)

请注意,使用了从其主机继承VAL\u t类型的内部过程

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

! Declare a type that will hold one iteration's values
type vals_t
    integer Vig_Position
    integer Vipg_Position
    integer Result_of_calculation
end type vals_t
! Declare an allocatable array to hold the values
! Initial size doesn't matter, but should be close
! to a lower limit of possible sizes
type(vals_t), allocatable :: vals(:)
allocate (vals(2))

Write(*,*)"Enter the number (From 1 to Br_gra):"
Read(*,*) Read_number

Vig_Position = Vig(Read_number)
Vipg_Position = Vipg(Vig_Position)

   n_iter = 0

   Result_of_calculation = Vig_Position

   Do while( Vipg_Position .ne. Vipg(1) )

      n_iter = n_iter + 1

      Vig_Position = Vipg_Position

      Result_of_calculation = Result_of_calculation + Vig_Position

      Vipg_Position = Vipg(Vig_Position)

      ! Do we need to make vals bigger?
      if (n_iter > size(vals)) call resize(vals)
      vals(n_iter) = vals_t(Vig_Position,Vipg_Position,Result_of_calculation)

   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

! Now vals is an array of size(vals) of the sets of values
! For demonstration, print the size of the array and the values
Write(*,'(a,1x,i0)')"Size of vals is:", size(vals)
Write(*,'(3i7)') vals(1:n_iter)

    contains
    ! Subroutine resize reallocates the array passed to it
    ! with double the current size, copies the old data to
    ! the new array, and transfers the allocation to the
    ! input array
    subroutine resize(old_array)
    type(vals_t), allocatable, intent(inout) :: old_array(:)
    type(vals_t), allocatable :: new_array(:)

    ! Allocate a new array at double the size
    allocate (new_array(2*size(old_array)))
    write (*,*) "Allocated new array of size ", size(new_array)

    ! Copy the data
    new_array(1:size(old_array)) = old_array

    ! Transfer the allocation to old_array
    call MOVE_ALLOC (FROM=new_array, TO=old_array)

    ! new_array is now deallocated

    return
    end subroutine resize

End Program Arrays_0
样本输出:

 Enter the number (From 1 to Br_gra):
12
 Allocated new array of size            4
The number of iteration is: 3
The result of calculation is: 23
Size of vals is: 4
      7      3     19
      3      1     22
      1      0     23

声明一个足够大的数组以容纳预期的迭代次数没有“预期的迭代次数”。这个数字在程序开始时是未知的。你不需要知道这个数字,只需要知道一个上限。如果迭代次数可能会占用计算机内存,您应该在问题中详细说明。您能为此代码编写建议吗?
real::saveresult(10000)
saveresult(n_iter)=计算结果