![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
указатели
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 чем не устраивает ?