Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2010, 13:33   #1
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию Установка размера динамического

(Не дописал название :-) "Установка размера динамического массива")
Здравствуйте, уважаемые форумчане!
Вопрос: возможно ли, имея адрес динамического массива(но не саму переменную), установить SetLength'ом новый размер? Что-то вроде:
Код:
TObj = class
a: array of integer;
end;
var o: TObj;
p: pointer;
begin
p:=@o.a;
SetLength(p^,2);//?????
end.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 09.08.2010, 13:36   #2
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

А зачем брать адрес динамического массива, если переменная типа динмассив и так указатель? Не веришь? Проверь чему равен SizeOf(a) и убедись, что он равен SizeOf(Pointer) независимо от размера данных в массиве

PS: Для спарвки - переменные типа строки (string) и динамические массивы - это указатели, которые содержат либо nil, либо указатель на первый (нулевой для динмассива) элемент массива (символ строки), а сам массив расположен в динамической памяти. По отрицательному смещению от первого элемента лежат сервисные данные - длина и указатель на счетчик ссылок:
Код:
 [переменная типа динмассив]
                             |
                             V
[счетчки][длина][элемент_0][элемент_1]........

Последний раз редактировалось Ins; 09.08.2010 в 13:41.
Ins вне форума Ответить с цитированием
Старый 09.08.2010, 13:44   #3
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Спасибо, это мне прекрасно известно, как и структура динамического массива. Я не это спрашивал, а то, что написано в посте: можно ли стандартным SetLength, имея указатель на переменную дин. массива, установить его длину.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 09.08.2010, 13:48   #4
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Можно, и я даже знаю как Но все-таки, для профилактики плохого кода, зачем тебе указатель на указатель? Нужен указатель - передай Pointer(a), а не @a
Ins вне форума Ответить с цитированием
Старый 09.08.2010, 13:49   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Selestis
Если не секрет почему именно через указатель?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.08.2010, 13:53   #6
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Ладно, дам Hint: объяви не a: array of Integer, а a: TIntegerArray, где TIntegerArray = array of Integer; Заведи тип PIntegerArray = ^TIntegerArray, а дальше вспомни про приведение типов, Pointer разадресовывать крышечкой нельзя, а типизированный указатель - можно
Ins вне форума Ответить с цитированием
Старый 09.08.2010, 13:56   #7
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Не секрет: есть динамически заполняемые поля у объекта, причем значения берутся из файла вместе со структурой (для разных типов), => поля заполняются по смещению указателя на объект в зависимости от размера предыдущих полей, одним из которых может являться дин. массив, который надо заполнить.
Кажется, ни фига не понятно я объяснил, но как смог)

Ins
Это конечно неплохо, и я опять же это знал) ПРоблема в том, что тип элементов массива мне неизвестен))) Я просто думал, что SetLength как-то может это определить это по данным лежащим в указателе и сразу всё сделать...
Изобретатель велосипедов

Последний раз редактировалось Stilet; 09.08.2010 в 14:02.
Selestis вне форума Ответить с цитированием
Старый 09.08.2010, 14:00   #8
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Если я правильно понял, твой код жестко привязан к смещению полей в объекте? Если так, то КАКОЙ УЖАС! Т.е. если я потом где-то внесу новое поле в объект, сместив позиции старых, то код загрузки параметров "поплывет"? Если ты делаешь что-то типа десериализации, глянь это:
http://www.delphikingdom.com/asp/vie...catalogid=1379
Ins вне форума Ответить с цитированием
Старый 09.08.2010, 14:03   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
заполняются по смещению указателя на объект
А если смещение неверно окажется? Если ты поле еще какое добавишь в класс?
Не очень это хорошая идея, ИМХО, я бы по другому делал...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.08.2010, 14:11   #10
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Код загрузки поплывёт только в том случае, если параметры загрузки забыть подкорректировать, чего у меня, к счастью, не произойдёт из-за самого принципа проекта... Сейчас пытаюсь въехать в написанное в статье из королевства, но пока особо ничего заманчивого не нашел, буду читать дальше)
Изобретатель велосипедов

Последний раз редактировалось Selestis; 09.08.2010 в 14:17. Причина: орфография
Selestis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание динамического Comboboxа ! web_lover Microsoft Office Excel 6 24.06.2010 23:02
Зависимость размера рисунка от размера формы Hippie Мультимедиа в Delphi 3 18.05.2010 10:46
Поиск динамического Memo Fezilk Общие вопросы Delphi 7 26.08.2009 20:39
Изменение размера динамического массива налету Zeraim Общие вопросы Delphi 12 26.07.2009 14:23
сортировка динамического списка new_sergei Помощь студентам 1 19.12.2008 00:36