Текущий архив: 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.49 MB
Время: 0.043 c