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

Ваш аккаунт

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

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

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

работает ли пример из билдера?

24K
10 августа 2008 года
warobushek
32 / / 10.08.2008
В Borland C++ 6 Builder
есть пример для функции heapwalk
Я его просто напросто копирую и вставляю в исходник .cpp
работает ли он?
Код:
#include <stdio.h>
#include <alloc.h>

#define NUM_PTRS  10
#define NUM_BYTES 16

int main( void )
{
   struct heapinfo hi;
    char *array[ NUM_PTRS ];
   int i;

   for( i = 0; i < NUM_PTRS; i++ )
      array[ i ] = (char *) malloc( NUM_BYTES );

   for( i = 0; i < NUM_PTRS; i += 2 )
      free( array[ i ] );

   hi.ptr = NULL;
   printf( "   Size   Status\n" );
   printf( "   ----   ------\n" );
   while( heapwalk( &hi ) == _HEAPOK )
   printf( "%7u    %s\n", hi.size, hi.in_use ? "used" : "free" );

   return 0;
}

Почему цикл по while вообще ниразу не выполняется?
Куча ведь не пуста и не конец еще.

Проверил еще в Borland C ++ 3.1 Builder - вроде выполняется, но уже другой баг - почему-то строки "used" и "free" никак не хотят выводиться. В чем причина?
24K
10 августа 2008 года
warobushek
32 / / 10.08.2008
В Borland c++ 3.1 ошибка в заголовочном файле - элемент size структуры heapinfo имеет тип unsigned long, а не unsigned как это декларируется в справке. Поэтому функция printf и спотыкается на этом параметре, если не указать модификатор l.

В Borland c++ 6.0 с типом элемента все ОК. Но почему-то в heapwalk всегда выдает HEAPEND (т.е. 5). В результате цикл даже не начинается. Объясните кто знает.
288
11 августа 2008 года
nikitozz
1.2K / / 09.03.2007
Попробовал с использованием функции _rtl_heapwalk. Все работает. Вот исходник (также взят из справки к Borland С++).
Код:
#include <stdio.h>
#include <malloc.h>
#include <alloc.h>

#define NUM_PTRS  10
#define NUM_BYTES 16


int main(int argc, char* argv[])
{
    _HEAPINFO *hi;
   char *array[ NUM_PTRS ];
   int i;

   hi = (_HEAPINFO *) malloc( sizeof(_HEAPINFO) );

   for( i = 0; i < NUM_PTRS; i++ )
      array[ i ] = (char *) malloc( NUM_BYTES );

   for( i = 0; i < NUM_PTRS; i += 2 )
     free( array[ i ] );

   hi->_pentry = NULL;
   printf( "   Size   Status\n" );
   printf( "   ----   ------\n" );

   while( _rtl_heapwalk( hi ) == _HEAPOK )
     printf( "%7u    %s\n", hi->_size, hi->_useflag ? "used" : "free" );

   free( hi );
   return 0;
}


С heapwalk у меня результат такой же, что и у вас. Причину надо искать в исходниках этой функции.
24K
11 августа 2008 года
warobushek
32 / / 10.08.2008
Т.е. Вы считаете, что это может быть ошибка в коде библиотечной функции?
Может нужно для ее применения какие то настройки спец-е делать?
288
12 августа 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: warobushek
Т.е. Вы считаете, что это может быть ошибка в коде библиотечной функции?
Может нужно для ее применения какие то настройки спец-е делать?



Пока не знаю. Не разбирался. Возможно просто надо правильно ее использовать. Стоит почитать литературу по Borland'у и поискать подобные заметки в интернете.

24K
12 августа 2008 года
warobushek
32 / / 10.08.2008
Спасибо за ответы.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог