Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Невозможно изменить индексацию динамического массива в Delphi

Delphi , Базы данных , Индексы

В Delphi, когда мы объявляем массив типа

var
  Arr: array[2..N] of MyType;

мы создаем массив из N - 1 элементов, индексированных от 2 до N.

Если вместо этого мы объявляем динамический массив

var
  Arr: array of MyType

и позже выделяем N - 1 элементов с помощью

SetLength(Arr, N - 1)

то элементы будут индексированы от 0 до N - 2. Можно ли сделать так, чтобы они были индексированы от 2 до N (скажем)?

Нет, в Delphi динамические массивы всегда индексируются с нуля.

Однако, есть несколько альтернативных подходов, которые можно использовать для достижения подобного поведения.

Один из них - использование указателей:

type
  TMyTypeArr = array [ 0..High(Integer) div sizeof( MyType ) - 1 ] of Mytype;
  PMyTypeArr = ^TMyTypeArr;
var
  x: ;
  A: PMyTypeArr;
begin
  SetLength( A, 2 );
  x := PMyTypeArr( @A[ 0 ] ); Dec( PMyType( x ), 2 ); // теперь [2,4> является действительным.
  x[2] := Get_A_MyType();
end;

Обратите внимание, что при использовании этого подхода теряется проверка диапазона, и комбинирование этого с массивами, начинающимися не с нуля, является очень плохой идеей!

Другой подход - написание простой функции "перевода", которая будет принимать индекс в диапазоне от 2 до N и возвращать индекс от 0 до N-2, просто вычитая 2 из параметра, например:

function translate(i : integer) : integer;
begin
  result := i - 2;
end;

И вы можете вызывать массив таким образом:

array[translate(2)]

Конечно, вы можете добавить проверку диапазона внутри функции и, возможно, дать ей более короткое имя.

Или даже лучше, обернуть доступ к массиву функцией, такой как эта:

function XYZ(i : integer) : MyType;
begin
  // Выполните проверку диапазона здесь...
  result := MyArray[i - 2];
end;

Надеюсь, это поможет!

Создано по материалам из источника по ссылке.

В данном контексте рассматривается создание массивов в Delphi и способы их индексации, а также альтернативные подходы для достижения индексации массивов от 2 до N для динамических массивов, которые по умолчанию индексируются с нуля.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Индексы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 03:47:04/0.0050089359283447/1