Главная страница
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.47 MB
Время: 0.021 c
15-1200295245
TUser
2008-01-14 10:20
2008.02.17
Ашипка вышла :)


3-1191244296
Draught
2007-10-01 17:11
2008.02.17
Объеденить несколько строк из таблицы в отдну строку.


2-1201366122
ChaosAD
2008-01-26 19:48
2008.02.17
Query + Lookup


15-1200378567
Москва(с)
2008-01-15 09:29
2008.02.17
Запрет доступа к серверу


6-1180565481
samael6
2007-05-31 02:51
2008.02.17
Работа с TIdConnectionIntercept