gpt4 book ai didi

arrays - 数组索引超出范围

转载 作者:行者123 更新时间:2023-12-03 23:17:51 26 4
gpt4 key购买 nike

如果引用数组元素的索引实际上超出其假定范围,我很困惑 Fortran 如何处理这种情况。

下面是一个简单的代码来说明问题:

PROGRAM test_matrix_out

USE mod_writearray

IMPLICIT NONE
INTEGER :: i,j,m,n
REAL :: k
REAL, Dimension(:,:),ALLOCATABLE :: A

m = 3
n = 4
ALLOCATE(A(m,n))

k = 1

DO i=1,m
DO j=1,n
A(i,j)=k
k=k+1
ENDDO
ENDDO

CALL writearray(A)
WRITE(*,*)
WRITE(*,*) A(1,:)
WRITE(*,*)
WRITE(*,*) A(2,:)
WRITE(*,*)
WRITE(*,*) A(0,:)
WRITE(*,*)
WRITE(*,*) A(4,:)
WRITE(*,*)
WRITE(*,*) A(5,:)
WRITE(*,*)
WRITE(*,*) A(100,:)
WRITE(*,*)
WRITE(*,*) A(:,1)
WRITE(*,*)
WRITE(*,*) A(:,2)
WRITE(*,*)
WRITE(*,*) A(:,0)
WRITE(*,*)
WRITE(*,*) A(:,4)
WRITE(*,*)
WRITE(*,*) A(:,5)
WRITE(*,*)
WRITE(*,*) A(:,100)


DEALLOCATE(A)

END PROGRAM test_matrix_out

它给了我以下结果:
   1.000000       2.000000       3.000000       4.000000

5.000000 6.000000 7.000000 8.000000

0.0000000E+00 9.000000 10.00000 11.00000

2.000000 3.000000 4.000000 0.0000000E+00

6.000000 7.000000 8.000000 0.0000000E+00

0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00

1.000000 5.000000 9.000000

2.000000 6.000000 10.00000

-1.0097448E-28 8.9776148E-39 0.0000000E+00

4.000000 8.000000 12.00000

0.0000000E+00 0.0000000E+00 0.0000000E+00

-3.3631163E-44 1.4293244E-43 0.0000000E+00

为什么会发生这种情况?

最佳答案

当您编写 A(i,j) 时,编译器会计算该内存位置的地址。例如,参见 http://en.wikipedia.org/wiki/Array_data_structure#Multidimensional_arrays .编译器通常不会根据语言规则确定这是否是合法地址。使用超过维度的索引是非法的。不这样做是程序员的责任。 Fortran 的优点之一是能够为这个错误添加运行时检查。传统的说法是运行时下标检查很昂贵,但我在测试时经常发现运行时成本可以忽略不计,有时在程序的生产版本中保留它。

如果您正在读取内存,索引错误的可能后果将是获得错误的值,除非内存位置太远以至于它在属于程序的内存之外,这会产生错误。如果您正在写入内存,您将破坏数组中其他地方的内存,这些内存属于某个其他变量,或属于程序的内部数据结构。见 what kind of problems can lack of deallocation cause?对于索引错误导致程序运行时问题的示例问题。

关于arrays - 数组索引超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11553258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com