Странный баг Delphi XE8
От: Khimik  
Дата: 25.08.23 07:22
Оценка:
Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть.
Вернул предыдущий код проекта — снова всё работает. Попытался подменить часть модулей последним кодом — снова перестало работать. После этого вернул эти же модули предыдущими — снова не работает; но если обновить все коды проекта, снова вернуть предыдущий вариант — работает.
Попробовал установить Delphi на другом компьютере, скомпилировал — такая же ошибка.
Заметил ещё одну странность: на одном из модулей (возможно это как раз проблемный модуль, с которого всё пошло) после нажатия F9 возникает синий breakpoint на самой верхней строчке (где название модуля). Убираю этот breakpoint, нажимаю F9 — снова он появляется.
Кто-нибудь с таким сталкивался?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re: Странный баг Delphi XE8
От: Khimik  
Дата: 25.08.23 07:56
Оценка:
Выяснилось, что если выбрать Target platform / Windows 32 и скомпилировать, то запускается нормально. Если же снова выбрать Windows 64, далее Clean, Build, Compile, то опять эта ошибка. Прошу помочь.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re: Странный баг Delphi XE8
От: rudzuk  
Дата: 25.08.23 08:56
Оценка:
Здравствуйте, Khimik, Вы писали:

K> Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть.


Код-то покажешь?
avalon/3.0.2
Re[2]: Странный баг Delphi XE8
От: Khimik  
Дата: 25.08.23 09:16
Оценка:
Здравствуйте, rudzuk, Вы писали:

K>> Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть.


R>Код-то покажешь?


Какой смысл? Код то нормальный, в Win32 версии всё запускается. Сообщение об ошибке возникает там где всё чисто. А весь код я же не могу показать.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[3]: Странный баг Delphi XE8
От: rudzuk  
Дата: 25.08.23 09:24
Оценка: 4 (2) +4 :)
Здравствуйте, Khimik, Вы писали:

K> K>> Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть.


K> R>Код-то покажешь?


K> Какой смысл? Код то нормальный, в Win32 версии всё запускается. Сообщение об ошибке возникает там где всё чисто. А весь код я же не могу показать.


Ну ладно. Тогда сходи к гадалке, она в хрустальный шар посмотрит.
avalon/3.0.2
Re[3]: Странный баг Delphi XE8
От: swame  
Дата: 25.08.23 20:50
Оценка: +1
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, rudzuk, Вы писали:


K>>> Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть.


R>>Код-то покажешь?


K>Какой смысл? Код то нормальный, в Win32 версии всё запускается. Сообщение об ошибке возникает там где всё чисто. А весь код я же не могу показать.


То что в Win32 оно работает, не доказывает что нет ошибок.
Помню при переходах на новые версии Windows в программах обнаруживалиcь баги работы с памятью,
которые на более ранних версиях Windows не проявлялись исчезающе редко, а начинали проявляться из за более строго контроля памяти при обновлении Windows.
Возможно ошибки работы с памятью, при это м ошибка может быть совсем в другом месте, чем выпадает в дебаггере.
У тебя же накручено каких-то велосипедов работы с объектами.
Частая ошибка такого рода неправильно приведении типов черех скобочки а не оператор as. Неправильное приведение типов переменных (особенно уучитывая 64 разрядную версию).
Я бы в перую очередь прогнал программу с FAstMM c включенной опцией CherckHeapForCorruption, начиная с 32 разрядного режима
Узнаешь много удивительного о качестве своей программы

K>Заметил ещё одну странность: на одном из модулей (возможно это как раз проблемный модуль, с которого всё пошло) после нажатия F9 возникает синий breakpoint на самой верхней строчке (где название модуля). Убираю этот breakpoint, нажимаю F9 — снова он появляется.


У меня тоже бывает незванный breakpoint, на первой строке проекта, не знаю отчего это. НО с предыдущим багом вряд ли связан.
Отредактировано 25.08.2023 21:00 swame . Предыдущая версия . Еще …
Отредактировано 25.08.2023 20:58 swame . Предыдущая версия .
Re[4]: Странный баг Delphi XE8
От: Khimik  
Дата: 28.08.23 12:39
Оценка:
Здравствуйте, swame, Вы писали:

S>Я бы в перую очередь прогнал программу с FAstMM c включенной опцией CherckHeapForCorruption, начиная с 32 разрядного режима

S>Узнаешь много удивительного о качестве своей программы

Поставил модуль FastMM, и не очень понятно пока что с ним делать дальше. Извиняюсь за ламерские вопросы, CheckHeapForCorruption это ведь не булева константа, там стоит
{.$define CheckHeapForCorruption}

Нужно убрать точку чтобы это включить? Я так сделал и не увидел изменений, может он куда-то пишет отчёт?
Я пока не знаю что значит $define
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[5]: Странный баг Delphi XE8
От: swame  
Дата: 28.08.23 18:45
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, swame, Вы писали:


S>>Я бы в перую очередь прогнал программу с FAstMM c включенной опцией CherckHeapForCorruption, начиная с 32 разрядного режима

S>>Узнаешь много удивительного о качестве своей программы

K>Поставил модуль FastMM, и не очень понятно пока что с ним делать дальше. Извиняюсь за ламерские вопросы, CheckHeapForCorruption это ведь не булева константа, там стоит

K>{.$define CheckHeapForCorruption}

K>Нужно убрать точку чтобы это включить? Я так сделал и не увидел изменений, может он куда-то пишет отчёт?

K>Я пока не знаю что значит $define

Можно поставить приложение
https://sourceforge.net/projects/fastmm/
и настраивать конфиг визуально,


В случае ошибок работы с памятью (например повторное освобождение объекта) оно будет выкидывать исключения,
лог для это опции не нужен.

Вот ут что-то написано, но тут больше про утечки
https://www.gunsmoker.ru/2009/05/blog-post_24.html

https://www.gunsmoker.ru/2010/03/blog-post.html


И даже свежачок
https://www.gunsmoker.ru/2023/04/librariescomponentsarenottested.html

Мы кстати как альтернативу Эврики используем MadExcept http://madexcept.com
Отредактировано 28.08.2023 19:05 swame . Предыдущая версия . Еще …
Отредактировано 28.08.2023 19:00 swame . Предыдущая версия .
Отредактировано 28.08.2023 18:57 swame . Предыдущая версия .
Отредактировано 28.08.2023 18:50 swame . Предыдущая версия .
Отредактировано 28.08.2023 18:49 swame . Предыдущая версия .
Re: Странный баг Delphi XE8
От: BSOD  
Дата: 28.08.23 19:28
Оценка: :))
Здравствуйте, Khimik, Вы писали:

K>Убираю этот breakpoint, нажимаю F9 — снова он появляется.

Тут уместен анекдот с ключевой фразой "закопайте стюардессу".
Sine vilitate, sine malitiosa mente
Re[6]: Странный баг Delphi XE8
От: Khimik  
Дата: 29.08.23 07:26
Оценка:
Здравствуйте, swame, Вы писали:

S>Можно поставить приложение

S>https://sourceforge.net/projects/fastmm/
S>и настраивать конфиг визуально,

Не понял, какое приложение? По ссылке можно скачать FastMM4991.zip, там нет exe файлов.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re: Странный баг Delphi XE8
От: T4r4sB Россия  
Дата: 29.08.23 11:51
Оценка: +1
Здравствуйте, Khimik, Вы писали:

K>Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть.

K>Вернул предыдущий код проекта — снова всё работает. Попытался подменить часть модулей последним кодом — снова перестало работать. После этого вернул эти же модули предыдущими — снова не работает; но если обновить все коды проекта, снова вернуть предыдущий вариант — работает.
K>Попробовал установить Delphi на другом компьютере, скомпилировал — такая же ошибка.
K>Заметил ещё одну странность: на одном из модулей (возможно это как раз проблемный модуль, с которого всё пошло) после нажатия F9 возникает синий breakpoint на самой верхней строчке (где название модуля). Убираю этот breakpoint, нажимаю F9 — снова он появляется.
K>Кто-нибудь с таким сталкивался?

Может ты кастишь указатель к инту. Когда они оба были 32 бита, все было лк. А если указатель 64 битп то при касте точность теряется и срабатывает проверка
Re[7]: Странный баг Delphi XE8
От: swame  
Дата: 29.08.23 13:12
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, swame, Вы писали:


S>>Можно поставить приложение

S>>https://sourceforge.net/projects/fastmm/
S>>и настраивать конфиг визуально,

K>Не понял, какое приложение? По ссылке можно скачать FastMM4991.zip, там нет exe файлов.


Перепутал, программа здесь

https://jedqc.blogspot.com/2007/07/new-fastmm4-options-interface.html

но ссылка сдохла, положил


https://disk.yandex.ru/d/k4mMp2MCe2c4sQ
Re[2]: Странный баг Delphi XE8
От: swame  
Дата: 29.08.23 14:30
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, Khimik, Вы писали:



TB>Может ты кастишь указатель к инту. Когда они оба были 32 бита, все было лк. А если указатель 64 битп то при касте точность теряется и срабатывает проверка


Компилятор D10, D11 выдает огшибку компиляции в таком случае. НАсчет XE8 не знаю
Re[3]: Странный баг Delphi XE8
От: rudzuk  
Дата: 29.08.23 17:23
Оценка:
Здравствуйте, swame, Вы писали:

s> TB>Может ты кастишь указатель к инту. Когда они оба были 32 бита, все было лк. А если указатель 64 битп то при касте точность теряется и срабатывает проверка


s> Компилятор D10, D11 выдает огшибку компиляции в таком случае. НАсчет XE8 не знаю


Не выдает D11, ни ошибки, ни предупреждения.

avalon/3.0.2
Re[4]: Странный баг Delphi XE8
От: Khimik  
Дата: 29.08.23 18:05
Оценка:
Здравствуйте, rudzuk, Вы писали:

s>> TB>Может ты кастишь указатель к инту. Когда они оба были 32 бита, все было лк. А если указатель 64 битп то при касте точность теряется и срабатывает проверка


s>> Компилятор D10, D11 выдает огшибку компиляции в таком случае. НАсчет XE8 не знаю


R>Не выдает D11, ни ошибки, ни предупреждения.


Я вначале перепугался, а потом проверил — и integer и pointer имеют размер 4 байта. Какая тут может быть ошибка? И прошу пояснить, какие вообще возможны скрытые ошибки, если приводить типы через скобки а не через as.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[5]: Странный баг Delphi XE8
От: rudzuk  
Дата: 29.08.23 18:41
Оценка: 2 (1)
Здравствуйте, Khimik, Вы писали:

K> R>Не выдает D11, ни ошибки, ни предупреждения.


K> Я вначале перепугался, а потом проверил — и integer и pointer имеют размер 4 байта.


В 32-битном режиме так и есть, а если повнимательнее на картинку посмотришь, то увидишь, что сборка сделана в 64-битном, где SizeOf(Pointer) = 8, а SizeOf(Integer) = 4.

K> Какая тут может быть ошибка? И прошу пояснить, какие вообще возможны скрытые ошибки, если приводить типы через скобки а не через as.


Ну какая может быть ошибка, если от указателя у тебя берется только половина указателя? Прикол в том, что такую ошибку ты можешь даже не заметить и софт с нем может работать очень долгое время, пока, указатель не начнет указывать за пределы 4 GB. Тут-то и начнутся разговоры о нормальном коде, который стал падать. Вот, кстати, если используешь SendMessage/PostMessage, где значения параметров WParam и LParam передаются с приведением типов-указателей к LongInt(something) или Integer, значит уже влип.
avalon/3.0.2
Re[5]: Странный баг Delphi XE8
От: rudzuk  
Дата: 29.08.23 18:41
Оценка:
Здравствуйте, Khimik, Вы писали:

K> R>Не выдает D11, ни ошибки, ни предупреждения.


K> Я вначале перепугался, а потом проверил — и integer и pointer имеют размер 4 байта.


В 32-битном режиме так и есть, а если повнимательнее на картинку посмотришь, то увидишь, что сборка сделана в 64-битном, где SizeOf(Pointer) = 8, а SizeOf(Integer) = 4.

K> Какая тут может быть ошибка? И прошу пояснить, какие вообще возможны скрытые ошибки, если приводить типы через скобки а не через as.


Ну какая может быть ошибка, если от указателя у тебя берется только половина указателя? Прикол в том, что такую ошибку ты можешь даже не заметить и софт с нем может работать очень долгое время, пока, указатель не начнет указывать за пределы 4 GB. Тут-то и начнутся разговоры о нормальном коде, который стал падать. Вот, кстати, если используешь SendMessage/PostMessage, где значения параметров WParam и LParam передаются с приведением типов-указателей к LongInt(something) или Integer, значит уже влип.
avalon/3.0.2
Re[6]: Странный баг Delphi XE8
От: Khimik  
Дата: 30.08.23 06:19
Оценка:
Здравствуйте, rudzuk, Вы писали:

K>> R>Не выдает D11, ни ошибки, ни предупреждения.


K>> Я вначале перепугался, а потом проверил — и integer и pointer имеют размер 4 байта.


R>В 32-битном режиме так и есть, а если повнимательнее на картинку посмотришь, то увидишь, что сборка сделана в 64-битном, где SizeOf(Pointer) = 8, а SizeOf(Integer) = 4.


А, ну да конечно, это я сглупил.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[8]: Странный баг Delphi XE8
От: Khimik  
Дата: 30.08.23 07:25
Оценка:
Здравствуйте, swame, Вы писали:

S>но ссылка сдохла, положил


S>https://disk.yandex.ru/d/k4mMp2MCe2c4sQ


Спасибо, я включил CheckHeapForCorruption, потом FullDebugMode, запустил мою программу и ошибка не сработала. Возможно у меня не этот тип ошибки.
Вчера я почистил старые утечки памяти в моей программе и неожиданно ошибка, с которой я начал эту тему, перестала срабатывать.
Ещё я заметил, что позавчера с Win32 версией тоже срабатывала ошибка range check error на другом функционале программы, т.е. не уверен что проблема именно с преобразованием типов. Но вообще я только сейчас понял, что надо более осторожно переводить код Delphi 7 на Delphi XE 8.
Прошу кого-нибудь ответить всё-таки, какие ошибки возможны, если использовать скобки вместо as при приведении типов.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[9]: Странный баг Delphi XE8
От: rudzuk  
Дата: 30.08.23 07:56
Оценка:
Здравствуйте, Khimik, Вы писали:

K> Прошу кого-нибудь ответить всё-таки, какие ошибки возможны, если использовать скобки вместо as при приведении типов.


Всякие. Это может привести к повреждениям памяти, которые, если повезет, вызовут ошибки нарушения доступа (Access Violation). Однако, может не повезти, и память будет портиться по-тихому, вызывая в дальнейшем какие угодно аномалии.
avalon/3.0.2
Re[5]: Странный баг Delphi XE8
От: T4r4sB Россия  
Дата: 30.08.23 08:29
Оценка:
K>Я вначале перепугался, а потом проверил — и integer и pointer имеют размер 4 байта.

Как в 64 битном режиме указатель может быть 4 байта?
Ты не знаешь сколько байт в бите? Или не знаешь что такое 64битный режим?
Re[9]: Странный баг Delphi XE8
От: T4r4sB Россия  
Дата: 30.08.23 08:33
Оценка:
K>Прошу кого-нибудь ответить всё-таки, какие ошибки возможны, если использовать скобки вместо as при приведении типов.

Яне знаю как работает as но предположу что там есть проверка впихуемости
Re[9]: Странный баг Delphi XE8
От: swame  
Дата: 30.08.23 09:35
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, swame, Вы писали:


S>>но ссылка сдохла, положил


S>>https://disk.yandex.ru/d/k4mMp2MCe2c4sQ


K>Спасибо, я включил CheckHeapForCorruption, потом FullDebugMode, запустил мою программу и ошибка не сработала. Возможно у меня не этот тип ошибки.

K>Вчера я почистил старые утечки памяти в моей программе и неожиданно ошибка, с которой я начал эту тему, перестала срабатывать.
K>Ещё я заметил, что позавчера с Win32 версией тоже срабатывала ошибка range check error на другом функционале программы, т.е. не уверен что проблема именно с преобразованием типов. Но вообще я только сейчас понял, что надо более осторожно переводить код Delphi 7 на Delphi XE 8.

K>Прошу кого-нибудь ответить всё-таки, какие ошибки возможны, если использовать скобки вместо as при приведении типов.


Ну например ты используешь старый недженериковый TList для хранения объектов определенного класса.
Потом поменял тип хранящихся там объектов, например вместо класа теперь там контейнер, включающий этот класс.
НО в каком-то месте кода забыл поправить.
При обращении приводишь объект скобочками , и меняещь значение поля. В этом случае не будет ни ошибок компиляции,
а может и не быть AV, но где-то произвольном месте памяти запортились данные. Такие ошибки сложно находить.
Если же класс из TLISt получаешь через as то сразу возникнет исключение, легко найти ошибку.
Отредактировано 30.08.2023 9:37 swame . Предыдущая версия .
Re[6]: Странный баг Delphi XE8
От: Khimik  
Дата: 30.08.23 10:49
Оценка:
Здравствуйте, T4r4sB, Вы писали:

K>>Я вначале перепугался, а потом проверил — и integer и pointer имеют размер 4 байта.


TB>Как в 64 битном режиме указатель может быть 4 байта?

TB>Ты не знаешь сколько байт в бите? Или не знаешь что такое 64битный режим?

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

K>
K> function TFragmentNode.GetSubItem(index: integer): tfragmentnode;
K>   begin
K>     result:=tfragmentnode(fsubitems[index]);
K>   end;
K>


K> fsubitems это tlist, tfragmentnode это класс. Попробовал поменять скобку на as и стала срабатывать ошибка Operator not applicable in this operand type.


result:=TObject(fsubitems[index]) as tfragmentnode;


Или замени TList на System.Contnrs.TObjectList или Generics.Collections.TList<tfragmentnode>; Для дженериков приведение вообще не потребуется делать.

K>
K> stream.Read(intbuff,sizeof(intbuff));
K> setlength(fragment^.atoms,intbuff);
K>


K> После этого на записи length(fragment^.atoms) возвращается нулевым.


А inputbuf чему равен?
avalon/3.0.2
Re[12]: Странный баг Delphi XE8
От: Khimik  
Дата: 30.08.23 17:23
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>
result:=TObject(fsubitems[index]) as tfragmentnode;


Можете объяснить, в чём разница с tfragmentnode(fsubitems[index])?

Я ещё раз посмотрел — да если скомпилировать в Win32, то sizeof(pointer) и sizeof(tobject) будут по 4 байта, а если в Win64, то по 8 байт. Даже если тут нет явной ошибки, то явно надо с такими вещами быть осторожнее.

K>>
K>> stream.Read(intbuff,sizeof(intbuff));
K>> setlength(fragment^.atoms,intbuff);
K>>


K>> После этого на записи length(fragment^.atoms) возвращается нулевым.


R>А inputbuf чему равен?


Ну не нулю, это размер строки, записанный в файле.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[13]: Странный баг Delphi XE8
От: rudzuk  
Дата: 30.08.23 17:41
Оценка:
Здравствуйте, Khimik, Вы писали:

K> R>
result:=TObject(fsubitems[index]) as tfragmentnode;


K> Можете объяснить, в чём разница с tfragmentnode(fsubitems[index])?


Если в списке окажется объект другого класса, не являющегося потомком запрашиваемого, то вариант с оператором as вызовет исключение и не даст испортить память. Если есть гарантия, что список содержит именно этот класс, то использовать as не обязательно.

K> Я ещё раз посмотрел — да если скомпилировать в Win32, то sizeof(pointer) и sizeof(tobject) будут по 4 байта, а если в Win64, то по 8 байт. Даже если тут нет явной ошибки, то явно надо с такими вещами быть осторожнее.


В Delphi бъекты являются типами-указателями (см. букварь). Поэтому опасности в подобном преобразовании нет, если есть гарантия, что за указателем объект.

K> R>А inputbuf чему равен?


K> Ну не нулю, это размер строки, записанный в файле.


Тогда проверь чему равна длина дин.массива сразу после того, как делаешь ему SetLength.
avalon/3.0.2
Re[14]: Странный баг Delphi XE8
От: Khimik  
Дата: 31.08.23 09:06
Оценка:
Здравствуйте, rudzuk, Вы писали:

K>> Ну не нулю, это размер строки, записанный в файле.


R>Тогда проверь чему равна длина дин.массива сразу после того, как делаешь ему SetLength.


Не нулевой. Вроде объект (ссылка fragment) тот же самый. Я оговорился — не размер строки, а размер этого динмассива.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[15]: Странный баг Delphi XE8
От: rudzuk  
Дата: 31.08.23 09:14
Оценка:
Здравствуйте, Khimik, Вы писали:

K> R>Тогда проверь чему равна длина дин.массива сразу после того, как делаешь ему SetLength.


K> Не нулевой. Вроде объект (ссылка fragment) тот же самый. Я оговорился — не размер строки, а размер этого динмассива.


Теперь ищи, где у тебя эта структура диспозится, раз массивы стали пустыми. Нужно ли там вообще возиться с указателями (fdata) из кода не понятно.
avalon/3.0.2
Re[16]: Странный баг Delphi XE8
От: Khimik  
Дата: 31.08.23 10:39
Оценка:
Здравствуйте, rudzuk, Вы писали:

K>> R>Тогда проверь чему равна длина дин.массива сразу после того, как делаешь ему SetLength.


K>> Не нулевой. Вроде объект (ссылка fragment) тот же самый. Я оговорился — не размер строки, а размер этого динмассива.


R>Теперь ищи, где у тебя эта структура диспозится, раз массивы стали пустыми. Нужно ли там вообще возиться с указателями (fdata) из кода не понятно.


Да, спасибо, нашёл, это мой древний дерьмокод (иерархический список копируется в другой, потом обратно, при этом элементы tfragmentnode не ассигнятся а копируются как ссылки). Хотя пока не знаю, связана ли эта старая ошибка с проблемой с которой я начал эту тему.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.