Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Выделение памяти из кучи

13K
01 октября 2006 года
Sniper
9 / / 17.11.2005
Долго бьюсь над одной проблемой. Ни как не могу предолеть 64К барьер.
Откопал в документации по С++ макрос $MEM(256K), который может памятью управлять в больших колличествах, разрешать ее использование, обрадовался, да не тут то было... Написал в тексте соответствующую строку, получил ошибку при компиляции. Суть ее в том, что компилятор не может смириться с использованием символа '$'. Подскажите если знаете как ползоваться этим макросом.
9
03 октября 2006 года
Lerkin
3.0K / / 25.03.2003
А какой компилятор используется, и под какую ОС?
13K
04 октября 2006 года
Sniper
9 / / 17.11.2005
Использую Borland C++ 3.0 for DOS.
991
09 ноября 2006 года
Zenhipster
157 / / 14.01.2005
А тебе нужно один блок > 64к, или много блоков суммарным размером > 64к?

В первом случае ты не сможешь выделить блок памяти больше 64к, т.к. это ограничение реального режима.
Либо пробуй переключаться в нереальный режим (Unreal Mode), либо используй Watcom C. - Он может компилить под защищенный режим DOS, и там размер выделяемого блока ограничен только ресурсами железа и системы.
Во втором случае используй функцию 48h прерывания 21h. В библиотеке есть обертка этой функции на "C".

ЗЫ: Int 21h
Код:
--
                                                         Compatibility: 2.0+
 Expects: AH    48H
          BX    requested amount of memory in paragraphs (16-byte chunks)
          ──────────────────────────────────────────────────────────────────
 Returns: AX    error code if CF is set to CY
                segment address of allocated block (if no error)
          BX    size of available RAM, in paragraphs (if allocation fails)
          ──────────────────────────────────────────────────────────────────
    Info: Allocates a block of memory BX paragraphs long, returning the
          segment address of that block in AX (block starts at AX:0000).

          If the allocation fails, the Carry Flag is set, an error code is
          returned in AX, and BX contains the maximum size allowable (in
          paragraphs) for an allocation.

          To determine the largest block available, it is a common practice
          to set BX=ffffH before the call.  The allocation will fail,
          returning the available allocation size in BX.

          To allocate from upper memory, the upper memory link must be
          active and the memory allocation strategy must be set to one of
          the options which allocate high memory.  For instance:

            ■ Use fns 5800H and 5802H to obtain the current allocation
              settings.  Save them.
            ■ Use fn 5803H (set UMB link) with BX=0001H
            ■ Use fn 5801H (set strategy) with BX=40H-42H or 80H-82H.
            ■ Use fn 48H (alloc mem) to allocate the memory.  If NC, and
              AX >= A000H, then the high allocation worked.  Otherwise, you
              just got some conventional memory.
            ■ Use fns 5801H and 5803H to restore the saved allocation
              settings before terminating.

              See Accessing Upper Memory for related info.

   Notes: ■ When a process receives control via Fn 4bH EXEC, the largest
            available memory block has been allocated to it already.

            It is usually necessary to shrink the allocation that starts at
            your PSP (via fn 4aH) in order to make conventional memory
            available for allocation.

          ■ When a program is loaded high via loadhigh, its code will be in
            upper memory, but additional allocations will be made according
            to the current allocation strategy (see fn 5801H).

See Also: Memory Control Functions
          Memory Control Block
          DOS Functions
                                    --
20K
12 ноября 2006 года
id_Zebrikoff
8 / / 08.11.2006
Блин. Вообще-то я бы не советовал вам юзать верхние рекомендации...
Лучше подергать за ниточки ближних (near) и дальних(far) и сверх дальних(huge) указателей.
Если вы юзаете сишные методы захвата памяти, конечно.
Ближний вариант:
#include<stdlib.h>
#include<stdio.h>
void main(void){
int *pt=NULL;
int noe=100,bytes=noe*sizeof(int);
if((pt=(int *)malloc(bytes))!=NULL)
printf("Осуществлен захват на: %u байт\n",bytes);
free(pt);
else
printf("Ошибка выделения памяти\n");
}
Сверхдальний вариант:
#include<stdlib.h>
#include<stdio.h>
void main(void){
int huge *pt=NULL;
int noe=100000,bytes=noe*sizeof(int);
if((pt=(int huge*)farmalloc(bytes))!=NULL)
printf("Осуществлен захват на: %u байт\n",bytes);
farfree(pt);
else
printf("Ошибка выделения памяти\n");
}
Кароче сначала валим в обции компилируемого кода и выставляем там модель памяти на необходимую(tiny и small для near;все отальное для far и huge). Потом пишем farcoreleft(), ставим курсор посередине слова и жмем Ctrl+F1 и ... читаем...

В си++ можно по другому. Там просто указываем компилятору, что памяти надо много и все..
---------------
Carmagedddon Splat Pack 4eva |..|,
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог