Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

указатели


Novice ©   (2005-08-10 15:02:00) 

Здравствуйте!
Подскажите новичку. Такой вопрос:
- сделал класс 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'. Что здесь не так?


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

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


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

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


Alexander Panov   (2005-08-10 15:48:00) [3]

Novice   (10.08.05 15:46) [12]

var
 ListObj: TList;

...

ListObj := TList.Create;

ListObj.Add(TSTObj.Create);

и.т.д.


Digitman   (2005-08-10 15:48:00) [4]


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


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


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

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

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


Alexander Panov   (2005-08-10 15:43:00) [6]

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


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


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

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


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


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


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

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

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


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

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


Erik1   (2005-08-10 15:28:00) [11]

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


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

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


ANB   (2005-08-10 15:14:00) [13]


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


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

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


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


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


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

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

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

?


ANB   (2005-08-10 15:04:00) [16]


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо