Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 04.07.2016
Сообщений: 69

Конвертация во float и совместимость win 10 с win (7 и xp)

31.01.2019, 09:39. Показов 2208. Ответов 25

Студворк — интернет-сервис помощи студентам
Всем привет. Есть код написанный в борадатые года и отлично работающий на win 10.

В общем не давно заметил что на win 7 он перестал работать, хотя изначально для неё и разрабатывался.

C++
1
if( StrToFloat(“str1”.Trim()) > StrToFloat(“str2”.Trim()) )
str1 = 1.5;
str2 = 3023.78;

Ошибка возникает только на win 7 и XP с str2. Пишет что “3023.87’ is not a valid floating point value
На 10 такой ошибки нет. Системный разделитель я проверил. Стоит .

Подскажите в чем может быть дело ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.01.2019, 09:39
Ответы с готовыми решениями:

Совместимость Win XP и Win 2000 при взаимодействии с консолью
Проблема совместимости Win XP и Win 2000 при взаимодействии с консолью. Доброго времени суток. Существует проблема: необходимо...

После обновления Win 8.1 до Win 10, можно ли поставить старую Win 8.1 на другой ПК ?
Имеется лицензия Windows 8.1. которую обновил до Windows 10, можно ли теперь поставить струю Windows 8.1. на другой компьютер ? Если...

Конвертация кодировки DOS в Win
Есть файл с данными но в кодировке DOS. Необходимо как то преобразовать в Win, чтобы выводить данные в форму... Если есть предложения -...

25
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
31.01.2019, 10:21
Скриншот окна ошибки покажите. И что это за странные кавычки в коде? Приведенный код не скомпилируется.
0
0 / 0 / 0
Регистрация: 04.07.2016
Сообщений: 69
31.01.2019, 11:39  [ТС]
Ковычки такие из-за того что с телефона печатал
Миниатюры
Конвертация во float и совместимость win 10 с win (7 и xp)  
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
31.01.2019, 11:45
Bag_ali, в сообщении об ошибке видно, что перед цифрами в тексте стоит как минимум один пробел. Вероятно, метод Trim() не применился.
Попробуй вторым параметром в функцию передать
C++
1
stroka.Trim().c_str()
0
51 / 39 / 15
Регистрация: 20.09.2018
Сообщений: 163
31.01.2019, 12:15
это фотка криво сделана или в сообщении об ошибке после числа стоит одинарная кавычка?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
01.02.2019, 11:12
Надо сначала привести оба числа к float, а только потом сравнивать. Сразу будет понятно если где всплывет ошибка (в моменте преобразования из строки).
Еще можно попробовать посчитать количество символов непосредственно перед преобразованием: если в строке "3023.78" будет более семи символов, значит худо.
0
2641 / 1652 / 267
Регистрация: 19.02.2010
Сообщений: 4,373
01.02.2019, 16:28
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Еще можно попробовать посчитать количество символов непосредственно перед преобразованием: если в строке "3023.78" будет более семи символов, значит худо.
Абсолютно не важно и не нужно.
Ибо любая стандартная библиотечная конверташка сделана под максимально возможную точность (избыточная точность результата обрезается уже операцией присваивания).
Например, ANSI C/C++-конверташки из строки в плавучку atof(), strtod() возвращают дабл. Т.е. проглотят и полтора десятка значащих цифр.
А StrToFloat - аж long double возвращает (т.е. 80 бит вместо 64рёх обычного дабла).
Возвращающих флоаты аналогов этих функций - в базовых/стандартных библиотеках просто нет!

Т.е. всякие "худо" (например, строку не из цифр и прочее) надо ловить по-иному, обработчиками исключительных ситуаций или анализом возвращённых функцией результатов.
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
01.02.2019, 22:40
VTsaregorodtsev, Причём тут точность? Речь же шла о проверке того, что в функцию передаётся строка, которая помимо числа содержит ещё какой-то мусор.
А вообще, данной теме уделено уже неоправданно много внимания. Ошибка из одного ряда с пропущенной ";".
При том, что ТС, вероятно, либо уже решил проблему, либо не очень-то ему это и нужно.
0
694 / 6951 / 265
Регистрация: 11.08.2016
Сообщений: 3,932
01.02.2019, 22:50
Посмотри, какой десятичный разделитель выставлен в системе. StrToFloat по умолчанию переводит с тем, который выставлен в винде. Если в винде стоит запятая, с точкой не прокатит.
0
2641 / 1652 / 267
Регистрация: 19.02.2010
Сообщений: 4,373
02.02.2019, 19:56
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
Причём тут точность? Речь же шла о проверке того, что в функцию передаётся строка, которая помимо числа содержит ещё какой-то мусор.
Читайте внимательно цитированные мной слова ув.SatanaXIII
Где там у него было про проверку на мусор?

