![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Zigmund |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 27.4.2002 Репутация: нет Всего: нет |
Как организовать стукруры в С++ больше, чем 64к?
следующее дает NUL. char *buf=(char *)farmalloc(70000); |
|||
|
||||
| Alex101 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: нет Всего: 10 |
А ежели char far *...? -------------------- С уважением, А. Фролов. |
|||
|
||||
| suborg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
Не рекомендую пользоваться для этого дела компиляторами типа Borland C 3.1
У него проблемы с памятью, а защищенный режим вообще не предусмотрен. А вот как раз с большими структурами чтобы работать неплохо бы в защищенном режиме сидеть, иметь доступ к XMS,EMS и т.п. Попробуй взять GNU C++ (для ДОС он по-моему называется DJGPP) или Watcom C++. |
|||
|
||||
| Zigmund |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 27.4.2002 Репутация: нет Всего: нет |
Спасибо..
насчет far... никак до размера сегмента позволяет, а дальше ни-ни... |
|||
|
||||
| Tommy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 19.7.2002 Репутация: нет Всего: нет |
Попробуй компилятору уразать модель памяти Huge. Там можно использовать структуры больше 64К.На счет Far это всго лиши изменяет тип указателя увеличивая его размер.
|
|||
|
||||
| Lobsang |
|
|||
|
Unregistered |
Помнится мне, говорили нам в институте, что больше 64 - фиг получится. Для преодоления этого ограничения заставляли учить всякие динамические структуры, типа списков, векторов.
|
|||
|
||||
| crimaniak |
|
|||
|
Unregistered |
Читайте доки, они рулез.
Под досом бывает near *, far * и huge *. Flat модель и всякие экстендеры не рассматриваем. near * состоит из одного смещения относительно сегмента данных, так что мы можем адресовать блок не более 64K в общем объеме не более 64K. far * состоит из сегмента и смещения, так что мы можем адресовать не более 64К в объеме до 1М. huge * состоит из сегмента и смещения, но В ОТЛИЧИЕ от far * при операциях с ним предусмотрена обработка переполнения, и он гарантированно нормализуется. Так что мы можем адресовать 1М в пределах 1М Естественно, все вышеуказанные размеры - приблизительные, обычно они меньше. 64К - как минимум на параграф, 1M - больше на размер HMA. Для получения большого блока данных мы либо можем откомпилироваться в huge модели, где все указатели у нас huge, либо просто явно написать тип указателя char huge * buffer=(char huge*) farmalloc(...); Все это прекрасно работало еще в Turbo-C 2.0, лучшем компиляторе С всех времен и народов. Прикол: потребовалось однажды срочно обработать файлик текстовый, размером в пару гиг. В какие только я его редакторы и тулзы не совал - начиная от Microsoft World и кончая MultiEdit под дос. Ни одна имевшаяся в наличии программа не смогла его обработать, а в основном - даже открыть. В общем, нашлась случайно утилитка по поиску и замене, писанная мною в начале девяностых на Turbo-C. Была запущена ради прикола и.. вот он, результат. А ведь когда она писалась, таких объемов и представить нельзя было. Откуда вывод: не надо отключать ворнинги. Господи, и кто сейчас этот софт пишет? |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |