Здравствуйте, swame, Вы писали:
S>Ну например ты используешь старый недженериковый TList для хранения объектов определенного класса.
S>Потом поменял тип хранящихся там объектов, например вместо класа теперь там контейнер, включающий этот класс.
S>НО в каком-то месте кода забыл поправить.
S>При обращении приводишь объект скобочками , и меняещь значение поля. В этом случае не будет ни ошибок компиляции,
S>а может и не быть AV, но где-то произвольном месте памяти запортились данные. Такие ошибки сложно находить.
S>Если же класс из TLISt получаешь через as то сразу возникнет исключение, легко найти ошибку.
Это очень интересно, но честно говоря я не знаю что такое контейнер. В то же время я сейчас копаюсь в старом дерьмокоде, написанном 20 лет назад, и там на это наткнулся. Есть tlist, в нём хранятся ссылки на классы. Раньше было:
function TFragmentNode.GetSubItem(index: integer): tfragmentnode;
begin
result:=tfragmentnode(fsubitems[index]);
end;
fsubitems это tlist, tfragmentnode это класс. Попробовал поменять скобку на as и стала срабатывать ошибка Operator not applicable in this operand type.
Сейчас появилась какая-то новая ошибка в этом модуле, не знаю связана она с этим или нет. При чтении содержимого класса tfragmentnode из файла выполняется код
if fwithdata then begin
new(fdata);
loadfragmentfromstream(fdata,stream)
end
При записи соответственно код
if fwithdata then
addfragmenttostream(fdata,stream)
fdata это указатель на рекорд, содержащий два стандартных динамических массива. И сейчас при записи в файл часть данных этого рекорда записываются правильно, но массивы оказываются пустыми. Ещё раз, как выглядит чтение в процедуре LoadFragmentFromStream:
stream.Read(intbuff,sizeof(intbuff));
setlength(fragment^.atoms,intbuff);
После этого на записи length(fragment^.atoms) возвращается нулевым. Надеюсь я не ступил и не совершил совсем явную ошибку, а тут что-то со спецификой стандартных динамических массивов — я до сих пор не знаю, что они такое и можно ли давать на них ссылки.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен