Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.042 c
1-1121944216
Profik
2005-07-21 15:10
2005.08.07
Обработка нажатия стандартной кнопки Свернуть


14-1120933199
lookin
2005-07-09 22:19
2005.08.07
Я атеист. Вы? (Да/Нет)


14-1121170593
deep
2005-07-12 16:16
2005.08.07
Оцените дизайн и юзабилити, выскажите свое ИМХО


6-1114766778
Filin8
2005-04-29 13:26
2005.08.07
TcpServer


3-1119858325
_Max
2005-06-27 11:45
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский