На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> обьем кучи, coreleft()
    Функции coreleft() и farcoreleft() почему-то говорят, что свободной памяти в куче около 60000 байт. Смена модели памяти в настройках ни к чему не приводит.
    Подскажите пожалуйста в чем может быть дело. Очень надо : )
    Компилер Borland C++ 3.1, ось - WinXP
      А можно ли в досе выделить памяти больше чем 64К?
      Указатели должны быть huge
        Впервые слышу о функции coreleft() blink.gif
        2 rodion Указатели должны быть far... wink.gif

        QUOTE
        All the space between the end of the data segment and the top of the program stack is available for use in the tiny (DOS only), small and medium data models,except for a small margin immediately before the top of the stack. This margin allows room for the application to grow on the stack, and provides a small amount of room needed by the operating system.

        In the large data models (compact, large, and huge), all space beyond the program stack to the end of physical memory is available for the heap.
        Note: Memory models are available only for 16-bit applications.
        calloc allocates a block of size nitems * size. The block is cleared to 0. If you want to allocate a block larger than 64K, you must use farcalloc.

        Borland C++ 5.0 Programmer's Guide
          Drunkard, это все хорошо, только вот проблема в том что не получается ф-ей calloc выделить ммм... допустим 64000 байт, она ошибку возвращает. С farcalloc то же самое, с malloc, new тоже...
            Странно. У меня щаз нет под рукой Багланда Ц++ 3.1 Но в древние ДОС-овские времена, точно помню - работало. sad.gif
              Может это из-за WinXp? Завтра буду тестить на вин98

              Вот этот код нормально работает в борланд С++ 5.01, а в 3.1 нет:

              #include <stdio.h>
              #include <alloc.h>
              #include <iostream.h>
              #include <conio.h>

              #define NUM_PTRS 10
              #define NUM_BYTES 64000

              int main(void)
              {
              clrscr();
              char *array[ NUM_PTRS ];
              unsigned int i;
              for( i = 0; i < NUM_PTRS; i++ )
              array[ i ] = (char *) malloc( NUM_BYTES );
              if(array[0]!=NULL) {
              for(i=0;i<100;i++){
              array[1][i]='a';
              cout<<array[1][i];
              }
              for( i = 0; i < NUM_PTRS; i ++ )
              free( array[ i ] );
              if( heapcheck() == _HEAPCORRUPT )
              printf( "Heap is corrupted.\n" );
              else
              printf( "Heap is OK.\n" );
              getch();
              }
              return 0;
              }
              Сообщение отредактировано: Env0der -
                Измени три строчки - должно пройти.

                1.
                QUOTE
                char *array[ NUM_PTRS ];

                на char far *array[NUM_PTRS];

                2.
                QUOTE
                array[ i ] = (char *) malloc( NUM_BYTES );

                на array[ i ] = (char far *) farmalloc( NUM_BYTES );

                3.
                QUOTE
                free( array[ i ] );

                на farfree( array[ i ] );
                  Кроме того farmalloc использует параметр
                  unsigned long!


                  #define NUM_BYTES 64000L

                    QUOTE
                    на char far *array[NUM_PTRS];


                    В моделях large и huge все указатели по дефолту типа far.

                    QUOTE
                    Кроме того farmalloc использует параметр unsigned long!


                    Это преобразуется само собой компиллятором.

                    Тема в следующем: при запуске проги в дебаге, память жрет кто? Правильно, сам Борланд! Напишем программку:

                    CODE
                    #include <alloc.h>
                    #include <stdio.h>
                    void main (void)
                    {
                    unsigned long nSize = coreleft();

                    printf("%ul\n", nSize);
                    }


                    Запустим ее в пошаговом режиме. Получим 60048 или около того. Закроем Борланд, сделаем shortcut под наш exeшник, сделаем в пропертях размер памяти 640Kb, уберем галку Close on exit, и вот оно : 620016!
                      Uncle Bob, и как это можно пофиксить? А то ведь неудобно получается...
                      Интересно, это из-за операционки? Тогда под ДОСом все ок должно быть unsure.gif
                        Под чистым DOS естессно все будет ок. Я так понял, что Борланд 5 позволяет ДОСовский код делать - дебажь в нем. Если нет, то попробуй отдебажиться на небольших объемах данных, если это невозможно, тогда... В старом форуме по C++ висела в самом верху тема "Как работать без отладчика". Если 640К мало - выход один: Защищенный режим, ДОСовские екстенедеры для работы с XMS...
                          Дядюшка Боб, человеку был предложен вариант, который не зависит от моделей памяти, будь то смалл, ларга или хуга. Если он хочет заниматься вот такой фигнёй :
                          QUOTE
                          Запустим ее в пошаговом режиме. Получим 60048 или около того. Закроем Борланд, сделаем shortcut под наш exeшник, сделаем в пропертях размер памяти 640Kb, уберем галку Close on exit, и вот оно : 620016!

                          То флаг ему в руки. biggrin.gif
                          Я в этом не участвую. tongue.gif

                            QUOTE
                            заниматься вот такой фигнёй

                            Между прочим, если ты не заметил, то именно "эта фигня" и является ответом на заданный человеком вопрос.
                              Возможно. Но проблему она (эта фигня) не решает. wink.gif
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0599 ]   [ 16 queries used ]   [ Generated: 25.04.24, 12:12 GMT ]