Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Динамические массивы


Автор: DragonFire 21.11.2005, 14:49
Вопрос такой: Можно ли создать динамический массив так, чтобы элементы нумеровались не от 0 да 100, о от 100 до 200.
И если можно - то как?

Автор: _hunter 21.11.2005, 15:12
можно: создаеш нормальный массив (от 0 до ста ) а потом при обращении отнимаеш от индекса 100

Автор: Snowy 21.11.2005, 15:15
Можно, но лучше этого не делать.
Но, если очень хоцца, то можно так:
Код

type
  TIArray = array[100..100] of integer; // Массив, начинается со 100
  PIArray = ^TIArray; // указатель на массив для выделения памяти
var
  a: TIArray; // соответственно массив
  p: PIArray; // соответственно указатель
  z: integer; // это для номера элемента
begin
  p:=@a; // берем адрес массива
  GetMem(p,101*SizeOf(integer)); // выделяем память - 100..200 - 101 integer
  z:=150; // номер элемента
  a[z]:=z*z; // присваиваем 150-му элементу значение
  Label1.Caption:=IntToStr(a[z]); // ну типа теста
  FreeMem(p); // не забываем освободить память
end;

Автор: DragonFire 21.11.2005, 20:46
Спасибо, только я что-то не понял, где именно указывается, что до 200. В SizeOf(integer) что ли? А как тогда сделать до 210?

Автор: Snowy 21.11.2005, 21:32
Цитата(DragonFire @ 21.11.2005, 20:46)
Спасибо, только я что-то не понял, где именно указывается, что до 200. В SizeOf(integer) что ли? А как тогда сделать до 210?

Там не указывается до скольки. Там указывается кол-во.
От 100 до 200 получается 101 элемент массива.
Хочешь 210, будет: 111*SizeOf(integer);
SizeOf(integer) - размер одного элемента. 111 - кол-во элементов.

Автор: DragonFire 21.11.2005, 21:44
А если я хочу не с 100 элемента, а с 150, то мне нужно статически менять тип TIArray? А динамически это можно сделать?

Автор: Snowy 21.11.2005, 21:47
Цитата(DragonFire @ 21.11.2005, 21:44)
А если я хочу не с 100 элемента, а с 150, то мне нужно статически менять тип TIArray?

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

Автор: DragonFire 21.11.2005, 21:55
И на том спасибо =)

Автор: Girder 22.11.2005, 11:40
Цитата(Snowy @ 21.11.2005, 21:47)
При таких запросах, лучше уж действительно тогда делать, как сказал хантер.

Ну а почему бы сразу не сделать вот так: SetLength(XXX,201)... ну и использывать в XXX только диапозон от 100 до 200?

PS: Вот только зачем такие... smile лучше уж используй индексацию данных.

Автор: DragonFire 22.11.2005, 13:42
Цитата(Girder @ 22.11.2005, 11:40)
Ну а почему бы сразу не сделать вот так: SetLength(XXX,201)... ну и использывать в XXX только диапозон от 100 до 200?

Экономия памяти. Это от 100 до 200 можно, а от 20000 да 30000 уже нельзя, тем более, если массив - двумерный...
P.S. Что за индексация данных?

Автор: _hunter 22.11.2005, 14:04
Цитата
Это от 100 до 200 можно, а от 20000 да 30000 уже нельзя, тем более, если массив - двумерный...

нихт не понял...
+ почему мой метод не подходит -- тоже не понятно...

Автор: DragonFire 22.11.2005, 20:16
_hunter, твой метод прост и понятен, но для моего алгоритма в моей программе требуется брать конкретные индексы элементов массива, а не замарачиватся с вычитанием...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)