23:45
Эффект бабочки
В программе был список из некоторых элементов. В процессе его обработки я часть элементов копировал в другие места списка. Список расширялся.
Потом я стал модифицировать список. Некоторые элементы получили новые значения.
На определённом этапе я обнаружил, что элементы списка содержат неожиданные данные. А именно: я изменил лишь один элемент списка некоторого типа, однако по факту изменились все элементы этого типа. Хмм...
Догадались?
Это, оказывается, был список указателей на об'екты. И при копировании я копировал тоже указатели, а не создавал новые элементы. Таким образом, изменение одного элемента внешне изменяло все, которые на него ссылались (то есть, все, которые я как бы "скопировал").
Потом я стал модифицировать список. Некоторые элементы получили новые значения.
На определённом этапе я обнаружил, что элементы списка содержат неожиданные данные. А именно: я изменил лишь один элемент списка некоторого типа, однако по факту изменились все элементы этого типа. Хмм...
Догадались?
Это, оказывается, был список указателей на об'екты. И при копировании я копировал тоже указатели, а не создавал новые элементы. Таким образом, изменение одного элемента внешне изменяло все, которые на него ссылались (то есть, все, которые я как бы "скопировал").
13.11.2014 в 20:46
13.11.2014 в 21:38
13.11.2014 в 22:07
13.11.2014 в 22:52
Т.е.:
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;
// а тут можно ничего не создавать
//...
15.11.2014 в 03:27
Это, как его. Лично мне дельфевский подход нравится меньше. Сишный в этом плане несколько "честнее", хотя, конечно, и значительно более "неопределённый", пожалуй. Как говорится, тысяча и один способ выстрелить в ногу. Не обязательно себе.