А вот идея проверки того, что "нельзя впихнуть невпихуемое" - у него была.
Но - с предлагаемым порогом (7 символов-цифр), актуальным ТОЛЬКО для флоата.
Хотя все предусмотренные СТАНДАРТАМИ ЯЗЫКА и его библиотек конвертеры строки в плавучку - возвращают дабл или лонг дабл. Усечение точности - происходит уже при присваивании результата переменной в памяти.
Да и sscanf/swscanf, где в строке формата можно сразу попросить сохранить именно во флоат, внутри себя тоже могут сначала конвертировать в дабл - и только потом будут пытаться упихивать результат в требуемый строкой формата флоат. И если не возникнет переполнения - всё будет ОК.
Т.е. высказанное SatanaXIII требование о не более чем 7 цифрах в строке - не является обязательным для неуспеха конвертации. Что я и отметил.
Причём я мог и другой, более простой пример привести. Например, спросить, отчего это должна быть неуспешной конверсия строки "0.000000000000001", если 1е-15 вполне по силам флоату?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.02.2019, 20:17
И поскольку там ОLE должен быть WideString и bstr
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
03.02.2019, 12:05
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Где там у него было про проверку на мусор?
Речь шла о подсчёте количества символов в строке перед тем, как передать её на преобразование. Если в строке с числом, которое записывается семью символами, символов будет больше семи, о чём это говорит? О том, что в строке мусор. И точность тут ни при чём.
О каком вообще усечении точности может идти речь при ошибке "is not a valid floating point value"? Программа не приняла строку, а до работы с числовыми форматами дело вообще не дошло.
0
2641 / 1652 / 267
Регистрация: 19.02.2010
Сообщений: 4,373
03.02.2019, 20:00
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
Если в строке с числом, которое записывается семью символами, символов будет больше семи
Чем обоснован бред про 7 символов в числе?
Что, примера про "0.000000000000001" == 1е-15 не хватает, и мне надо напомнить, что и 10^-38, и 10^38 всё ещё влезают во флоат, не говоря уж про дабл? Почти 40 символов будет в "обычной"=неэкспоненциальной строковой записи таких чисел - и ни у кого никаких проблем.
В общем, различайте символы в числе как строке - и значащие цифры в числе.

И ещё. Я вот гляжу в справку по StrToFloat (раз ТС её юзает - будем в этих рамках держаться) - и вижу, что там чёрным по белому написано про Leading and trailing blanks are ignored. Т.е. пробелы по обе стороны от числа - допустимы, и сами по себе успешность конвертации такие пробелы не влияют.
Поэтому умоляю - не начинайте придумывать очередную сказку, что пробелы != символы
Фактически, я уже третьим способом опровергаю ересь про необходимость 7 символов - может, всё-таки признаетесь в грехах и покаетесь?
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
03.02.2019, 21:47
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Чем обоснован бред про 7 символов в числе?
Тем, что число 3023.87 записывается с мощью семи символов.
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Что, примера про "0.000000000000001" == 1е-15 не хватает
Для чего его должно хватить? Про переполнение float речи вообще не было, к чему тут эта диссертация?
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Фактически, я уже третьим способом опровергаю ересь про необходимость 7 символов - может, всё-таки признаетесь в грехах и покаетесь?
Да хоть десятым. Хоть и проверить соответствие длины строки семи предложил не я, но абсолютно уверен, что речь шла не о вместительности типа float, а о наличии в строке мусора.

