Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть.
Вернул предыдущий код проекта — снова всё работает. Попытался подменить часть модулей последним кодом — снова перестало работать. После этого вернул эти же модули предыдущими — снова не работает; но если обновить все коды проекта, снова вернуть предыдущий вариант — работает.
Попробовал установить Delphi на другом компьютере, скомпилировал — такая же ошибка.
Заметил ещё одну странность: на одном из модулей (возможно это как раз проблемный модуль, с которого всё пошло) после нажатия F9 возникает синий breakpoint на самой верхней строчке (где название модуля). Убираю этот breakpoint, нажимаю F9 — снова он появляется.
Кто-нибудь с таким сталкивался?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Выяснилось, что если выбрать Target platform / Windows 32 и скомпилировать, то запускается нормально. Если же снова выбрать Windows 64, далее Clean, Build, Compile, то опять эта ошибка. Прошу помочь.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K> Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть.
Здравствуйте, rudzuk, Вы писали:
K>> Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть.
R>Код-то покажешь?
Какой смысл? Код то нормальный, в Win32 версии всё запускается. Сообщение об ошибке возникает там где всё чисто. А весь код я же не могу показать.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K> K>> Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть.
K> R>Код-то покажешь?
K> Какой смысл? Код то нормальный, в Win32 версии всё запускается. Сообщение об ошибке возникает там где всё чисто. А весь код я же не могу показать.
Ну ладно. Тогда сходи к гадалке, она в хрустальный шар посмотрит.
Здравствуйте, 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, на первой строке проекта, не знаю отчего это. НО с предыдущим багом вряд ли связан.
Здравствуйте, swame, Вы писали:
S>Я бы в перую очередь прогнал программу с FAstMM c включенной опцией CherckHeapForCorruption, начиная с 32 разрядного режима S>Узнаешь много удивительного о качестве своей программы
Поставил модуль FastMM, и не очень понятно пока что с ним делать дальше. Извиняюсь за ламерские вопросы, CheckHeapForCorruption это ведь не булева константа, там стоит
{.$define CheckHeapForCorruption}
Нужно убрать точку чтобы это включить? Я так сделал и не увидел изменений, может он куда-то пишет отчёт?
Я пока не знаю что значит $define
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K>Здравствуйте, swame, Вы писали:
S>>Я бы в перую очередь прогнал программу с FAstMM c включенной опцией CherckHeapForCorruption, начиная с 32 разрядного режима S>>Узнаешь много удивительного о качестве своей программы
K>Поставил модуль FastMM, и не очень понятно пока что с ним делать дальше. Извиняюсь за ламерские вопросы, CheckHeapForCorruption это ведь не булева константа, там стоит K>{.$define CheckHeapForCorruption}
K>Нужно убрать точку чтобы это включить? Я так сделал и не увидел изменений, может он куда-то пишет отчёт? K>Я пока не знаю что значит $define
Здравствуйте, Khimik, Вы писали:
K>Убираю этот breakpoint, нажимаю F9 — снова он появляется.
Тут уместен анекдот с ключевой фразой "закопайте стюардессу".
Здравствуйте, Khimik, Вы писали:
K>Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть. K>Вернул предыдущий код проекта — снова всё работает. Попытался подменить часть модулей последним кодом — снова перестало работать. После этого вернул эти же модули предыдущими — снова не работает; но если обновить все коды проекта, снова вернуть предыдущий вариант — работает. K>Попробовал установить Delphi на другом компьютере, скомпилировал — такая же ошибка. K>Заметил ещё одну странность: на одном из модулей (возможно это как раз проблемный модуль, с которого всё пошло) после нажатия F9 возникает синий breakpoint на самой верхней строчке (где название модуля). Убираю этот breakpoint, нажимаю F9 — снова он появляется. K>Кто-нибудь с таким сталкивался?
Может ты кастишь указатель к инту. Когда они оба были 32 бита, все было лк. А если указатель 64 битп то при касте точность теряется и срабатывает проверка
Здравствуйте, Khimik, Вы писали:
K>Здравствуйте, swame, Вы писали:
S>>Можно поставить приложение S>>https://sourceforge.net/projects/fastmm/ S>>и настраивать конфиг визуально,
K>Не понял, какое приложение? По ссылке можно скачать FastMM4991.zip, там нет exe файлов.
Здравствуйте, T4r4sB, Вы писали:
TB>Здравствуйте, Khimik, Вы писали:
TB>Может ты кастишь указатель к инту. Когда они оба были 32 бита, все было лк. А если указатель 64 битп то при касте точность теряется и срабатывает проверка
Компилятор D10, D11 выдает огшибку компиляции в таком случае. НАсчет XE8 не знаю
Здравствуйте, swame, Вы писали:
s> TB>Может ты кастишь указатель к инту. Когда они оба были 32 бита, все было лк. А если указатель 64 битп то при касте точность теряется и срабатывает проверка
s> Компилятор D10, D11 выдает огшибку компиляции в таком случае. НАсчет XE8 не знаю
Здравствуйте, rudzuk, Вы писали:
s>> TB>Может ты кастишь указатель к инту. Когда они оба были 32 бита, все было лк. А если указатель 64 битп то при касте точность теряется и срабатывает проверка
s>> Компилятор D10, D11 выдает огшибку компиляции в таком случае. НАсчет XE8 не знаю
R>Не выдает D11, ни ошибки, ни предупреждения.
Я вначале перепугался, а потом проверил — и integer и pointer имеют размер 4 байта. Какая тут может быть ошибка? И прошу пояснить, какие вообще возможны скрытые ошибки, если приводить типы через скобки а не через as.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, 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, значит уже влип.
Здравствуйте, 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, значит уже влип.
Здравствуйте, rudzuk, Вы писали:
K>> R>Не выдает D11, ни ошибки, ни предупреждения.
K>> Я вначале перепугался, а потом проверил — и integer и pointer имеют размер 4 байта.
R>В 32-битном режиме так и есть, а если повнимательнее на картинку посмотришь, то увидишь, что сборка сделана в 64-битном, где SizeOf(Pointer) = 8, а SizeOf(Integer) = 4.
А, ну да конечно, это я сглупил.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Спасибо, я включил CheckHeapForCorruption, потом FullDebugMode, запустил мою программу и ошибка не сработала. Возможно у меня не этот тип ошибки.
Вчера я почистил старые утечки памяти в моей программе и неожиданно ошибка, с которой я начал эту тему, перестала срабатывать.
Ещё я заметил, что позавчера с Win32 версией тоже срабатывала ошибка range check error на другом функционале программы, т.е. не уверен что проблема именно с преобразованием типов. Но вообще я только сейчас понял, что надо более осторожно переводить код Delphi 7 на Delphi XE 8.
Прошу кого-нибудь ответить всё-таки, какие ошибки возможны, если использовать скобки вместо as при приведении типов.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K> Прошу кого-нибудь ответить всё-таки, какие ошибки возможны, если использовать скобки вместо as при приведении типов.
Всякие. Это может привести к повреждениям памяти, которые, если повезет, вызовут ошибки нарушения доступа (Access Violation). Однако, может не повезти, и память будет портиться по-тихому, вызывая в дальнейшем какие угодно аномалии.