![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]()
Я уже, кажется, спрашивал, но так и не разобрался, а проблема актуальна. Может чё нового скажите.
Как, не используя функции Length и High, узнать размер динамического массива или строки. |
![]() |
![]() |
![]() |
#2 | |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
![]() Цитата:
![]() |
|
![]() |
![]() |
![]() |
#3 | |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]() Цитата:
Менеджер памяти (так вроди называется) выделяет память под любую переменну. Эта переменная - по сути указатель на адрес начала данных. Система сама запоминает начало и размер участка памяти выделенную под переменную. Этот размер она и проверяет при приведении типов. Зачем мне еще одну переменную вводить. Это ли не нарушение логиги. С простыми типами все соответственно просто. Даже с классами нет ничего сложного. Отступил от указателя на объект 40 байт назад - вот вам и размер объекта. Но с динамическими массивами дело обстоит иначе. Перебрал все доступное адресное пространство (ну или точнее - все доступное адресное пространство в моем понимании) и не нашел ни одного указателя, который можно было бы интерпритировать, как размер строки: 1. Создал строку S размером N 2. Перебрал все указатели от @S вниз и вверх до ошибки (я с памятью работаю весьма посредственно). 3. Сравнил все PInteger (@S+d)^ на равенство N НЕ НАШЕЛ. Не, ну были конечно, но это чистое совпадение. Ни какой закономерности. ВОПРОС: Как, собственно, система узнает размер массива. Может быть она хранит размеры динамических массивов, как особо важную информацию, вне адресного пространства программы. |
|
![]() |
![]() |
![]() |
#4 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
![]()
Строка - в Windows это место в памяти которое является последовательностью символов до нулевого. Таким образом можно определить размер (длину) строки.
Что на счет массива, это место в куче, и то какого размера оно, к сожалению где то было у меня, как зная Pointer получить размер под выделеную память по этому указателю (имеется ввиду GetMem & FreeMem). Точно не скажу, но помниматься именно интепритируемый физический адресс в адрессное пространство приложения (0x00000000 - 0xffffffff в 32х) сам адресс уже хранит размер выделенного пространства (в этом я не уверен, т.к. найти доказательства не могу, а плюс к этому google не отменяли) Собственно, с другой стороны, зачем надо выдумывать, если вам предложена Length и т.п. ? Последний раз редактировалось BOBAH13; 24.08.2009 в 23:58. |
![]() |
![]() |
![]() |
#5 | |||
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]() Цитата:
![]() Цитата:
![]() P.S.: На счет Цитата:
Код:
как зная Pointer получить размер под выделенную память по этому указателю нашел Код:
Последний раз редактировалось Stilet; 25.08.2009 в 08:43. |
|||
![]() |
![]() |
![]() |
#6 | ||
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]() Цитата:
Код:
Цитата:
|
||
![]() |
![]() |
![]() |
#7 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]()
Спасибо, alexBlack и BOBAH13.
Какая же все-таки глупая ошибка. Совсем забыл, что строка - это и есть указатель. Теперь все работает: Код:
|
![]() |
![]() |
![]() |
#8 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]()
Весь блок, выделенный под массив, получен вызовом GetMem (вызывается из SetLength). Следовательно, для ссылки (a-8) можно получить размер блока вызовом GetPointerSize, которую Вы приводили выше.
Код:
Судя по всему был изменен менеджер памяти и приведенная выше функция GetPointerSize, например, в Delphi 10 работает только для больших блоков. Поэтому в примере взят такой размер. Для малых блоков по смещению -4 хранится ссылка на внутреннюю структуру и уже в ней, вероятно, размер. |
![]() |
![]() |
![]() |
#9 |
Oldschool geek
Форумчанин
Регистрация: 09.03.2009
Сообщений: 611
|
![]()
В Delphi можно подменить менеджер памяти, например, ShareMM и FastMM так делают. Можно подменить менеджер памяти на свою отладочную версию, и затем консультироваться с отладочной версией по поводу размеров блоков. Возможно, такой отладочный менеджер памяти уже идёт в комплекте.
|
![]() |
![]() |
![]() |
#10 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]()
А в каком модуле описана процедура GetPointerSize? У меня Delphi 7.
А-а-а. Нашел. Вы наверное имели в виду вот это: Код:
Последний раз редактировалось Sibedir; 29.08.2009 в 20:04. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Сохранение динамического массива | Horus92 | Помощь студентам | 3 | 07.05.2009 12:36 |
Удаление динамического массива | Сергей089 | Общие вопросы C/C++ | 3 | 08.03.2009 13:13 |
Напомните как задать размер динамического массива | Arassir | Помощь студентам | 4 | 08.03.2009 13:02 |
Удаление элементов из динамического массива | dashulka | Общие вопросы Delphi | 4 | 31.10.2008 14:03 |
Удаление элемента динамического массива | Dogmat | Помощь студентам | 6 | 13.07.2008 14:33 |