Ded*_*tos 5 fortran gfortran sunstudio
当使用GNU Fortran(v4.4.3)或Sun Studio F95(v8.3)进行编译且没有数组界限时,检查以下程序是否正确运行。但是,当分别打开数组边界检查(gfortran -fbounds-check和f95 -C)时,GNU编译的可执行文件将再次运行而不会出现错误,而Sun Studio编译的可执行文件会给出运行时错误,
****** FORTRAN RUN-TIME SYSTEM ******
Subscript out of range. Location: line 44 column 20 of 'nosize.f90'
Subscript number 2 has value 1 in array 't$27'
Run Code Online (Sandbox Code Playgroud)
这是对的错误,该调用sub2()使用的自动数组虚拟参数x。该sub1()呼叫运行罚款或者编译器和任何标志。
据我所知,该程序是“合法的”,因为零大小的数组可以像非零大小的数组一样被引用,并且没有零长度维的显式索引x。但是,我在这里缺少一些零尺寸的数组切片或自动数组的微妙之处吗?我是否应该期望数组边界检查在不同的编译器中表现相同,还是应该将其视为特定于供应商的扩展?
MODULE subs
IMPLICIT NONE
CONTAINS
SUBROUTINE sub1(x)
IMPLICIT NONE
REAL :: x(:,:)
PRINT*,'------------------------------------'
PRINT*,SHAPE(x)
PRINT*,SIZE(x)
END SUBROUTINE sub1
SUBROUTINE sub2(n1,n3,x)
IMPLICIT NONE
INTEGER,INTENT(in) :: n1, n3
REAL :: x(n1,n3)
PRINT*,'------------------------------------'
PRINT*,SHAPE(x)
PRINT*,SIZE(x)
END SUBROUTINE sub2
END MODULE subs
PROGRAM nosize
USE subs
IMPLICIT NONE
INTEGER :: n1 = 2, n2 = 2, n3 = 0
REAL,ALLOCATABLE :: x(:,:,:)
ALLOCATE(x(n1,n2,n3))
x(:,:,:) = -99.9
PRINT*,'ALLOCATED? ',ALLOCATED(x)
PRINT*,'SHAPE =',SHAPE(x)
PRINT*,'SIZE =',SIZE(x)
PRINT*,'X =',x
CALL sub1(x(:,1,:))
CALL sub2(n1,n3,x(:,1,:))
END PROGRAM nosize
Run Code Online (Sandbox Code Playgroud)
使用 -check 边界的 intel fortran 编译器不会出现任何问题;根据我的经验,IBM 的 xlf 非常严格,也没有抱怨 -qcheck。
但更广泛地说,是的,对于边界检查应该做什么或不应该做什么没有标准。我当然可以理解为什么有些编译器会将零长度数组的赋值标记为坏/错误/奇怪;这是一个奇怪的极端情况。
| 归档时间: |
|
| 查看次数: |
5202 次 |
| 最近记录: |