Массив начинается с 0 или 1 в Delphi 5.0 Pascal? - PullRequest
10 голосов
/ 03 ноября 2010

Я хочу создать 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;

Я программист на С ++ и ничего не знаю о Паскале. Я всегда слышал, что индекс Паскаля начинается с 1, а не с 0. Как и в приведенной выше процедуре, я делаю arr [len-1] из-за начала индекса 0.

Есть ли лучший способ, чем массивы Паскаля? Как и в случае с C ++ std::vector?

Ответы [ 5 ]

38 голосов
/ 03 ноября 2010

Индексы динамических массивов начинаются с нуля

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 , который находится в единице Классы .

12 голосов
/ 03 ноября 2010

То, что вы используете, известно как динамический массив , который отличается от классического массива Pascal. Динамические массивы имеют переменный размер, и индекс равен 0.

Классические массивы Pascal не основаны на 0 или 1 ... Это зависит от программиста, где индекс начинается или заканчивается. Единственное ограничение компилятора заключается в том, что индекс должен иметь порядковый тип. Вы можете объявить

procedure x;
    var
        IntArr: array[50..75] of Integer;
        StrArr: array[0..49] of string;
        DblArr: array[1..10] of Double;
6 голосов
/ 18 января 2012

Delphi Pascal также имеет хорошую функцию, которая помогает перебирать массив любого измерения:

Просто используйте для i:= Low(Array) to High(Array) do...., который полностью прозрачен для начального смещения, т. Е. 0,1 или 5 или что-то еще.

1 голос
/ 25 июля 2017

Когда вы используете SetLength(array, length), стоит упомянуть, что он имеет индексы, начиная с 0, как упомянуто, до длины-1. Также в индексе паскаля по массиву может быть символ из таблицы ANSI. Таким образом, вы можете определить массив как a:array['A'..'Z'] of integer. Это удобно, когда вам нужно сосчитать все символы в вашем Strings или Char Array.

1 голос
/ 07 августа 2013

Я пытался отредактировать приведенный выше ответ, чтобы улучшить его, но редактор продолжает отклонять мою публикацию.Массивы могут иметь отрицательные индексы.

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-го элемента, чтобы содержать длину.

...