Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2021, 20:02   #1
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию О сколько нам открытий чудных.. или о делении на 0 в Delphi без ошибки и в Lazaus с ошибкой

Давно уже пишу на Delphi, но до сих пор бывают открытия.
Код
Код:
var a,b:Word;  // или Integer
 begin
   b:=0;
   a:=1 div b;
// ........
нормально прокатывает в Delphi , а в Lazaus при запуске - аварийный выход, .. класс исключения "External: SIGFPE"

Правда, если в Delphi добавить после деления
Код:
Memo1.Lines.Add(IntToStr(a));
тоже будет ошибка при запуске.

В чем там разница? Пробовал {$Q+} или {$Q-} - ничего не меняется.
type_Oleg вне форума Ответить с цитированием
Старый 14.11.2021, 20:06   #2
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
ишу на Delphi
delphi 7 предположу )
Alar вне форума Ответить с цитированием
Старый 14.11.2021, 20:14   #3
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Цитата:
Сообщение от Alar Посмотреть сообщение
delphi 7 предположу )
Ага.
type_Oleg вне форума Ответить с цитированием
Старый 14.11.2021, 21:56   #4
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Ну пример из кода слишком "учебный"=)
А в практической задаче в чем проблема вставить перед делением проверку?
Код:
if b=0 then begin
{обработка ситуации с 0}
end else begin
{основной код}
end
Kronos913 вне форума Ответить с цитированием
Старый 14.11.2021, 22:20   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Интересно было бы пройти в режиме отладки. Может, компилятор умный и выбрасывает этот оператор? А если нет - то что в этом самом а после операции ?
А вообще, по-моему, эксперименты типа "если нельзя, но хочется" - бессмыслены по сути. Это как искать систему в конвульсиях убитого тореадором быка.
Не люблю корриду и испанцев, которые её любят.
digitalis вне форума Ответить с цитированием
Старый 14.11.2021, 22:28   #6
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
А в практической задаче в чем проблема вставить перед делением проверку?
Да нет проблем. Просто интересно.
Написал небольшой код на Дельфы для проверки быстродействия, там куча циклов с простыми операциями, типа
Код:
procedure tstWord(n:Integer);
var x1,x2,x3:Word;
    i:Integer;
begin
 for i:=1 to n do
  begin
   x1:=i mod 1000;
   x2:=i mod 1001;
   x3:=x1 div x2;   //  вот тут не подумал о возможности div 0
   x1:=x2+x3;
  end;
end;
Процедура просто тратит время.
Не обратил внимание на возможность деления на 0, в Дельфы все прокатило, а потом решил а Лазарусе - а там - оба-на, переполнение. Потом конечно вставил проверку
Код:
if x2=0 then x3:=1 else x3:=x1 div x2;
Проверяю быстродействие так-
Код:
 nn:=500000000;
 t0:=Now;
 tstWord(nn);
 Memo1.Lines.Add(FloatToStr(86400*(Now-t0)));  // дни -> в секунды
Что интересно, проверка занимает много времени. Результаты -
Delphi ( без проверки =0 ) 0.17 сек
Delphi ( с проверкой =0 ) 1.39 сек
Lazarus ( с проверкой =0 ) 12.16 сек
Тоже загадка, почему такая разница Дельфы и Лазарус. Кстати не всегда, другие тесты примерно одинаково.
type_Oleg вне форума Ответить с цитированием
Старый 14.11.2021, 22:30   #7
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Может, компилятор умный и выбрасывает этот оператор?
Вот это может быть. Хотя должен предупреждать, но никаких hint или warning не выдает, сейчас проверил.
type_Oleg вне форума Ответить с цитированием
Старый 14.11.2021, 22:36   #8
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
Может, компилятор умный и выбрасывает этот оператор?
Это могло быть шуткой, только грустной.

как буд-то с делфи 7 не имели опыта работы, если это на полном серьёзе ))


Просто у компилятора не возникло проблем с делением на ноль, взял и поделил.

А в чём собсвенно должна быть проблема? Это же даже не математическая операция
А функция
http://www.delphibasics.ru/Div.php

Перепешите её под себя, будет ошибку выдавать, если добавите условие которое вам надо ))

Память выделенную под переменную откройте и посмотрите что там внутри.

как вариант

http://www.delphibasics.ru/FloatToStr.php
http://www.delphibasics.ru/FloatToStrF.php

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


Ещё к паскалю в синем экране можно было бы придраться, почему он переменные сам не обнуляет ))
Alar вне форума Ответить с цитированием
Старый 14.11.2021, 22:39   #9
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Цитата:
Сообщение от Alar Посмотреть сообщение
Inttostr сделайте и гляньте
Пробовал.

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
Правда, если в Delphi добавить после деления
Код:

Memo1.Lines.Add(IntToStr(a));

тоже будет ошибка при запуске.
type_Oleg вне форума Ответить с цитированием
Старый 14.11.2021, 22:43   #10
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
Пробовал.
да я перечитал и откорректировал сообщение,

http://www.delphibasics.ru/PInt64.php

вот держи по указателям ссылку

Когда-то делфи 7 такой объёмной казалась, а сейчас смотрится как небольшая, вероятно даже компоненты уже ничем не помогают ей ))
Alar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести на экран 1 или 0 в зависимости от того, имеют три заданных целых числа одинаковую четность или нет. Delphi. Проверить задачу на ошибки student_23 Помощь студентам 3 27.01.2017 09:45