Массив начинается с 0 или 1 в Delphi 5.0 Pascal?
Я хочу сделать ArrayList в Delphi 5.0. Поэтому я нашел решение, выполняющее этот код:
var arr: array of String;
ОК, но каждый раз, когда я добавляю что-то, я делаю это:
var
Form1: TForm1;
var arr : array of String;
procedure TForm1.Button1Click(Sender: TObject);
var aux :string;
var len:integer;
begin
len := Length(arr) + 1;
SetLength(arr, len);
arr[len-1] := 'abc' + IntToStr(len);
Button1.Caption := arr[len-1]; // just to writeout something
end;
Я программист на С++, и я ничего не знаю о Паскале. Я всегда слышал, что индекс Pascal начинается с 1, а не 0. Как и в предыдущей процедуре, я делаю arr [len-1] из-за начала индекса 0.
Есть ли лучший способ, чем массивы Паскаля? Как с С++ std::vector
?
Ответы
Ответ 1
Индексы динамических массивов начинаются с нуля
var
a: array of Integer;
begin
SetLength(a, 500);
a[0] := 0;
Статические массивы могут иметь произвольные индексы
var
i: Integer;
b: array [50..100] of Integer;
c: array[-10..10] of Integer;
begin
for i := 50 to 100 do b[i] := i * i;
// Note negative starting index above in declaration
for i := -10 to 10 do c[i] := i * i;
Индексы строк начинаются с одного
var
c: String;
begin
c := 'Zap!';
c[1] := 'W';
ShowMessage(c); /// shows 'Wap!'
В любом случае вы всегда можете использовать функции Low() и High(), которые возвращают более низкий и более высокий индекс массива.
Для обработки списка строк наиболее часто используемый класс TStringList, который находится в модуле Классы.
Ответ 2
То, что вы используете, называется динамическим массивом, который отличается от классического массива Pascal. Динамические массивы имеют переменный размер, а индекс равен 0.
Классические массивы Паскаля не основаны ни на 0, ни на 1... Это до программиста, где индекс начинается или заканчивается. Единственное ограничение компилятора заключается в том, что индекс должен иметь порядковый тип. Вы можете объявить
procedure x;
var
IntArr: array[50..75] of Integer;
StrArr: array[0..49] of string;
DblArr: array[1..10] of Double;
Ответ 3
Delphi Pascal также имеет приятную функцию, которая помогает выполнять итерацию через массив любого измерения:
Просто используйте для i:= Low(Array) to High(Array) do....
который полностью прозрачен для начала смещения, то есть 0,1 или 5 или что-то еще.
Ответ 4
Я попытался отредактировать вышеупомянутый ответ, чтобы улучшить его, но редактор продолжает отклонять мою публикацию. Массивы могут иметь отрицательные индексы.
var
A:array[-20..9] of integer;
B:array[-30..-10] of integer;
Они одинаковы, массив из 20 целых чисел, но не будет обрабатываться одним и тем же компилятором, потому что диапазон индексов отличается. Позволяет сделать данные подходящими для проблемной области, а не наоборот.
Теперь строка типа var S:string[200];
технически эквивалентна var s:packed array[0..200] of char
, где байтом 0 является длина, за исключением случаев, когда вы используете строку без длины или указанную длину больше 255, тогда строка равна 1, размер есть. Поскольку строки могут быть динамическими, нехорошо зависеть от 0-го элемента, чтобы содержать длину.
Ответ 5
Когда вы используете SetLength(array, length)
стоит упомянуть, что он имеет индексы, начиная с 0, как упомянуто до длины-1. Также в индексе паскаля по массиву может быть символ из таблицы ANSI. Таким образом, вы можете определить массив как a:array['A'..'Z'] of integer
. Это удобно, когда вам нужно сосчитать все символы в вашем Strings или Char Array.