Как задать нижнюю границу массива динамически?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как задать нижнюю границу массива динамически?

Сообщение CRobin » 06.07.2016 17:01:56

Здравствуйте. Необходимо объявить массив-справочник, индекс которого будет находится внутри диапазоне Uint64. Проблема в том, что заранее не известно минимальное значение ключа, иначе бы его можно было бы объявить константой

Код: Выделить всё
const a = 22222222222222;
         b = 22222222222333;
var dic : array[a..b] of TEntry;


Может можно как то выкрутится, объявив константы динамически чтоб добится того же эффекта?
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как задать нижнюю границу массива динамически?

Сообщение vvvch » 06.07.2016 17:09:36

CRobin
Если я Вас правильно понял, Вам нужен динамический массив:
Код: Выделить всё

var
  dic: array of TEntry;

работать с ним через SetLength
И вообще, почитайте про динамические массивы
Аватара пользователя
vvvch
постоялец
 
Сообщения: 105
Зарегистрирован: 26.04.2013 11:05:39
Откуда: г.Боровичи, Новг. обл.

Re: Как задать нижнюю границу массива динамически?

Сообщение CRobin » 06.07.2016 17:37:23

vvvch что то слышал про динамические массивы. Не подскажете как там можно задать нижнее значение индекса?
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как задать нижнюю границу массива динамически?

Сообщение vvvch » 06.07.2016 17:54:34

Там верхнее значение индекса всегда = 0, а нижнее как раз и задаётся SetLength, длина определяется Length (как символьная строка), максимальный индекс существующего массива High.
Аватара пользователя
vvvch
постоялец
 
Сообщения: 105
Зарегистрирован: 26.04.2013 11:05:39
Откуда: г.Боровичи, Новг. обл.

Re: Как задать нижнюю границу массива динамически?

Сообщение CRobin » 06.07.2016 18:01:12

vvvch писал(а):Там верхнее значение индекса всегда = 0, а нижнее как раз и задаётся SetLength


Это как? Можно пару примеров?
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как задать нижнюю границу массива динамически?

Сообщение vvvch » 06.07.2016 18:14:06

Ну, объявляете переменную (см.выше), потом, когда надо задаёте размер ф-й SetLength (изменяете ей-же)...



Архангельский приводит такой пример:
Операторы
var S: string[3];
...
S:='Ура';
записывают в строку S текст "Ура". Но если после этого выполняется оператор
SetLength(S,1);
то текст строки будет восприниматься как "У".

Операторы
var PZ: array of integer;
...
SetLength(A,10);
выделяют для динамического массива A место в памяти под 10 элементов.
Следующий оператор уменьшает на 1 текущую длину динамического массива A:
SetLength(A, High(A));
Следующий оператор увеличивает на 1 текущую длину динамического массива A:
SetLength(A, Length(A) + 1);
Пусть оператор
var A2: array of array of integer;
объявляет двумерный динамичекий массив. Тогда оператор
SetLength(A2,3,4);
задает размерность массива 3 на 4. Если вместо этого оператора выполнить оператор
SetLength(A2,3);
то первый размер массива будет задан равным 3. В памяти отводится место под 3 строки - 3 динамических массива A2[0], A2[1] и A2[2]. Размеры каждого из этих массивов еще не определены. Далее можно, например, задать размер первого из них равным 1, второго - 2, третьего - 3:
SetLength(A2[0],1);
SetLength(A2[1],2);
SetLength(A2[2],3);
Получится двумерный динамический массив нижней треугольной матрицы:
A2[0,0]
A2[1,0] A2[1,1]
A2[2,0] A2[2,1] A2[2,2]
Аватара пользователя
vvvch
постоялец
 
Сообщения: 105
Зарегистрирован: 26.04.2013 11:05:39
Откуда: г.Боровичи, Новг. обл.

Re: Как задать нижнюю границу массива динамически?

Сообщение CRobin » 06.07.2016 18:22:08

Я вас не понимаю совершенно.
Как задать нижнее значение индекса?
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как задать нижнюю границу массива динамически?

Сообщение vvvch » 06.07.2016 18:24:54

Это обычная целая переменная, аргумент ф-ии SetLength (первый аргумент-Ваш массив, второй- эта переменная). Задаёте ей нужное значение и вызываете ф-ю. Дальше обращаетесь с массивом как обычно (только первый элемент имеет индекс 0, последний - (эта переменная -1)). Если надо индексы не с 0, то вычисляете индексы сами (приводите к диапазону 0-мах).
Ещё можно использовать TList, но это др. история.
Аватара пользователя
vvvch
постоялец
 
Сообщения: 105
Зарегистрирован: 26.04.2013 11:05:39
Откуда: г.Боровичи, Новг. обл.

Re: Как задать нижнюю границу массива динамически?

Сообщение CRobin » 06.07.2016 19:42:42

Вы читать умеете или возможно вы так шутите надо мной? Уже несколько раз написал что нужно задать нижнюю границу индекса. Тем более в самой теме написано. Может вы просто не понимаете значение слов которое я употребляю?
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как задать нижнюю границу массива динамически?

Сообщение скалогрыз » 06.07.2016 19:57:08

CRobin писал(а):Может можно как то выкрутится, объявив константы динамически чтоб добится того же эффекта?

Изменить динамически нижнюю границу индекса нельзя.
Границы и индексы определяются на стадии компиляции.

Следует написать обёртку, например так
Код: Выделить всё
type
  TEntryArray = class(TObject)
  protected
     data: array of TEntry;
     flow: Integer;
     function GetEntry(i: integer): Integer;   
     procedure SetLow(aidx: Integer);
  public
     property Items[i: integer]: TEntry read GetEntry; default;
     property Low: Integer read fLow write SetLow;
  end;

function TEntryarray.GetEntry(i: integer): TEntry;   
var
  idx : integer;
begin
  idx:=i-flow;
  Result:=data[idx];
end;

function TEntryarray.SetLow(alow: integer): TEntry;   
begin
  if alow = flow then Exit
  // Resize and Move Data
  flow:=alow;
end;



Возможно имеет смысл пересмотреть использование массива.
Подразумевается, что индекс массива лежит в области Int32. Если исползьуются данные большего объёма, то может быть требуется иная структура данных?!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как задать нижнюю границу массива динамически?

Сообщение vvvch » 06.07.2016 20:04:09

CRobin
Во-первых, я не шучу! Во-вторых, не злитесь, возможно я Вас не так понял. Я думал, что количество элементов Вам заранее не известно, они динамически появляются в процессе работы программы. Это типичная задача, решение которой тоже не раз приведено. Возможно Вы имеете в виду что-то иное, тогда я Вас действительно не понял.
Аватара пользователя
vvvch
постоялец
 
Сообщения: 105
Зарегистрирован: 26.04.2013 11:05:39
Откуда: г.Боровичи, Новг. обл.

Re: Как задать нижнюю границу массива динамически?

Сообщение AlphaBlend » 06.07.2016 20:06:13

:shock: Вы со строками работаете ? тип Array Вам ничего не наапоминает ? свойство Length или обращение к символу как к элементу массива ?
( Str [1] :='a' );

Добавлено спустя 2 минуты 32 секунды:
строка - тот же массив , Массив символов типа Char ) ( да-да , и в Паскале тоже ! ) ))) ТАк вот . Любой массив динамический или статический работает так же )
Чтобы объявить массив надо сначала объявить его тип - Вам не только на блюдечке все п одали выше , но еще и салфеточку повязали и даже разжевали :mrgreen:
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

Re: Как задать нижнюю границу массива динамически?

Сообщение CRobin » 06.07.2016 20:10:14

скалогрыз не уверен, но есть ощущение, что такое все же можно сделать через динамические константы и указатели. В случае с объектом я не могу передать указатель на конкретное поле записи, насколько я понимаю, по типу такого
Код: Выделить всё
e := @data[i].field


Добавлено спустя 2 минуты 59 секунд:
vvvch извините, у вас проблемы с головой, не знаю как вам это объяснить. Говорю так потому что вы даже до сих пор не поняли о чем речь. Это просто поразительно.
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как задать нижнюю границу массива динамически?

Сообщение AlphaBlend » 06.07.2016 20:20:53

Код: Выделить всё
{ объявление  типа ( Не  обязательно  ,что он будет таким  гиганстким ) . Вообще-то длинна  массива  ограничена . Стоит учесть то , что  размер         массива  зависит от разрядности системы ! Так ,  для  32-битной  системы  больше , чем  ( 2097152 -  64 ) КБ создавать массив  нельзя }

// объявляется  тип :

TMyArray = Array of тип ;

// переменная  с  типом :

MyArray : TMyArray ;

//применение:

//Установить начальное  значние  массива :

SetLength (MyArray , 10 ) //массив  будет иметь  10  индексов ( 0 .. 9 );

// констант  не  надо )

//измерить размер массива можно функцией  Length


Последний раз редактировалось AlphaBlend 06.07.2016 20:23:45, всего редактировалось 1 раз.
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

Re: Как задать нижнюю границу массива динамически?

Сообщение AlphaBlend » 06.07.2016 20:26:22

ага :mrgreen: :mrgreen: :mrgreen:
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 250

Рейтинг@Mail.ru