Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 05.01.2020, 19:24   #1
Школьница_прогер
Новичок
Джуниор
 
Регистрация: 05.01.2020
Сообщений: 2
По умолчанию delphi. несмотря на блок try, программа завершается ошибкой

при вычислении Р и Х при некоторых шагах цикла вайл(при многих) не проходит ОДЗ. => я сделала, части кода, где может быть ошибка, в try, но при выполнении, доходя до этого вычесления(где не проходит одз) вылетает сообщение с ошибкой, и программа вылетает.


Код:
  while t<tmax+h do begin
  memo2.Lines.Add(floattostrF(t, ffFixed, 2, 1));
   try
   x:=0.256*power(t,power(3, 2-a));
   memo3.Lines.Add(floattostrF(x, fffixed, 9, 7));
   except
   memo3.Lines.Add('вычесление невозможно1');
   memo1.Lines.Add('вычесление невозможно1');  end;

   try
    p:=arcsin(x+0.2)/power(x-0.9,3*sin(d*x))/ln(x)*ln(3);
    memo1.Lines.Add(floattostrF(p, fffixed, 6, 3));
   except
    memo3.Lines.Add('вычесление невозможно2');
    memo1.Lines.Add('вычесление невозможно2');
   end;

 t:=t+H;
 end;
Школьница_прогер вне форума Ответить с цитированием
Старый 05.01.2020, 19:48   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,233
По умолчанию

Замените except на finally .
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 08.01.2020, 23:37   #3
Школьница_прогер
Новичок
Джуниор
 
Регистрация: 05.01.2020
Сообщений: 2
По умолчанию

пробовала, выдаёт ту же ошибку(инвалид флоатинг поинт оперэйшн) и показывает на строку с вычеслением(p:=....) как будто он пытаясь вычислить в блоке трай(неудачно из-за одз) все равно закрывает программу с ошибкой
Школьница_прогер вне форума Ответить с цитированием
Старый 09.01.2020, 02:15   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,100
По умолчанию

Запустите программу не из среды, а сам ехе-шник.
Arigato вне форума Ответить с цитированием
Старый 09.01.2020, 07:22   #5
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 202
По умолчанию

Цитата:
Сообщение от Школьница_прогер Посмотреть сообщение
при вычислении Р и Х при некоторых шагах цикла вайл(при многих) не проходит ОДЗ. => я сделала, части кода, где может быть ошибка, в try, но при выполнении, доходя до этого вычесления(где не проходит одз) вылетает сообщение с ошибкой, и программа вылетает.


Код:
  
power(x-0.9,3*sin(d*x))/ln(x)*ln(3)
В целом тут и try не нужны.
Перед x:=0.256*power(t,power(3, 2-a)); убедитесь что t > 0
Перед power(x-0.9,3*sin(d*x))/ln(x)*ln(3) убедитесь что результат x-0.9 БОЛЬШЕ нуля и ln(x)*ln(3) тоже больше нуля.
И никаких исключительных ситуаций тут не надо.
Цитата:
Сообщение от Школьница_прогер Посмотреть сообщение
(инвалид флоатинг поинт оперэйшн)
вылетает скорей всего в методе power.
Цитата:
Функция Power ( X, Y: Extended ): Extended;

Модуль: Math

Описание
Функция возводит X в степень Y.
Значение аргумента Х должно быть больше нуля, иначе возникнет исключение EInvalidOp. Данная функция аналогична функции IntPower за исключением того, что для Power значение показателя степени Y может превышать MaxInt и иметь нецелочисленный тип.
Пишу много и развернуто

Последний раз редактировалось Heneken87; 09.01.2020 в 07:35.
Heneken87 вне форума Ответить с цитированием
Старый 21.11.2020, 00:57   #6
Максим111111
Новичок
Джуниор
 
Регистрация: 20.11.2020
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Запустите программу не из среды, а сам ехе-шник.
Столкнулся с такой же проблемой как автор поста и это решение помогло. Вопрос только почему это так работает и как сделать чтобы это работало и при запуске из среды?
Максим111111 вне форума Ответить с цитированием
Старый 23.11.2020, 08:47   #7
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,534
По умолчанию

внутри цикла while делаете проверку на ОДЗ или допустимые значения
Код:
if (0<>ln(x)) and ( 0<>power(x-0.9,3*sin(d*x) )then
begin
 p:=arcsin(x+0.2)/power(x-0.9,3*sin(d*x))/ln(x)*ln(3);
 //и ещё какие-то ваши вычисления
end;
я бы не поленился и сначала сделал бы в цикле такое: вывел столбцы значений подозрительных функций, чтоб найти то, из-за чего вылетает ошибка
x..... ln(x)......power()
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 23.11.2020, 11:40   #8
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,100
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
if (0<>ln(x))
Лучше x>0 и x<>1.

Цитата:
Сообщение от NetSpace Посмотреть сообщение
0<>power(x-0.9,3*sin(d*x)
Ноль получится лишь при x=0.9, значения аргументов также не могут быть любыми.

Цитата:
Сообщение от NetSpace Посмотреть сообщение
arcsin(x+0.2)
Арксинус тоже далеко не везде определен.

Так что тут действительно проще проверять через try, чем пытаться вычислить ОДЗ.

Последний раз редактировалось Arigato; 23.11.2020 в 11:43.
Arigato вне форума Ответить с цитированием
Старый 23.11.2020, 16:57   #9
Максим111111
Новичок
Джуниор
 
Регистрация: 20.11.2020
Сообщений: 2
По умолчанию

Это то понятно, что блок try удобнее. Вопрос лишь в том, почему при невозможности вычисления там (ф-ия power не может быть выполнены) вылезает ошибка? При чём только если запускать из среды. Если закрыть среду и открыть exe-шник, то ошибки не вылезают и программа выполняет то, что заложено в except'e
Максим111111 вне форума Ответить с цитированием
Старый 23.11.2020, 19:03   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,119
По умолчанию

потому в среде все ошибки поначалу перехватывает отладчик.
показывает их и спрашивает что делать дальше.
в зависимости от желания программиста
либо останавливает программу совсем (это действие по умолчанию!!!) (и ничего более не будет выполнено) .
либо продолжает ее выполнять и в этом случае уже будет выполнено
Цитата:
то, что заложено в except'e
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме от 7000 рублей в месяц



Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа CL.exe завершается кодом 2, непонятно Tak-Tik Общие вопросы C/C++ 16 01.07.2019 00:54
Программа сразу завершается yakimechik Общие вопросы C/C++ 1 19.11.2015 20:14
Программа работает, выдает правильные ответы, но завершается ошибкой zorg-kirill Visual C++ 5 20.11.2012 17:57
GetMailslotInfo завершается с ошибкой. tamTam C# (си шарп) 0 26.12.2011 13:42
Программа стартует и сразу же завершается IceExecutioner Общие вопросы Delphi 1 03.03.2011 13:18


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Скидки на курсы GeekBrains 40%, выбирайте программу для себя