Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.07;
Скачать: CL | DM;

Вниз

Сохранение указателей на элементы дин. массива после расширения   Найти похожие ветки 

 
Mx ©   (2005-07-18 17:50) [0]

Не судите строго, достал я уж всех с ReallocMem, но... Он меня тоже! Представьте ситуацию:

type
 PSomething = ^TSomething;
 TSomething = record
 ...
 end;

var
 D: array of TSomething;
 P: PSomething;
 I, N: Integer;
begin
 ...
 for I := 1 to N do
 ...
   SetLength(D, Length(D) + 1);
   P[I] = @D[I];
 ...
end;

Насколько я понимаю, SetLength по-любому обратится к ReallocMem, и адреса возможно поменяются. Конечно, можно ввести дополнительный список или "зашиваться" на идексы... А есть ли возможность избежать изменения указателя на элементы динамического массива? И еще: если ReallocMem работает в сторону уменьшения объема памяти, гарантирует ли мне это сохранность адресов?

Спасибо.


 
begin...end ©   (2005-07-18 17:53) [1]

> Mx ©   (18.07.05 17:50)

> PSomething = ^TSomething
> TSomething = record
> ...
> P[I] = @D[I];

Не понял.


 
Digitman ©   (2005-07-18 17:54) [2]


> есть ли возможность избежать изменения указателя на элементы
> динамического массива?


гарантированно ? только при изобретении своего велосипеда с именем "менеджер памяти"


> если ReallocMem работает в сторону уменьшения объема памяти,
> гарантирует ли мне это сохранность адресов?


сабж недокументирован и полагаться на это не следует.


 
Big Joe   (2005-07-18 17:57) [3]

:)) здесь не соскучишься..


 
begin...end ©   (2005-07-18 17:57) [4]

> Mx ©   (18.07.05 17:50)

> Конечно, можно ввести дополнительный список или
> "зашиваться" на идексы...

Вот я бы и выбрал второй вариант.


 
Fay ©   (2005-07-18 18:03) [5]

2 Mx ©   (18.07.05 17:50)
Не хотелось бы показаться занудой, но зачем делать SetLength в цикле?!


 
Mx ©   (2005-07-18 18:08) [6]


> Fay ©   (18.07.05 18:03) [5]
> Не хотелось бы показаться занудой, но зачем делать SetLength
> в цикле?!

Ну там неизвестно точное количество, реально не for, а while. Я просто пример привел.


> begin...end ©   (18.07.05 17:53) [1]
> > P[I] = @D[I];
> Не понял.

А ну да, я для примера написал. Смысл в том, что присваивается указатель.


> Digitman ©   (18.07.05 17:54) [2]
> сабж недокументирован и полагаться на это не следует.

Очень жаль... очень! Правда мои тесты показали, что "все сохраняется".


> гарантированно ? только при изобретении своего велосипеда
> с именем "менеджер памяти"

Хватит с меня "велосипедов" :)


> begin...end ©   (18.07.05 17:57) [4]
> Вот я бы и выбрал второй вариант.

Ну что ж, если больше предложений не будет, то я тоже выберу этот вариант :)


 
Digitman ©   (2005-07-18 18:13) [7]


> жаль... очень! Правда мои тесты показали, что "все сохраняется".


эту байду будешь потоим рассказывать своему заказчику, заплатившему тебе и поимевшему в какой то момент проблемы.


> Хватит с меня "велосипедов"


тогда бери на вооружение TBits и либо используй его as is либо бери выборки из его далеко не самого плохого кода себе на вооружение


 
Юрий Зотов ©   (2005-07-18 18:13) [8]

> Mx ©   (18.07.05 18:08) [6]

Зачем здесь вообще нужны указатели? Есть массив, у его элементов есть индексы - больше, вроде бы, ничего не требуется.


 
Mx ©   (2005-07-18 21:37) [9]


> Юрий Зотов ©   (18.07.05 18:13) [8]
> Зачем здесь вообще нужны указатели?

