Массив начинается с 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.