Здравствуйте, Pavel Dvorkin, Вы писали:
PD> H>Зачем инкаешь TBytes? Поломаешь поинтер будет зяка-зяка
PD> А с чего это я его поломаю ? Прибавление числа к указателю его сдвигает, вот и все.
TBytes это не просто указатель. Это указатель на динамический массив, а динамические массивы это типы с управляемым временем жизни и поэтому имеют еще и заголовок (подробности в справке по словам Internal Data Formats) находящийся в отрицательных смещениях от указателя. При присваивании, изменении размера и удалении динамических массивов компилятор модифицирует поля заголовка. Из приведенного кода не понятно, что там за Buffer который присваивается Current, но понятно, что когда Current выйдет за пределы видимости, компилятор будет уменьшать счетчик ссылок на динамический массив (т.е. на Current) и в зависимости от мусора расположенного перед Current (ты ведь изменил указатель) может попытаться его удалить (будет эксепшен), а иначе просто испортит данные декрементом счетчика ссылок.
Здравствуйте, Jolly Roger, Вы писали:
JR> PD>Сделал отдельный тест — работает. Вставляю код твой без изменения в программу — ERangeCheckError. Мистика. JR> PD>Что-то с опциями ? Или влияет то, что у меня проект не консольный ? Хотя это уж совсем странно.
JR> ERangeCheckError, ЕМНИП, опциями отключается, в том числе и в свойствах проекта.
Здравствуйте, Jolly Roger, Вы писали:
JR>Здравствуйте, Pavel Dvorkin, Вы писали:
JR>Я, признаться, недопонял, чем Вас MMF не устроил. Кроссплатформенность?
Вполне устроит, но я вроде и штатными средствами Delphi обошелся.
Здравствуйте, hattab, Вы писали:
H>TBytes это не просто указатель. Это указатель на динамический массив, а динамические массивы это типы с управляемым временем жизни и поэтому имеют еще и заголовок (подробности в справке по словам Internal Data Formats) находящийся в отрицательных смещениях от указателя. При присваивании, изменении размера и удалении динамических массивов компилятор модифицирует поля заголовка. Из приведенного кода не понятно, что там за Buffer который присваивается Current, но понятно, что когда Current выйдет за пределы видимости, компилятор будет уменьшать счетчик ссылок на динамический массив (т.е. на Current) и в зависимости от мусора расположенного перед Current (ты ведь изменил указатель) может попытаться его удалить (будет эксепшен), а иначе просто испортит данные декрементом счетчика ссылок.
Наверное, ты прав, хотя все это работало. Но лучше, действительно, не рисковать, тем более, что последний раз с Delphi я работал в прошлом тысячелетии , и все позабыл. А жаль. Хорошая, в общем, среда, к тому же нативная, на фоне всех этих управляемых сред.
Спасибо за помощб еще раз. В общем, вернул твой код , запретил ERangeCheckError — вроде читает.
Здравствуйте, Jolly Roger, Вы писали:
JR> ERangeCheckError, ЕМНИП, опциями отключается, в том числе и в свойствах проекта.
Несмотря на минус смею настаивать на своем мнении. Этот эксепшн не просто так возникает, видимо есть тому причина. Лучше причину таки найти, а не "лечить" симптомы.
Здравствуйте, hattab, Вы писали:
H>Несмотря на минус смею настаивать на своем мнении. Этот эксепшн не просто так возникает, видимо есть тому причина. Лучше причину таки найти, а не "лечить" симптомы.
"Минус" не за само мнение, а за отсутствие его связи с моим постом. Павел спросил, как может быть, что поведение отличается в разных проектах. На этот вопрос я и отвечал, правильность или неправильность использования данной опции не обсуждалось вообще. Ваше же мнение сформулировано так, будто я предлагал сделать что-то нехорошее.