В сообщении об ошибке чёрным по серому написано: "is not a valid floating point value". Не "floating point overflow".
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
04.02.2019, 09:36
VTsaregorodtsev, очень хорошо, что вы обладаете знаниями о том, какие числа влазят во флоат, а так же стремлением делиться этими знаниями. Умение читать справку так же очень полезно, но умение читать ее внимательно бывает еще полезнее - не только пробелы могут передаваться параметром в StrToFloat, но и любые другие непечатные символы. И при внешнем кажущемся сходстве строк с непечатными символами, суть их может сильно различаться, и не каждая функция - в частности StrToFloat - производит подобную полную проверку своих строковых параметров.
Когда я предлагал проверить именно длину передаваемой в функцию строки - эти пресловутые "7 символов-цифр", то смысл этого был как раз в том, чтобы выяснить не затесались ли в строку непечатные символы.

Вот вы предлагаете в подобных ситуациях использовать выбрасывание исключений или анализ возвращаемых значений функции. Допустим мы выбрали ловлю исключений: оборачиваем вызов StrToFloat в try-catch блок и получаем ожидаемое EConvertError. Дальше что? Мы очень здорово и на высоком профессиональном уровне получили ровно такой же результат, как и в отладчике глазами. Но допустим мы выбрали обработку результата из функции: пишем метод, получающий строку и внутри себя вызывающий в try-catch блоке StrToFloat, и в секции catch возвращающий, например, false. Запускаем, получаем false и аплодируем себе стоя. Мы молодцы.
Мораль: главное не сколько знаний и умений мы имеем, не то, как мы лихо их демонстрируем, а то, что если мы не стараемся решить проблему, а просто сотрясаем воздух, то это и есть худо.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.02.2019, 13:01
Цитата Сообщение от SatanaXIII Посмотреть сообщение
, чтобы выяснить не затесались ли в строку непечатные символы.
Смысл? Мм уже выяснили же что они никак не учитываются ф-цией.А если бы и учитывались то отбрасывались бы Trim()
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
04.02.2019, 13:37
Цитата Сообщение от Avazart Посмотреть сообщение
Смысл?
Мозговой штурм. Очевидные варианты уже все попробовали, остались только не очевидные.
Вот попробуйте предложите что-нибудь тс, чтобы выяснить в чем именно ошибка.
Цитата Сообщение от Avazart Посмотреть сообщение
Мм уже выяснили же что они никак не учитываются ф-цией.
А мы не выяснили. Попробуйте передать в StrToFloat, например, символ Backspace - не распознает.

И еще раз: нужно предложить тс решение или путь поиска этого решения, а не гипотезировать сидеть.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.02.2019, 13:46
Цитата Сообщение от SatanaXIII Посмотреть сообщение
символ Backspace - не распознает.
А каким образом он там должен оказаться в эдите?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
04.02.2019, 14:49
Avazart,
Цитата Сообщение от SatanaXIII Посмотреть сообщение
И еще раз: нужно предложить тс решение или путь поиска этого решения, а не гипотезировать сидеть.
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
04.02.2019, 14:58
Цитата Сообщение от Avazart Посмотреть сообщение
А каким образом он там должен оказаться в эдите?
Так нигде не сказано, что строка берётся из эдита.
У ТС в коде и OLE, и ADOQuery. Причём значение из ADOQuery извлекается как "AsFloat" и тут же передаётся в StrToFloat.
Так что появление мусора не удивляет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.02.2019, 14:58
Помогаю со студенческими работами здесь

Конвертация DBF из DOS в Win
Задача стоит перевести все базы dBASE из ОЕМ(DOS)в Win, сохранив все данные и структуру. Решаю на Delphi7. Сейчас перекодировка полей...

Конвертация unicode в win-1251
Засылаю я к-л текст в асипулину... Скрипт думает, что это - форма (content-type), однако приходит сей текст из xmlhttprequest'а. Задача -...

Python 2.7 совместимость функции с win 10
Добрый вечер. Возникла проблема с выявлением файлов в данной директории именно с ОС win 10 после последнего обновления(до этого и на вин...

Совместимость компонентов и команд Win XP - 7. TStringGrid
Работаю в C++Builder 2009. Пишу многопоточное приложения для работы с COM портами на стандартном API: CreateFile ReadFile WriteFile ...

Совместимость hdd больше 2Tb с win 7 32bit
Можете подсказать по этому вопросу, Такой диск сложно будет запустить на win 7 32bit? Биос на маме Phoenix Technologies, LTD 6.00 PG,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru