Главная страница
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.02 c
15-1200181039
KilkennyCat
2008-01-13 02:37
2008.02.17
Доколе?


2-1201085745
Mariya
2008-01-23 13:55
2008.02.17
WorkBook.WorkSheets[1].Cells[1,1]:=tbmain.FieldValues[ Zvanie ];


3-1191490877
Ega23
2007-10-04 13:41
2008.02.17
TDataLink - распознать Insert и Edit


1-1194445289
Ирина
2007-11-07 17:21
2008.02.17
Работа с Excel через делфи


8-1173470589
Ricks
2007-03-09 23:03
2008.02.17
Количество уникальных цветов в изображении