Re[10]: Странный баг Delphi XE8
От: Khimik  
Дата: 30.08.23 11:05
Оценка:
Здравствуйте, 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) возвращается нулевым. Надеюсь я не ступил и не совершил совсем явную ошибку, а тут что-то со спецификой стандартных динамических массивов — я до сих пор не знаю, что они такое и можно ли давать на них ссылки.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.