Поиск:

Ответ в темуСоздание новой темы Создание опроса
> фатальная ошибка при переводе из текста в double 
:(
    Опции темы
Ruka
Дата 18.5.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



В  программе данные считываются с прибора по DDE, а потом переводятся из текста в double. Если при этом в какой-то момент текст - не число, программа вылетает. Как это обойти? Double нужен, чтобы потом сравнивать. 
Помогите, пожалуйста. smile 
PM MAIL   Вверх
ksili
Дата 18.5.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Проверяй, перед тем как переводить в Double. А лучше обрабатывай исключения:
Код

double x;
try
{
//здесь преобразуешь текст в double
x = StrToFloat(.....);
}
catch(...)
{
//здесь выполняется то, что надо сделать в случае неудачного преобразования
//например, зануляем нашу переменную
x = 0;
}



--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
dumb
Дата 21.5.2007, 05:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



либо StrToFloatDef
PM MAIL   Вверх
Ruka
Дата 21.5.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.5.2007

Репутация: нет
Всего: нет




StrToFloat не подходит, т.к. текст - AnsiString.

Я пишу так:

   double ID1;

   try { ID1=DdeClientItem1->Text.ToDouble(); }
   catch ( ... ) { ID1=0.0; }


Программа вылетает на операторе ID1=DdeClientItem1->Text.ToDouble(). 

Появляется сообщение об ошибке:
  … exception class EConvertError with message “is not a valid floating point value”. 

При этом значение 
DdeClientItem1->Text  равно  E2195 Cannot evaluate function call.

Отслеживать именно это значение не хотелось бы - а вдруг появятся другие?
PM MAIL   Вверх
SenkraD
Дата 21.5.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 9
Всего: 23



Цитата(Ruka @  21.5.2007,  10:43 Найти цитируемый пост)
Программа вылетает на операторе ID1=DdeClientItem1->Text.ToDouble(). 
 Где в среде? Тогда отключи debuger или запускай прогу вне среды, правда этот способ усложняет отладку

Плюс посмотри на глобальные разделители. А также ещё есть глобальные переменные среды в которых хранится символ разделитель чичел с плавающей точкой (как они называются не помню)



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
ksili
Дата 21.5.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Так будет происходить при запуске из-под Билдера. При обычном запуске exe-шника будет нормально обрабатываться исключение по ветке catch(...).
Цитата(Ruka @  21.5.2007,  15:43 Найти цитируемый пост)
StrToFloat не подходит, т.к. текст - AnsiString.

StrToFloat и сделан для AnsiString.
А ещё лучше используй StrToFloatDef как посоветовал Dumb - меньше кода будет.

Цитата(Ruka @  21.5.2007,  15:43 Найти цитируемый пост)
При этом значение 
DdeClientItem1->Text  равно  E2195 Cannot evaluate function call.

Отслеживать именно это значение не хотелось бы - а вдруг появятся другие? 

Это не значение, а сообщение Билдера о том, что он не может отобразить это значение

Добавлено через 1 минуту и 44 секунды
Цитата(SenkraD @  21.5.2007,  15:50 Найти цитируемый пост)
Плюс посмотри на глобальные разделители. А также ещё есть глобальные переменные среды в которых хранится символ разделитель чичел с плавающей точкой (как они называются не помню)

Он называтся DecimalSeparator.
Можно например написать для определённости
Код

DecimalSeparator = '.';



--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Ruka
Дата 21.5.2007, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



При нормальном запуске exe-файла. Просто выскакивает очень много сообщений об ошибке. В нормальный режим не возвращается.

И, пожалуйста, поясните, куда DecimalSeparator поставить? В try ?

Это сообщение отредактировал(а) Ruka - 21.5.2007, 11:02
PM MAIL   Вверх
ksili
Дата 21.5.2007, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Цитата(Ruka @  21.5.2007,  15:55 Найти цитируемый пост)
Просто выскакивает очень много сообщений об ошибке

Ну так у тебя наверно всё это в цикле?

Ruka, тебе сказали уже всё, чтобы ты смог преобразовать строку к числу. Если хочешь чтобы тебе сообщили ещё что-то, приведи больше инфы: код приведи или опиши подробней ситуацию

Добавлено @ 11:06
Я думаю дело не в DecimalSeparator

Это сообщение отредактировал(а) ksili - 22.5.2007, 04:57


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
sp75
Дата 21.5.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 17.5.2007

Репутация: 1
Всего: 1



Цитата(Ruka @ 18.5.2007,  11:49)
В  программе данные считываются с прибора по DDE, а потом переводятся из текста в double. Если при этом в какой-то момент текст - не число, программа вылетает. Как это обойти? Double нужен, чтобы потом сравнивать. 
Помогите, пожалуйста. smile

Велосипед уже изобретен :

TryStrToFloat(const AnsiString S, double &Value);
TryStrToFloat(const AnsiString S, float &Value);

Пример:

   AnsiString  a = "3,15";
   double Value;

   if( TryStrToFloat(a, Value) ) ShowMessage(FloatToStr( Value ) +"- Это double) ;
         else ShowMessage(a+" Не double") ;

  



Это сообщение отредактировал(а) sp75 - 21.5.2007, 15:50
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.