| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Размер динамического массива в байтах |
| Автор: namervasek 31.10.2009, 18:55 | ||||
| Всем привет! Пишу функцию сортировки для массива... и пытаюсь её реализовать таким образом что в эту функцию передавался только указатель на массив. Тоесть должно выглядеть как например length(). Но проблема в определении размера элемента массива(не длина самого массива а имено элемента). Сначала пытался определить тип элементов массив но ронял что это вроде как не возможно. Решил порыть в сторону размера массива в байтах нашел что перед указателем массива кроме его длины и счетчка ссылок, по смещению -12 находится информация о размера и флагах. потом наткунлся на статейку о менеджере памяти и после прочтения сделал вывод что вроде как то что находится по смещению -12 этносится ни имено к массиву а к выделной динамеческой памяти для него. Поэксперементировал и сделал вывод что по смещению хранится непросто размер в байтах так как например если написать такое: i
то после этого после этого по смещению -12 будет лежать 1А(или 26 в десятичной). Опять начал гуглить нашел пару функция которые должны возращать размер. Попытался их пременить но все что я пробовал возращали неправильный результат даже учетом -8 байт служебной информации(правда может они возращают правильный результат но я не могу понять что они тогда возращают) Вот один примеров: например на RSDN есть http://www.rsdn.ru/article/Delphi/dynarrays.xml и исходники к ней. В исходниках есть функция(перед функции тип и константы испосльзуемые ей)
Поскажите как можно узнать размер массива в байтах? Ps:из поисков понял что можно узновать не только рамер массива в байтах, так же можно узнать рамер любой диначиской переменой. Подскажите действительно ли это так. |
| Автор: Beltar 31.10.2009, 20:00 |
| А var параметр не подходит?? |
| Автор: namervasek 3.11.2009, 16:40 | ||||
Эм.. Всмысле передавать переменую типа вариант? Начет варианов поискал и не смог найти как через него размер узнать... Только если делать так
Подругому узнать можно??? И все же хотелось бы обойтись без варианта.... |
| Автор: Beltar 3.11.2009, 17:26 | ||
В смысле передавать по ссылке.
Или я чего-то не понимаю? Модератор: используйте подсветку кода! |
| Автор: namervasek 3.11.2009, 18:00 |
| не мне не это надо Length - возращает кол-во элементов массива, а мне надо узнать сколько элемент занимае памяти т.е. TbyteDynArray- у него один элемент это один байт TintegerDynArray- у него один элемент это четые байта Размер динамического массива в байтах, мне нужнен для того что бы затем посчитать размер элемента этого массива. Ну покрайне мере чтоб решить мою проблему это единственый способ который мне в голову пришел. |
| Автор: Beltar 3.11.2009, 18:04 |
| А SizeOf чем не хороша? У классов вроде как InstanseSize есть. |
| Автор: namervasek 3.11.2009, 18:16 |
| например var a:tbytedynarray; SizeOf(a) -вернет 4 что собствено является размером указателя а не размеров элементов |
| Автор: Beltar 3.11.2009, 18:18 |
| var m:array of Double; begin SizeOf(m[0]); вернет 8 end; |
| Автор: namervasek 3.11.2009, 18:22 |
| да так он вернет, но мне нужно узновать по указателю |
| Автор: Beltar 3.11.2009, 18:42 |
| Тебе что нужно, обязательно Pointer заюзать, или передать только ссылку на массив, чтобы его весь не копировать? |
| Автор: namervasek 3.11.2009, 19:02 | ||
| эм.. вкратце надо так
sort - сортирует "любой" массив (ну не любой а только целочисленые) т.е. я хочу сделать так что бы не передавать при этом размер элемента. При такой передачи параметров мне нужен pointer |
| Автор: Frees 3.11.2009, 19:11 |
| pointer всего лиш ссылка на память никак не структурированную... из поинтера никак не узнаеш что там за массив можно использовать массив с поинтервми или TList где каждый элимент ссылка на объеки или структуру или ... Добавлено через 7 минут и 12 секунд можно в 0 байте массива писать размер элимента как в стринге в 0 индексе лежит его размер ИМХО само лучшее решение - еще один параметр в процедуру sort |
| Автор: CodeMonkey 3.11.2009, 21:47 |
| Эммм.... я бы предложил посмотреть JCL... и её функции по сортировки произвольных массивов... там та же идея. |
| Автор: namervasek 4.11.2009, 15:04 |
| CodeMonkey, неподскажешь имя модуля где они реализованы, а то вчера пол ночи потратил найти не смог. |
| Автор: CodeMonkey 4.11.2009, 23:56 |
| Я в процессе переезда на Win7, JCL пока не установил |