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

Вниз

указатели   Найти похожие ветки 

 
Novice   (2005-08-10 15:02) [0]

Здравствуйте!
Подскажите новичку. Такой вопрос:
- сделал класс TStObj
- массив экземпляров класса d1: array of TStObj
- создал и заполнил массив d1
- создал указатель elem: pointer и UK = ^TStObj, чтобы в программе по названию указателя elem обращаться к i-му элементу массива d1:
 elem:=@d1[i];
 UK(elem)^.name:="something";

Таким образом код работает и заносит "something" в поле name объекта класса в массиве d1[i]. Но пытаясь получить значение этого поля в дальнейшем - возникает ошибка EAccessViolation, при наведении курсора в режиме отладки пишет "UK(elem)^ = Inaccessible value". Что здесь не так?


 
ANB ©   (2005-08-10 15:04) [1]


>  elem:=@d1[i];
>  UK(elem)^.name:="something";
- а зачем так изгаляться ? d1[i].name чем не устраивает ?


 
Digitman ©   (2005-08-10 15:05) [2]


> - создал указатель elem: pointer и UK = ^TStObj, чтобы в
> программе по названию указателя elem обращаться к i-му элементу
> массива d1:
>  elem:=@d1[i];
>  UK(elem)^.name:="something";


и для чего все эти премудрости ?

чем не устроило

d1[i].Name :="something";

?


 
Novice   (2005-08-10 15:11) [3]

дело в том, что в массиве d1 много разных элементов, которые в процессе работы программы создаются, удаляются, и соответственно индексы будут меняться. А таким образом я хотел обращаться к конкретному элементу, не зная его индекса в массиве.


 
ANB ©   (2005-08-10 15:14) [4]


> Novice   (10.08.05 15:11) [3]
- после первого же изменения размерности для массива будет отведена новая область памяти и адреса всех элементов изменятся. И будешь ловить AV.


 
Novice   (2005-08-10 15:17) [5]

А есть какой-нибудь способ найти элемент в массиве, не зная его индекса?


 
Erik1 ©   (2005-08-10 15:28) [6]

Способов то много, например воспользоватся твом(запомнить адрес в памяти) или вычислить этот адрес, что собствено говоря и происходит при обрашении по индексу(весьма эфективно) BaseAdr + ElemSize*Index :)


 
Novice   (2005-08-10 15:33) [7]

так я же не знаю ни индекса, ни ElemSize?


 
ANB ©   (2005-08-10 15:40) [8]


> Novice   (10.08.05 15:33) [7]
- а зачем терять индекс ? Или ищи перебором по имени, но это будет дольше.


 
Anatoly Podgoretsky ©   (2005-08-10 15:40) [9]

Novice   (10.08.05 15:11) [3] А таким образом я хотел обращаться к конкретному элементу, не зная его индекса в массиве.

А как это тогда понимать? elem:=@d1[i];


 
Novice   (2005-08-10 15:42) [10]

А можно ли сгруппировать каким-нибудь другим способом (не в массив) объекты одного класса?


 
Alexander Panov ©   (2005-08-10 15:43) [11]

Novice   (10.08.05 15:42) [10]
А можно ли сгруппировать каким-нибудь другим способом (не в массив) объекты одного класса?


Можно, это, например, TList,TStringList,TObjectList...


 
Novice   (2005-08-10 15:46) [12]

> А как это тогда понимать? elem:=@d1[i];

я когда создаю элемент и заношу его в массив, то в переменную elem заношу (заносил) адрес i-го элемента, чтобы в последствии его найти, когда индексы поменяются..


 
Alexander Panov ©   (2005-08-10 15:48) [13]

Novice   (10.08.05 15:46) [12]

var
 ListObj: TList;

...

ListObj := TList.Create;

ListObj.Add(TSTObj.Create);

и.т.д.


 
Digitman ©   (2005-08-10 15:48) [14]


> можно ли сгруппировать каким-нибудь другим способом (не
> в массив) объекты одного класса?


TObjectList позволяет легко управлять списком объектов хоть одного и того же хоть разных классов .. для того он и предназначен был изначально ..


 
Novice   (2005-08-10 15:53) [15]

Спасибо! Наверное, это решение проблемы!


 
Anatoly Podgoretsky ©   (2005-08-10 16:12) [16]

Novice   (10.08.05 15:46) [12]
Когда индексы поменяются, то указатель будет уже неверным.



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

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

Наверх




Память: 0.5 MB
Время: 0.037 c
14-1124261289
Lexer
2005-08-17 10:48
2005.09.18
Посоветуйте стиральную машину


2-1123753919
Praktikant
2005-08-11 13:51
2005.09.18
Четвертая кнопка в правом верхнем углу


1-1124785381
volser
2005-08-23 12:23
2005.09.18
Как приостановить поток?


14-1124384456
maximsm
2005-08-18 21:00
2005.09.18
Win XP права пользоваелей


14-1124634179
Yegorchic
2005-08-21 18:22
2005.09.18
Вопрос по в Word у