2014-11-04 1 views
0

У меня есть код, в который я ввожу каждый номер на новую строку, пока не напишу 0. Я смущен размером массива. В начале я объявляю, что A - массив с индексами от 1 до 5. Но когда я продолжаю писать и помещать более 5 чисел, кажется, что он все еще сохраняется, а затем используется вторым во время цикла. Как это возможно? Я думал, что если у меня закончится индексы, я получу ошибку.Pascal - размер массива

program testarray; 
var hmez,        
    i:integer;       
    A:array [1..5] of integer; 

begin 
i:=0; 
    repeat            
    inc(i); 
    readln(A[i]); 
    if A[i]=0 then hmez:=i-1; 
    until A[i]=0; 
for i:=1 to hmez do 
    writeln(A[i]); 
end. 

ответ

3

Вы переписываете память, которая не принадлежит переменной A. Это рано или поздно вызовет необработанное исключение (ошибка времени выполнения) или любое другое «странное» поведение, вызванное утечкой памяти. В отличие от «управляемых» языков, таких как C# или Java в Pascal, проверка времени индексов массива является необязательной функцией, а не обязательной, принудительной, языковой функцией.

Компиляторы Pascal обычно имеют возможность включать или выключать проверку индекса массива, которая называется «проверка диапазона». Директива {$R+} включает эти проверки диапазона - см. documentation here.

В вашем случае код «работает», потому что, вероятно, нет другой полезной переменной, помещенной в память после пространства, выделенного для A. Обратите внимание, что это всего лишь совпадение, и, возможно, это не так во всех программах вашей программы. Как правило, ваша программа as-is неверна.

+0

спасибо, поэтому вы предлагаете включить проверку диапазона, чтобы сделать мою программу правильной? – cgnx

+0

Вы должны проверить, действительно ли индекс действителен в вашем коде. Проверки диапазона с использованием компилятора являются защитной сетью. Однако, да, вы обязательно должны включить их в любое время. –

+0

Ваша программа неверна в вашей природе. Проверка поворотных диапазонов не приведет к правильности; это позволит вам точно знать, что это неверно. –