Последние записи
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
30th
Ноя
О сколько нам открытий чудных.. или о делении на 0 в Delphi без ошибки и в Lazaus с ошибкой
Posted by obzor under Delphi, Lazarus, Free Pascal
Давно уже пишу на 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-} — ничего не меняется.
Ну пример из кода слишком «учебный»=)
А в практической задаче в чем проблема вставить перед делением проверку?
if b=0 then begin
{обработка ситуации с 0}
end else begin
{основной код}
end
Да нет проблем. Просто интересно.
Написал небольшой код на Дельфы для проверки быстродействия, там куча циклов с простыми операциями, типа
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 сек
Тоже загадка, почему такая разница Дельфы и Лазарус. Кстати не всегда, другие тесты примерно одинаково.
Это могло быть шуткой, только грустной.
как буд-то с делфи 7 не имели опыта работы, если это на полном серьёзе ))
Просто у компилятора не возникло проблем с делением на ноль, взял и поделил.
А в чём собсвенно должна быть проблема? Это же даже не математическая операция
А функция
http://www.delphibasics.ru/Div.php
Перепешите её под себя, будет ошибку выдавать, если добавите условие которое вам надо ))
Память выделенную под переменную откройте и посмотрите что там внутри.
как вариант
http://www.delphibasics.ru/FloatToStr.php
http://www.delphibasics.ru/FloatToStrF.php
поиграться с выводом, если ошибка, то нужно уже к памяти обращаться под переменной, посмотреть что там ))
Ещё к паскалю в синем экране можно было бы придраться, почему он переменные сам не обнуляет ))
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)