Главная страница
    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.49 MB
Время: 0.043 c
10-1098782958
Sash
2004-10-26 13:29
2005.08.07
excel


1-1121527656
Sania
2005-07-16 19:27
2005.08.07
обращение к другой форме


3-1120117274
DDDeN
2005-06-30 11:41
2005.08.07
Последовательный переход к записи


1-1121894484
Grol
2005-07-21 01:21
2005.08.07
Перебор всевозможных сочетаний из символов


4-1115464042
atruhin
2005-05-07 15:07
2005.08.07
Как определить что принтер распечатал документ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский