Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.023 c
14-1124530493
Иксик
2005-08-20 13:34
2005.09.18
Нужна помощь при выборе старого советского холодильника


1-1124834927
Сергей Никонов
2005-08-24 02:08
2005.09.18
Разресовка FileListBox а


1-1125131565
Rb
2005-08-27 12:32
2005.09.18
Как проверить установлен ли WinWord


1-1125160974
rolex
2005-08-27 20:42
2005.09.18
Как сделать, чтобы Win9x не искала библиотеку?


4-1122363000
Jupiter
2005-07-26 11:30
2005.09.18
Как узнать размер папки




   Наверх