Fortran 数组元素在内存中的顺序
Fortran array element order in memory
我用的是在线IDE,好像none支持调试。如果我有一个像下面这样的 4D 数组?如何按元素在内存中的顺序打印数组的所有元素?
Program Hello
integer :: test(2,3,4,5), i1,i2,i3,i4, val;
val = 0
do i1=1,2
do i2=1,3
do i3=1,4
do i4=1,5
test(i1, i2, i3, i4) = val
val = val +1
end do
end do
end do
end do
End Program Hello
Array/matrix Fortran 中的内存按 列 排序,即内存中的连续元素是数组中最左边维度的元素。
您可以通过发送整个数组的 print
或 write
命令来打印整个数组。
在这个例子中,首先我们用增量索引填充一维数组;然后,将它们重新整形为 4D 数组,这样您就可以看到 4D 数组项如何首先递增最左边的维度:
program test_print
use iso_fortran_env, only: output_unit
implicit none
integer :: test(2,3,4,5), global_index(2*3*4*5)
integer :: i,j,k,l
! Fill 1D array with incremental values
forall(i=1:size(global_index)) global_index(i) = i
! Reshape 1D array to 4D
test = reshape(global_index,[2,3,4,5])
! Print whole array to screen
! Should print 1 2 3 4 5 6 7......
print "(*(1x,i0))", test
! This is same as:
write(output_unit,"(*(1x,i0))") test
end program test_print
尝试加载数组后尝试:
Test2 = RESHAPE(Test,/120/)
Do I = 1, 120
WRITE… test2
这会将数组改造成线性向量或一维数组,您可以看到连续数组是如何存储的。
我用的是在线IDE,好像none支持调试。如果我有一个像下面这样的 4D 数组?如何按元素在内存中的顺序打印数组的所有元素?
Program Hello
integer :: test(2,3,4,5), i1,i2,i3,i4, val;
val = 0
do i1=1,2
do i2=1,3
do i3=1,4
do i4=1,5
test(i1, i2, i3, i4) = val
val = val +1
end do
end do
end do
end do
End Program Hello
Array/matrix Fortran 中的内存按 列 排序,即内存中的连续元素是数组中最左边维度的元素。
您可以通过发送整个数组的 print
或 write
命令来打印整个数组。
在这个例子中,首先我们用增量索引填充一维数组;然后,将它们重新整形为 4D 数组,这样您就可以看到 4D 数组项如何首先递增最左边的维度:
program test_print
use iso_fortran_env, only: output_unit
implicit none
integer :: test(2,3,4,5), global_index(2*3*4*5)
integer :: i,j,k,l
! Fill 1D array with incremental values
forall(i=1:size(global_index)) global_index(i) = i
! Reshape 1D array to 4D
test = reshape(global_index,[2,3,4,5])
! Print whole array to screen
! Should print 1 2 3 4 5 6 7......
print "(*(1x,i0))", test
! This is same as:
write(output_unit,"(*(1x,i0))") test
end program test_print
尝试加载数组后尝试:
Test2 = RESHAPE(Test,/120/)
Do I = 1, 120
WRITE… test2
这会将数组改造成线性向量或一维数组,您可以看到连续数组是如何存储的。