Требуются экземпляры TSomething, только потом указатель на этот массив не найдешь, поэтому я и использую указатели. Но, в силу приведенных постов видимо буду хранить массив и индексы.


> Digitman ©   (18.07.05 18:13) [7]
> эту байду будешь потоим рассказывать своему заказчику, заплатившему
> тебе и поимевшему в какой то момент проблемы.

Да ладно, ладно! Я сообщил о наблюдениях, не более того.


> тогда бери на вооружение TBits

Причем здесь TBits? Если про установку битов, то я все уже сделал и не хуже TBits, так как мне надо меньше функциональности.


 
Fay ©   (2005-07-18 21:41) [10]

2 Mx ©   (18.07.05 21:37) [9]
>> указатель на этот массив не найдешь
и
>> поэтому я и использую указатели
Ничего не понял.


 
Mx ©   (2005-07-18 21:45) [11]

Объясняю...

> Fay ©   (18.07.05 21:41) [10]
> >> указатель на этот массив не найдешь

Указатель на массив.


> >> поэтому я и использую указатели

Указатели на элементы. Мне надо работать с ними. Они только хранятся в этом массиве, их использование совсем с ним не связано. Дело в том, что если бы подобной проблемы не возникло, то такая организация мне более удобна.


 
Fay ©   (2005-07-18 21:46) [12]

2 Mx ©   (18.07.05 21:45) [11]
А TList чем не угодил?


 
Mx ©   (2005-07-18 21:53) [13]


> Fay ©   (18.07.05 21:46) [12]
> А TList чем не угодил?

Ну я же написал: "если бы подобной проблемы не возникло". Экземпляры используются эээ... "автономно", то что они лежат в одном массиве необходимо лишь для объекта, который потом все это уничтожит. Я понимаю, что TList это хороший класс и я его много где использую, но здесь мне кажется он не к месту.


 
Юрий Зотов ©   (2005-07-18 22:19) [14]

> "если бы подобной проблемы не возникло".
> TList это хороший класс... здесь мне кажется он не к месту.

А мне кажется, что никакой проблемы и не возникало. Ее зачем-то придумали.


 
evvcom ©   (2005-07-19 08:56) [15]

Если тебе нужны указатели, то уйди от динамического массива записей и перейди на
1. Массив указателей.
2. TList/TTreeView или может еще что-то подобное.
3. Просто связанный список.
Выделяй/освобождай память через New/Dispose и запоминай его в соответствующем списке.
Это гарантированно избавит тебя от изменения адресов, а также ненужного копирования содержимого записей в случае реаллокации массива.


 
Mx ©   (2005-07-19 09:45) [16]


> evvcom ©   (19.07.05 08:56) [15]
> Выделяй/освобождай память через New/Dispose и запоминай
> его в соответствующем списке

Этот способ мне лучше всего подходит! Тем более, что в одном месте я уже заменил дин.массив записей на дин.массив указателей (правда с другой целью). Да, так и сделаю.


 
evvcom ©   (2005-07-19 09:51) [17]


> Выделяй/освобождай память через New/Dispose и запоминай
> его в соответствующем списке

Конечно же её. Мысли опережают удары пальцами по клаве, о чем только не передумаешь, пока набираешь текст. Отсюда и нестыковка родов/падежей. :)



Страницы: 1 вся ветка

Текущий архив: 2005.08.07;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.052 c
1-1121694103
Punch
2005-07-18 17:41
2005.08.07
TreeView с ChekBox оми.


14-1121622557
}|{yk
2005-07-17 21:49
2005.08.07
Поздравляю Подгорецкого!


14-1121257857
Digitman
2005-07-13 16:30
2005.08.07
IntraWeb + JavaScript


1-1121773434
msguns
2005-07-19 15:43
2005.08.07
События динамически создаваемых объектов


14-1121313940
Некто
2005-07-14 08:05
2005.08.07
Какие компьютеры у вас (дом, работа)?