MFC -- старый и ненужный фреймворк. У нас на нём, однако, крутятся старые и важные проекты.
Что он делает: он частично берёт на себя управление всякими кнопочками, полями ввода, меню и т.п.
На поле ввода можно поставить ограничение -- вводимое число должно быть в определённых пределах. И вот коллега допиливал в проекте одну штуку -- и обнаружилось, что в поле ввода с допустимыми пределами от -0.5 до +0.5 не проходит ноль. Любые другие числа проходят. Если написать "0.", "+0" и что-нибудь такое, то всё работало нормально. А вот если просто "0", то программа сообщала, что число не находится в допустимых пределах и не пускала дальше.
Скажу сразу, причину выяснить не удалось. Проблема была устранена миграцией с MSVS 2015 на MSVS 2019, где баг исчез.
Дополнительная информация:
1) Проблема проявлялась только в релиз-версии, что затрудняло копание в кишочках библиотеки. В отладочной всё работало.
2) Проблема воспроизводилась при создании нового поля и привязке к ней новой переменной.
Самым интересным оказалось то, каким образом воспринимался 0. Я попросил коллегу убрать проверку и добавить вывод значения поля в текстовом и в числовом виде.
В текстовом: "0".
В числовом: "4.000000"!
Конвертация осуществлялась автоматически стандартной функцией DDX_Text.
Что он делает: он частично берёт на себя управление всякими кнопочками, полями ввода, меню и т.п.
На поле ввода можно поставить ограничение -- вводимое число должно быть в определённых пределах. И вот коллега допиливал в проекте одну штуку -- и обнаружилось, что в поле ввода с допустимыми пределами от -0.5 до +0.5 не проходит ноль. Любые другие числа проходят. Если написать "0.", "+0" и что-нибудь такое, то всё работало нормально. А вот если просто "0", то программа сообщала, что число не находится в допустимых пределах и не пускала дальше.
Скажу сразу, причину выяснить не удалось. Проблема была устранена миграцией с MSVS 2015 на MSVS 2019, где баг исчез.
Дополнительная информация:
1) Проблема проявлялась только в релиз-версии, что затрудняло копание в кишочках библиотеки. В отладочной всё работало.
2) Проблема воспроизводилась при создании нового поля и привязке к ней новой переменной.
Самым интересным оказалось то, каким образом воспринимался 0. Я попросил коллегу убрать проверку и добавить вывод значения поля в текстовом и в числовом виде.
В текстовом: "0".
В числовом: "4.000000"!
Конвертация осуществлялась автоматически стандартной функцией DDX_Text.
17.04.2021 в 01:23
Зачёт
По теме: Интернет говорит, что вместе со Студией можно поставить и сорцы MFC. Вот возьми и погляди, что там в этой DDX_Text происходит! Здесь вот люди пеняют на багованную _sntscanf_s, хотя по-моему там баг в её использовании — вместо *длины* строки (т.е. количества байт в ней) передаётся размер выделенной под строку памяти; scanf интерпретирует этот мусор и выдаёт… тоже мусор.
У меня есть похожая история про Qt. Там тоже происходило неожиданное-невероятное, но я в итоге разобрался.
-- Minoru
18.04.2021 в 16:54
stackoverflow.com/questions/44059775/visual-c-2...
social.msdn.microsoft.com/Forums/vstudio/en-US/...
Действительно, косяк в стандартной библиотеке, а не в мфц. И он был исправлен только в 2019 студии, а в 2017 ещё был. Это невероятно.
Про кутэ -- чем отличается Acceptable и Intermediate?
18.04.2021 в 20:55
stackoverflow.com/questions/44059775/visual-c-2...
Эй, да ведь я же её и привёл!
И он был исправлен только в 2019 студии, а в 2017 ещё был. Это невероятно.
Почему невероятно? Пока обнаружили, пока кто-то зарепортил, пока пофиксили… Microsoft неплохо так печётся об обратной совместимости, так что не исключено, что там внутри были дебаты, делать ли новую функцию или чинить старую
Про кутэ
Так, слову «фреймворк» научил, теперь буду учить слову «кьют». «Кью-ют»
чем отличается Acceptable и Intermediate?
Acceptable значит «эти данные являются допустимыми» (входят в диапазон), а Intermediate значит «пока что эти данные невалидны, но они вполне могут быть частью валидных данных». В моём случае строка «128» приводила к Intermediate, потому что сама по себе она в диапазон [-128; 127] не входит, зато является подстрокой валидной строки «-128».
Я наивно полагал, что валидатор говорит либо «валидно», либо «невалидно». А оказалось, что вот оно как — три состояния, а не два!
-- Minoru