|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
24.08.2009, 22:49 | #1 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Размер динамического массива не через Length
Я уже, кажется, спрашивал, но так и не разобрался, а проблема актуальна. Может чё нового скажите.
Как, не используя функции Length и High, узнать размер динамического массива или строки. |
24.08.2009, 23:17 | #2 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Сохранить в допольнительной переменной (например integer) тот самый размер массива, в месте где Вы и выделяите место в памяти под массив. Разве не логично ? Или язые за вас все должен делать ?
|
24.08.2009, 23:46 | #3 | |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Цитата:
Менеджер памяти (так вроди называется) выделяет память под любую переменну. Эта переменная - по сути указатель на адрес начала данных. Система сама запоминает начало и размер участка памяти выделенную под переменную. Этот размер она и проверяет при приведении типов. Зачем мне еще одну переменную вводить. Это ли не нарушение логиги. С простыми типами все соответственно просто. Даже с классами нет ничего сложного. Отступил от указателя на объект 40 байт назад - вот вам и размер объекта. Но с динамическими массивами дело обстоит иначе. Перебрал все доступное адресное пространство (ну или точнее - все доступное адресное пространство в моем понимании) и не нашел ни одного указателя, который можно было бы интерпритировать, как размер строки: 1. Создал строку S размером N 2. Перебрал все указатели от @S вниз и вверх до ошибки (я с памятью работаю весьма посредственно). 3. Сравнил все PInteger (@S+d)^ на равенство N НЕ НАШЕЛ. Не, ну были конечно, но это чистое совпадение. Ни какой закономерности. ВОПРОС: Как, собственно, система узнает размер массива. Может быть она хранит размеры динамических массивов, как особо важную информацию, вне адресного пространства программы. |
|
24.08.2009, 23:54 | #4 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Строка - в Windows это место в памяти которое является последовательностью символов до нулевого. Таким образом можно определить размер (длину) строки.
Что на счет массива, это место в куче, и то какого размера оно, к сожалению где то было у меня, как зная Pointer получить размер под выделеную память по этому указателю (имеется ввиду GetMem & FreeMem). Точно не скажу, но помниматься именно интепритируемый физический адресс в адрессное пространство приложения (0x00000000 - 0xffffffff в 32х) сам адресс уже хранит размер выделенного пространства (в этом я не уверен, т.к. найти доказательства не могу, а плюс к этому google не отменяли) Собственно, с другой стороны, зачем надо выдумывать, если вам предложена Length и т.п. ? Последний раз редактировалось BOBAH13; 24.08.2009 в 23:58. |
25.08.2009, 00:08 | #5 | |||
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Цитата:
Цитата:
P.S.: На счет Цитата:
Код:
как зная Pointer получить размер под выделенную память по этому указателю нашел Код:
Последний раз редактировалось Stilet; 25.08.2009 в 08:43. |
|||
25.08.2009, 08:21 | #6 | ||
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
Цитата:
Код:
Цитата:
|
||
25.08.2009, 22:48 | #7 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Спасибо, alexBlack и BOBAH13.
Какая же все-таки глупая ошибка. Совсем забыл, что строка - это и есть указатель. Теперь все работает: Код:
|
26.08.2009, 10:52 | #8 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
Весь блок, выделенный под массив, получен вызовом GetMem (вызывается из SetLength). Следовательно, для ссылки (a-8) можно получить размер блока вызовом GetPointerSize, которую Вы приводили выше.
Код:
Судя по всему был изменен менеджер памяти и приведенная выше функция GetPointerSize, например, в Delphi 10 работает только для больших блоков. Поэтому в примере взят такой размер. Для малых блоков по смещению -4 хранится ссылка на внутреннюю структуру и уже в ней, вероятно, размер. |
26.08.2009, 14:04 | #9 |
Oldschool geek
Форумчанин
Регистрация: 09.03.2009
Сообщений: 611
|
В Delphi можно подменить менеджер памяти, например, ShareMM и FastMM так делают. Можно подменить менеджер памяти на свою отладочную версию, и затем консультироваться с отладочной версией по поводу размеров блоков. Возможно, такой отладочный менеджер памяти уже идёт в комплекте.
|
29.08.2009, 19:42 | #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 |