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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сегмент данных в DOS, как использовать? 
:(
    Опции темы
Illusion Dolphin
  Дата 21.11.2004, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: нет
Всего: 63



Мне в программе под DOS нужно выделить памяти более 64 килобайт, для чего использую модель памяти huge. Нашёл как выделять отдельный сегмент данных, пример из справки такой:
Код

int main(void)
{
 unsigned int size, segp;
 int stat;

 size = 64*16;                    /* (64 x 16) = 1024 bytes */
 stat = allocmem(size, &segp);
 if (stat == -1)
 {
   printf("Allocated memory at segment: %x\n", segp);
   //
   очень тут хочется использовать эту память
   //
   }
 else
   printf("Failed: maximum number of paragraphs available is %u\n", stat);
 getch();
 return 0;
}


Вoт только никак не пойму, как теперь использовать эту память. Покажите, пожалуйста, как, например, выделенную память использовать кк массив целых чисел (int *).


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
manu
Дата 21.11.2004, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 14.10.2004

Репутация: 2
Всего: 3



Я предлагаю тебе использовать Watcom С++ и какой-нибудь из поставляемых с ним расширителей памяти. С ними можешь выделять хоть десятками мегабайт...
PM   Вверх
Illusion Dolphin
Дата 21.11.2004, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: нет
Всего: 63



А если без посторонних средств? Ведь в примере явно выделяется память. и вопрос всего в том, как её использовать.


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
manu
Дата 21.11.2004, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 14.10.2004

Репутация: 2
Всего: 3



Раз уж хочется без посторонних средств, то напиши враппер. Что-то типа этого:

template<class T>
class wrapper {
private:
enum { max_size=0x10000, nblocks=10 };
T *blocks[nblocks];

public:
wrapper(long size) {
здесь выделяем блоки памяти максимального размера и записываем указатели на их начала в blocks[
}

T &operator[](long n) {
int block_number=n/max_size,block_offset=n%max_size;
return blocks[block_number][block_offset];
}
};

В общем что-то такое, хотя я не уверен, лет 10 как под MS-DOS не программировал... А к Watcom ты присмотрись, штука очень удобная.

Да, кстати, попробуй использовать himem.sys или emm386.exe, они тоже большие блоки позволяют выделять. А как их программировать я точно не помню.
Добавлено @ 16:15
Конкретно в твоем примере:

int far *fp=MK_FARP(segp,0); // че-то такое было в BC++

// если не найдешь этот макрос, то он работает так:
#define MK_FARP(seg,off) ((void *)((long)seg << 10 | off))
PM   Вверх
Illusion Dolphin
Дата 21.11.2004, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: нет
Всего: 63



спасибо!
Цитата
int far *fp=MK_FARP(segp,0);
помогло... будем думать дальше...


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
alien_by
Дата 30.11.2004, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 29.11.2004
Где: Belarus/Gomel

Репутация: нет
Всего: 8



Можешь попробовать перенастроить сегмент данных на полученную область памяти
Код

long seg = MK_SEG(segp);
asm
{
  push ds
  push seg
  pop ds
}
// Делаешь что либо, но без обращений к старому сегменту данных
asm
{
  pop ds
}


Я не уверен что это будет работать, но вдруг возникнут новые идеи... smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0564 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.