zHz00 Untitled

пятница, 16 апреля 2021
23:46 Значение синуса в военное время
MFC -- старый и ненужный фреймворк. У нас на нём, однако, крутятся старые и важные проекты.

Что он делает: он частично берёт на себя управление всякими кнопочками, полями ввода, меню и т.п.

На поле ввода можно поставить ограничение -- вводимое число должно быть в определённых пределах. И вот коллега допиливал в проекте одну штуку -- и обнаружилось, что в поле ввода с допустимыми пределами от -0.5 до +0.5 не проходит ноль. Любые другие числа проходят. Если написать "0.", "+0" и что-нибудь такое, то всё работало нормально. А вот если просто "0", то программа сообщала, что число не находится в допустимых пределах и не пускала дальше.

Скажу сразу, причину выяснить не удалось. Проблема была устранена миграцией с MSVS 2015 на MSVS 2019, где баг исчез.

Дополнительная информация:
1) Проблема проявлялась только в релиз-версии, что затрудняло копание в кишочках библиотеки. В отладочной всё работало.
2) Проблема воспроизводилась при создании нового поля и привязке к ней новой переменной.

Самым интересным оказалось то, каким образом воспринимался 0. Я попросил коллегу убрать проверку и добавить вывод значения поля в текстовом и в числовом виде.

В текстовом: "0".
В числовом: "4.000000"!

Конвертация осуществлялась автоматически стандартной функцией DDX_Text.

@темы: Программирование, Борьба с техникой

URL

17.04.2021 в 01:23

17.04.2021 в 01:23
фреймворк

Зачёт :)

По теме: Интернет говорит, что вместе со Студией можно поставить и сорцы MFC. Вот возьми и погляди, что там в этой DDX_Text происходит! Здесь вот люди пеняют на багованную _sntscanf_s, хотя по-моему там баг в её использовании — вместо *длины* строки (т.е. количества байт в ней) передаётся размер выделенной под строку памяти; scanf интерпретирует этот мусор и выдаёт… тоже мусор.

У меня есть похожая история про Qt. Там тоже происходило неожиданное-невероятное, но я в итоге разобрался.

-- Minoru
URL

18.04.2021 в 16:54

18.04.2021 в 16:54
Minoru, да, мне подсказали ещё вот эти две ссылки:
stackoverflow.com/questions/44059775/visual-c-2...
social.msdn.microsoft.com/Forums/vstudio/en-US/...

Действительно, косяк в стандартной библиотеке, а не в мфц. И он был исправлен только в 2019 студии, а в 2017 ещё был. Это невероятно.

Про кутэ -- чем отличается Acceptable и Intermediate?
URL

18.04.2021 в 20:55

18.04.2021 в 20:55
Minoru, да, мне подсказали ещё вот эти две ссылки:
stackoverflow.com/questions/44059775/visual-c-2...


Эй, да ведь я же её и привёл!

И он был исправлен только в 2019 студии, а в 2017 ещё был. Это невероятно.

Почему невероятно? Пока обнаружили, пока кто-то зарепортил, пока пофиксили… Microsoft неплохо так печётся об обратной совместимости, так что не исключено, что там внутри были дебаты, делать ли новую функцию или чинить старую :) В целом, я не удивлён, что аж четыре года понадобилось. Но тебе, конечно же, это понимание ничем не помогло бы, когда у тебя софт неправильно работает.

Про кутэ

Так, слову «фреймворк» научил, теперь буду учить слову «кьют». «Кью-ют» :) Милота! А «кутэ» — это QT.

чем отличается Acceptable и Intermediate?

Acceptable значит «эти данные являются допустимыми» (входят в диапазон), а Intermediate значит «пока что эти данные невалидны, но они вполне могут быть частью валидных данных». В моём случае строка «128» приводила к Intermediate, потому что сама по себе она в диапазон [-128; 127] не входит, зато является подстрокой валидной строки «-128».

Я наивно полагал, что валидатор говорит либо «валидно», либо «невалидно». А оказалось, что вот оно как — три состояния, а не два!

-- Minoru
URL
Добавить комментарий

Расширенная форма

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail