嗯,Fortran 被设计为数学语言。我进行了一些挖掘,发现了 Fortran 中的以下几点。
在解释要点之前先做一些解释:
我的子例程必须使用第一级数组。我在子例程开始时调用第二级数组作为输入。然后,我需要将排名从第二更改为第一。稍后在子例程中,我需要将等级更改回 2。这种等级更改在代码中发生了 3-4 次。
- USING 等价陈述:
这是最快的方法。记忆中没有任何改变,我认为这是最好的。但是,它以我的问题的属性冲突错误结束,因为我正在子例程内工作。
- Using Pointer属性 :
我努力了pointer然后。但是,似乎不可能将第二级数组重新映射到第一级数组。将第一级数组重新映射到第二级数组效果很好。
我编写的简单代码是将第一级数组重新映射到第二级数组:
program ptrtest
real, pointer :: a(:)
real, pointer :: b(:,:)
allocate(b(1:2,1:3))
b = transpose(reshape((/ 1, 2, 3, 4, 5, 6 /), shape(b)))
a(1:6) => b(:,:)
WRITE(*,*) a(4), b(2,2) ! to see if the remapped elements are same?
end program ptrtest
我收到的错误:
gfortran -Wall -o "POINTER" "POINTER.f90" (in directory: /home/vahid/Desktop)
POINTER.f90:12.14:
a(1:6) => b(:,:)
1
Error: Rank remapping target must be rank 1 or simply contiguous at (1)
Compilation failed.
-
RESHAPE陈述:
能够进行任何类型转换的最慢方法。基本上,它为转换的元素分配另一个内存位置,考虑到内存效率和处理成本,这是昂贵的。
因此,Fortran 2003 手册指出:(第 2.2.4 和 5.2 节)
数据对象的大小、形状、类型或长度类型参数可以是动态的,但排名或种类类型参数不是动态的。
我不知道后果,但我认为数组的等级也应该是动态的。如有部分错误请指正。