Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2010, 08:44   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
Восклицание GetMem

Как можно с помощью процедуры выделить память больше 65536 байт?
И ещё: у меня есть объект
Код:
type
      TObject = Object
      P:pointer;
      Constructor Create;
      Destructor Free;
end;
Как его можно поместить в эту память?
_-Re@l-_ вне форума Ответить с цитированием
Старый 20.06.2010, 10:19   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
выделить память больше 65536 байт?
в ДОС у нас один сегмент это те самые 64К
а зачем надо под ДОСом такое?может лучше в Win32?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.06.2010, 10:48   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
может лучше в Win32?
В смысле писать в Delphi?
_-Re@l-_ вне форума Ответить с цитированием
Старый 20.06.2010, 11:24   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

например, в нем.
просто стоит помнить о том что такое ДОС.
если вам нужно чтото типа массива, то можно применить списки.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.06.2010, 11:36   #5
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

А в Delphi один сегмент сколько?
_-Re@l-_ вне форума Ответить с цитированием
Старый 20.06.2010, 11:46   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Там нет сегментов... Там плоские 4 Гб.
p51x вне форума Ответить с цитированием
Старый 20.06.2010, 19:19   #7
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Тип данных вы не можете поместить в память. Видимо имеется ввиду переменная типа TObject? Там все как с обычными типами данных.
Код:
var a:array [1..100] of TObject
А GetMem, как уже упоминали выше, физически не может выделить больше 64 кб. Можно конечно выкрутиться и сделать структуру похожую на массив, но использующую динамическую память, но доступ к ячейкам по индексу значительно усложнится.
Обрисую как я вижу решение этой проблемы:
Способ 1 (более быстрый, но имеет ограничения):
на самом деле у вас массив не типа TObject а типа pointer и содержит указатели на ячейки типа TObject. Способ простой, но можно записать только 16 776 704 элемента (на мой взгляд вполне достаточно практически для любых задач)
Способ 2 (медленный, но обходит предыдущее ограничение)
создаем тип данный (как у вас в примере), но в нем реализуем очередь.
Обращение к нужной ячейке реализуется через метод (допустим GetElement), который возвращает указатель на нужный нам элемент массива (просто в for-е переходим по элементам очереди, до тех пор пока она не закончится (нет элемента с таким индексов) либо пока не закончится выполнение for-а (элемент найден)).

Вот как-то так
Искусственный интеллект - фигня по сравнению с естественной глупостью

Последний раз редактировалось Impuls1989; 20.06.2010 в 19:21.
Impuls1989 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц