Перечисляемый тип и размер массива

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Ответить
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Перечисляемый тип и размер массива

Сообщение VirtUX »

Каким образом можно установить размер массива 64-битным значением и как потом его обходить в цикле for to(downto) do?
Для примера:

Код: Выделить всё

var i: QWord;
begin
  for i := 0 to high(QWord) do ; //выдаст ошибку, что i - неперечисляемый тип
end;
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

Код: Выделить всё

var
  I: QWord;
begin
  I := 0;
  while True do begin
    // ...
    if I = High(QWord) then
      Break;
    I := I + 1;
  end;
end.
v-t-l
энтузиаст
Сообщения: 745
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

for i := lo(QWord) to hi(QWord) do
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

v-t-l, а вы пробовали это скомпилировать?
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Дож писал(а):

Код: Выделить всё

var
  I: QWord;
begin
  I := 0;
  while True do begin
    // ...
    if I = High(QWord) then
      Break;
    I := I + 1;
  end;
end.

Этот вариант подходит. А как быть с SetLength(M, high(QWord)); ?
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Что у Вас за массив, в котором может быть более 4 миллиардов элементов? :shock:
На 32-х разрядной системе Вы даже теоретически не можете с таким массивом работать.
(а на x64 QWord будет нормально итерировать)
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Max Rusov писал(а):Что у Вас за массив, в котором может быть более 4 миллиардов элементов? :shock:
На 32-х разрядной системе Вы даже теоретически не можете с таким массивом работать.
(а на x64 QWord будет нормально итерировать)

Значит 64-х битный размер массива возможен только на 64-х битных ОС? Интересно, а есть-ли возможность эмулировать на 32-х битной работу 64-х битной?
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

VirtUX
Вы посчитайте сколько такой массив будет занимать места в оперативке.
И можно ли будет получать к нему доступ при помощи 32-битного указателя.
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Все адресное пространство 32-х разрядного приложения ограничено 4-мя Г в лучшем случае (а обычно, вообще 2-мя).
Так как для массивов требуется _непрерывное_ адресное пространство, реально допустимый размер _намного_ меньше.
Скорее всего даже блок памяти в 1 Г аллоцировать не удасться. Приходится использовать структуры со страничной
аллокацией (Paged List'ы). Если же нужны структуры данных > 4х Г - то это только файлы с подкачкой по частям
(или страничным мэппиногом)
Ответить