Форум: "Начинающим";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];
Внизуказатели Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c