zHz00 Untitled

среда, 12 ноября 2014
23:45 Эффект бабочки
В программе был список из некоторых элементов. В процессе его обработки я часть элементов копировал в другие места списка. Список расширялся.

Потом я стал модифицировать список. Некоторые элементы получили новые значения.

На определённом этапе я обнаружил, что элементы списка содержат неожиданные данные. А именно: я изменил лишь один элемент списка некоторого типа, однако по факту изменились все элементы этого типа. Хмм...

Догадались?

Это, оказывается, был список указателей на об'екты. И при копировании я копировал тоже указатели, а не создавал новые элементы. Таким образом, изменение одного элемента внешне изменяло все, которые на него ссылались (то есть, все, которые я как бы "скопировал").

@темы: Программирование

URL
Прошел AvP Отстой :( но местами страшно ;) Жду SS2...
Ой, дайлап-дайлаа-аап, Не-е дайлааапь меня-яаа, Не-е ...
Они меня просто преследуют! Попробуйте вообразить картинк...
http://www.khakasia.ru/gallery/gall...?id=474&l=r ...
Сегодня ехал домой на трамвае. Рядом сидели какой-то...
Доели лося, который вчера подошел к нашему костру погреть...

13.11.2014 в 20:46

13.11.2014 в 20:46
Пичальная история, легко вляпаться, не так просто лечить последствия, но на стадии дебага терпимо...
URL

13.11.2014 в 21:38

13.11.2014 в 21:38
Knows Ajed, к счастью, выход такой ошибки за пределы отладки крайне затруднён. По крайней мере, если модификации данных не носят единичный характер. Вообще, я просто не осознавал, что это указатели, хотя обращался к ним через стрелку. Если бы осознавал, такого бы не случилось. А вот почему не осознавал -- вопрос. Переменную со списком делал не я, поэтому я использовал её готовую -- может быть, поэтому.
URL

13.11.2014 в 22:07

13.11.2014 в 22:07
zHz00, вообще, со стрелкой у меня была похожая проблема - она почему-то "приучала к мысли", что тут, вроде как, и не пахнет "низкоуровневым", "плебейским" указателем, а вполне всё такое объектное, "само собой делающееся" - типа где-то ко всему этому где-то прикручены конструкторы копирования и т.д. Ан, ведь, нет.
URL

13.11.2014 в 22:52

13.11.2014 в 22:52
Knows Ajed, кстати, в Делфи в этом смысле хуже. Там доступ через указатель и через объект -- всё точка. Она автоматом определяет -- указатель или нет и разыменовывает его, либо не разыменовывает. Облегчается дело тем, что все объекты классов нужно создавать, насколько я помню. Как непосредственные объекты остаются только записи.
Т.е.:

type
CType1=record
// описания полей
end;
CType2=class
// описание полей и методов
end;

var
c1:CType1;
// c1 -- обычная переменная
c2:CType2;
// думаете, c2 -- переменная? нет, указатель!

begin
c2= CType2.Create;
//выделение памяти
c2.field1:=2;
с2.Method;//вызов метода

c1.field1:=3;
// а тут можно ничего не создавать
//...
URL

15.11.2014 в 03:27

15.11.2014 в 03:27
zHz00, ну, у дельфей своя специфика, с паскалевских времён. Оно ведь вообще изначально задумывалось как хороший, качественный язык для обучения программированию. И object pascal был вынужден жить с необходимостью обратной совместимости эм... парадигмы программирования с "предками". Впрочем, кому я рассказываю... % ) Я бы ещё Пушкину про стихи пошёл лекции читать.

Это, как его. Лично мне дельфевский подход нравится меньше. Сишный в этом плане несколько "честнее", хотя, конечно, и значительно более "неопределённый", пожалуй. Как говорится, тысяча и один способ выстрелить в ногу. Не обязательно себе.
URL
Добавить комментарий

Расширенная форма

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail