Как в CBuilder'е матем. ошибки игнорировать?

salko1

Скажем, мне нужно построить график, но если не повезёт - может особенность появится - деление на ноль. Кажися, он исключение выбрасывает. Как сделать, чтобы игнорировалось? Чтобы к следующим точкам переходить, а не вылетать из программы?
Может кто пример кода привести?

peter1dav

Деление на ноль можно и проверкой поймать...
А попытка - исключение, не катит что ли?

dberezhnoy



using namespace std;
void function(int i)
{
double dRes = 1/i;
}
int main(int argc, char* argv[])
{
for(int i=10; i>-10; i--)
{
try
{
function(i);
}
catch (...)
{
}
}
return 0;
}


salko1

Да я так уже делал. Вот например, код:
try
{
double a=StrToFloat(Edit1->Text);
double b=StrToFloat(Edit2->Text);
Label1->Caption=FloatToStr(a/b);
}
catch(...)
{
}
- вылетает, если b=0. Хотя, как ни странно - твой скомпилировал как консольное приложение - работает нормально. Никак не пойму, чё за херня?

Dasar

а слабо руками проверять b на ноль и не делить?

dberezhnoy

Честно говоря, я не очень понимаю зачем тебе хочется использовать исключения. Тебя и советовал: проверь знаменатель на ноль и все.
Кстати, борладовский exe-шник у меня вылетает, микрософтовский - все нормально.

salko1

Слабо . Я вычислительную часть полгода назад писал - этот текстик я лишь для примера привёл. Там электрическое поле считается, и если считать на источнике (вспомни закон кулона) - то, конечно, получается деление на 0. При построении наглядной картинки, если выпадут несколько точек - это не существенно. Хотелось бы, не поднимая снова старых текстов (притом весьма больших ) выкрутиться.

Dasar

в нормальном компиляторе try/catch должны ловить деление про ноль
зы
похоже, что Borland не относится к нормальному компилятору

abrek

> а слабо руками проверять b на ноль и не делить?
это говорит старшекурсник (выпускник?) ВМК

salko1

Да, но программа 'а работает. Правда я её быдлеровским компилятором командной строки компилил - может он в среде разработки другой компилятор использует?

Dasar

а чем еще помочь человеку у которого не работает try/catch?

salko1

Да, кстати, и если в примере
Label1->Caption=FloatToStr(a/b);
заменить на
double c=a/b; - то тоже <<програм райсед ексептион дивиде бу зеро>>

salko1

Покаж текст.... Чем компилил?

abrek

ну я точно не знаю, чем помочь - у меня никаких эксепшенов, просто inf получается

abrek


#include <stdio.h>
int main(void)
{
double a, b;
for (a=1.0; a>(-1.0); a*=0.11) {
b = 1.0e12/a;
printf("a=%lg b=%lg\n", a, b);
}
return 0;
}


gcc-2.95 linux-i386

Dasar

а ты уверен, что a через 0 проходит?

abrek

Для того там и поставлен printf

salko1

Бл@!
Е#учие рога! Хот ДЛЛ-ку пиши на VC...

gopnik1994

сдается мне, что просто в настройках билдера стоит опция "отлавливать исключения". Выключаться должна в Debugger options...
При этой включенной опции, среда будет отлавливать все возникающие исключения, даже если они заключены в try-catch. Среда покажет тебе это сообщение, а после нажатия "Продолжить", продолжит выполнение проги в соответствии с логикой try-catch.

Dasar

а printf нормально показывает числа вида 1e-"очень много"?...
зы
есть большая разница между делением на 0 и делением на limits<double>::min_value...

salko1

Упс! Точно. Действительно это среда ловит! Всё заработало.
Спасибо!

abrek

ну блин, за кого ты меня держишь
я пробовал и другой вариант


for (a=1.0; a>(-1.0); a*=0.11) {
if (a<1e-10) a=0.0;
b = 1.0e12/a;
printf("a=%lg b=%lg\n", a, b);
}

gopnik1994

> if (a<1e-10)
а не if (fabs(a)<1e-10) случайно?

Dasar

Да. Ты прав. Извини.
Исключение "Деление на ноль" выскакивает только когда делишь целые числа.

abrek

> а не if (fabs(a)<1e-10) случайно?
а головой подумать?

gopnik1994

какие мы сегодня нервные...
а зачем тогда a>(-1.0)?

abrek

а вот это - чисто для прикола
Оставить комментарий
Имя или ник:
Комментарий: