agmarchuk / PolarDemo

1 stars 0 forks source link

Исправить ошибку по реализации union #6

Closed agmarchuk closed 11 years ago

agmarchuk commented 11 years ago

Юрий, я посмотрел твои переделки, связанные с введением Read/WriteAtomFromLong. Честно говоря, я уже не помню что имел ввиду, когда писал в комментариях про ошибку. Но то, что ты сделал, лучше немного переделать. Дело в том, что кроме записи и чтения структурного значения, есть еще "передвигание" указателя для структур PxEntry. В случае объединения, это методы UElement и UElementUnchecked. После их отработки, система "не знает" и "не должна знать", что ранее было объединение - указатель будет установлен на начало подструктуры. В случае атома, указатель передвинется на 1 байт, см. строчки 82 и 96. И вот тут, при твоей реализации, будут неправильно считываться данные для булевского, символьного и целого типов. Это довольно просто исправить для булевского и целого типов, просто надо писать как "положенно". Для булевского - в первый байт - не знаю что именно, я пользуюсь системной реализацией ReadBool() и Write(bool). Для целого - надо сначала записать целое, а потом уж нуль. Для символов - ты что-то перемудрил. Сначала пишешь 7 (!) байтов, потом записываешь символ, т.е. еще два (!) байта. Наверное, лучше сначала записать двухбайтный символ, потом, если надо, дополнить оставшееся место нулями. Ну и соответственные изменения при чтении. У нас тестов с такой спецификой нет, поэтому эти ошибки трудновыявляемые. Будь внимателен!