Судя по вашему комментарию, вы немного запутались.
Короче говоря, если вы объявляете параметр процедуры как «массив», массив всегда начинается с нуля, независимо от структуры массива, который вы передаете ему в качестве аргумента, как в
test(arr);
Попробуйте код ниже. Вы обнаружите, что когда он запускается, вы получаете ошибку Range-Check в строке
a[5] := 'five';
Это потому, что хотя arr
имеет пять элементов, они пронумерованы от 0 до 4, поэтому в arr
нет элемента с индексом 5.
Хотя есть и другие способы объявления параметров процедуры, если вы хотите передать ей массивы в качестве аргументов, вы должны убедиться, что либо вы мысленно переводите индексы массива при написании кода, либо (лучше) объявляете массивы, которым вы передаете это как с нулевой базой, как я сделал.
И попробуйте завести привычку включать проверку диапазона. Он поймает ошибку, которую вы сами можете не заметить.
Я оставлю вас переписать вашу test
процедуру так, чтобы она работала правильно в качестве упражнения, потому что я "предполагаю", что то, что вы разместили, является своего рода школьной или курсовой работой, и вам действительно следует добавить некоторые усилия, чтобы выяснить, как исправить свою ошибку самостоятельно. Если вы все еще застряли после прочтения этого и попытки найти очевидное решение, спросите.
Кстати, если вы используете Delphi, найдите «Параметры открытого массива» в интерактивной справке. Это объясняет ограничения на использование "массива ..." параметров процедуры.
Также, кстати, Руди Велтус говорит в своем ответе: «Но нет необходимости делать то, что предлагает {MartynA], используя ArrayLoBound и т. Д.». Это правда, в этом нет необходимости, но он упустил мою мысль. Если вы жестко запрограммируете границы массива со значениями, такими как 1 и 5, а затем измените их позже, легко упустить из виду другие значения, которые также нуждаются в обновлении, как в вашем цикле for
. Определять эти значения как const
s — хорошая привычка, потому что это позволяет избежать несоответствий, но, что более важно, заставляет вас думать о том, что вы делаете. ИМЭ...
program arrayparam;
const
ArrayLoBound = 0;
ArrayHiBound = 4;
var
arr : array[ArrayLoBound..ArrayHiBound] of string;
i : integer;
{$R+} // Turn range-checking on
procedure test(var a : array of string);
var
i : integer;
begin
a[1] := 'one';
a[2] := 'two';
a[3] := 'three';
a[4] := 'four';
a[5] := 'five';
for i := 1 to 5 do
writeln(a[i]);
end;
begin
test(arr);
writeln('-----');
for i := ArrayLoBound to ArrayHiBound do
begin
writeln(arr[i]);
if arr[i] = '' then
writeln('NOTHING');
end;
readln
end.
person
MartynA
schedule
18.07.2016
arr
основан на 1 - массив [1..5] строки; - person MartynA   schedule 18.07.2016type
и использовать его. Пример:type TArr = array[1..5] of string; ... procedure Test(var a: TArr);
. - person Rudy Velthuis   schedule 19.07.2016