![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
namervasek |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 3.12.2007 Репутация: нет Всего: нет |
Всем привет!
Пишу функцию сортировки для массива... и пытаюсь её реализовать таким образом что в эту функцию передавался только указатель на массив. Тоесть должно выглядеть как например length(). Но проблема в определении размера элемента массива(не длина самого массива а имено элемента). Сначала пытался определить тип элементов массив но ронял что это вроде как не возможно. Решил порыть в сторону размера массива в байтах нашел что перед указателем массива кроме его длины и счетчка ссылок, по смещению -12 находится информация о размера и флагах. потом наткунлся на статейку о менеджере памяти и после прочтения сделал вывод что вроде как то что находится по смещению -12 этносится ни имено к массиву а к выделной динамеческой памяти для него. Поэксперементировал и сделал вывод что по смещению хранится непросто размер в байтах так как например если написать такое: i
то после этого после этого по смещению -12 будет лежать 1А(или 26 в десятичной). Опять начал гуглить нашел пару функция которые должны возращать размер. Попытался их пременить но все что я пробовал возращали неправильный результат даже учетом -8 байт служебной информации(правда может они возращают правильный результат но я не могу понять что они тогда возращают) Вот один примеров: например на RSDN есть статейка и исходники к ней. В исходниках есть функция(перед функции тип и константы испосльзуемые ей)
Поскажите как можно узнать размер массива в байтах? Ps:из поисков понял что можно узновать не только рамер массива в байтах, так же можно узнать рамер любой диначиской переменой. Подскажите действительно ли это так. |
||||
|
|||||
Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
А var параметр не подходит??
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. ![]() Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
namervasek |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 3.12.2007 Репутация: нет Всего: нет |
Эм.. Всмысле передавать переменую типа вариант? Начет варианов поискал и не смог найти как через него размер узнать... Только если делать так
Подругому узнать можно??? И все же хотелось бы обойтись без варианта.... |
||||
|
|||||
Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
В смысле передавать по ссылке.
Или я чего-то не понимаю? Модератор: используйте подсветку кода! Это сообщение отредактировал(а) THandle - 4.11.2009, 20:01 -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. ![]() Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
namervasek |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 3.12.2007 Репутация: нет Всего: нет |
не мне не это надо
Length - возращает кол-во элементов массива, а мне надо узнать сколько элемент занимае памяти т.е. TbyteDynArray- у него один элемент это один байт TintegerDynArray- у него один элемент это четые байта Размер динамического массива в байтах, мне нужнен для того что бы затем посчитать размер элемента этого массива. Ну покрайне мере чтоб решить мою проблему это единственый способ который мне в голову пришел. |
|||
|
||||
Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
А SizeOf чем не хороша? У классов вроде как InstanseSize есть.
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. ![]() Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
namervasek |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 3.12.2007 Репутация: нет Всего: нет |
например
var a:tbytedynarray; SizeOf(a) -вернет 4 что собствено является размером указателя а не размеров элементов |
|||
|
||||
Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
var m:array of Double;
begin SizeOf(m[0]); вернет 8 end; -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. ![]() Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
namervasek |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 3.12.2007 Репутация: нет Всего: нет |
да так он вернет, но мне нужно узновать по указателю
|
|||
|
||||
Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
Тебе что нужно, обязательно Pointer заюзать, или передать только ссылку на массив, чтобы его весь не копировать?
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. ![]() Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
namervasek |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 3.12.2007 Репутация: нет Всего: нет |
эм..
вкратце надо так
sort - сортирует "любой" массив (ну не любой а только целочисленые) т.е. я хочу сделать так что бы не передавать при этом размер элемента. При такой передачи параметров мне нужен pointer |
|||
|
||||
Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 9 Всего: 54 |
pointer всего лиш ссылка на память никак не структурированную... из поинтера никак не узнаеш что там за массив
можно использовать массив с поинтервми или TList где каждый элимент ссылка на объеки или структуру или ... Добавлено через 7 минут и 12 секунд можно в 0 байте массива писать размер элимента как в стринге в 0 индексе лежит его размер ИМХО само лучшее решение - еще один параметр в процедуру sort -------------------- Кольцов Виктор Владимирович |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Эммм.... я бы предложил посмотреть JCL... и её функции по сортировки произвольных массивов... там та же идея.
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
namervasek |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 3.12.2007 Репутация: нет Всего: нет |
CodeMonkey, неподскажешь имя модуля где они реализованы, а то вчера пол ночи потратил найти не смог.
|
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Я в процессе переезда на Win7, JCL пока не установил
![]() -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |