Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.17;
Скачать: CL | DM;

Вниз

SizeOf для массивов более 32к   Найти похожие ветки 

 
Alex_C   (2008-01-21 15:40) [0]

Есть массив
Buffer : ^TByteArray;
...
GetMem( Buffer, 36000 );
Если потом сделать
SizeOf(Buffer^), то рез-т получается не 36000, а 32768. А как получить реальный размер буффера?


 
Юрий Зотов ©   (2008-01-21 15:44) [1]

Что такое у Вас TByteArray? Если динамический массив, то выкиньте все указатели и GetMem"ы. Динамический массив сам по себе - уже указатель, а память под него выделяется через SetLength.


 
Leonid Troyanovsky ©   (2008-01-21 15:47) [2]


> Alex_C   (21.01.08 15:40)  

> А как получить реальный размер буффера?

Он и есть реальный:
 TByteArray = array[0..32767] of Byte;

--
Regards, LVT.


 
han_malign ©   (2008-01-21 16:08) [3]

SizeOf - это константа вычисляемая на этапе компиляции - в данном случае SizeOf(Buffer^) идентично SizeOf(TByteArray).
Если не хочешь пользоваться динамическими массивами, то реальный размер буфера ты "получаешь" в момент выделения памяти и его храние целиком твоя обязанность...
Можно получить выделенный размер буфера (округленный с точностью 4-байта) зная особенности реализации Borland менеджера памяти, но это есть нехорошо - т.к. не гарантируются совместимость с новыми версиями компилятора, и должна быть уверенность что указатель указывает строго на начало выделенного блока...
Можно пользоваться кучей Windows, которая поддерживает проверку целостности - HeapAlloc/HeapFree/HeapSize/HeapXXX - но это извращение т.к. менеджер памяти Borland намного эффективнее.


 
homm ©   (2008-01-21 16:16) [4]

> [3] han_malign ©   (21.01.08 16:08)
> то реальный размер буфера ты "получаешь" в момент выделения
> памяти и его храние целиком твоя обязанность...

Не совсем так. По смещению -4 от начала выделеного блока, кажется, лежит размер блока.


> Можно получить выделенный размер буфера (округленный с точностью
> 4-байта)

Видимо мы об одном и том же. Только я ничего не помню, про кртность читырем.


 
Alex_C   (2008-01-21 16:40) [5]

Спасибо всем!
Свою ошибку понял. Перешел на динамический массив.



Страницы: 1 вся ветка

Текущий архив: 2008.02.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
2-1201085745
Mariya
2008-01-23 13:55
2008.02.17
WorkBook.WorkSheets[1].Cells[1,1]:=tbmain.FieldValues[ Zvanie ];


2-1200997439
Gusev
2008-01-22 13:23
2008.02.17
Как реализовать "права пользователя" в своей программе? (БД)


4-1182808934
Денис178
2007-06-26 02:02
2008.02.17
Измение текста static контрола


15-1200244048
Оксана
2008-01-13 20:07
2008.02.17
48*159=7632 Как найти аналогичные примеры?


2-1201186963
SveTT
2008-01-24 18:02
2008.02.17
Условие на MAX значение