На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> ДЕление на 0 в DELPHI 2007 , Почему не выскакивает ошибка ?
    ExpandedWrap disabled
      procedure TForm8.FormCreate(Sender: TObject);
      var
      d:Double;
      begin
       d := 12/0;
       d:=d*2;
       Self.Tag := Trunc(D*2);//Ошибка вылетает только здесь, но по идее должна же вылетать на делении
      end;

    В инете находил инфу только по констатации факта, что для того, чтобы было корректно и вылетала ошибка, шужно делать через переменную.
    ExpandedWrap disabled
      procedure TForm8.FormCreate(Sender: TObject);
      var
      d,с:Double;
      begin
       с := 12;
       d := c/0;
       d:=d*2;
       Self.Tag := Trunc(D*2);//Ошибка вылетает только здесь, но по идее должна же вылетать на делении
      end;

    Вот так ошибка уже не вылетает. ВОпрос. МОжно ли в настройках дельфи сделать так, чтобы ошибку выдавалобез переменной С сразу при делении 12 на 0?
    Сообщение отредактировано: Marriage -
      Гм, может я не прав, но при чем тут Делфи вообще?
      Ошибка деления на 0 возникает только для целых типов.
      У вас же - Double. Там никаких ошибок быть не может т.к. результат деления на 0 - Inf (специальное значение для форматов с плавающей запятой. Еще есть NaN).
        Цитата Marriage @
        МОжно ли в настройках дельфи сделать так, чтобы ошибку выдавало без переменной С сразу при делении 12 на 0?

        Видимо нет, т.к. компилятор воспринимает константное выражение d:=12/0 как "осознанное" присвоение переменной d значения Infinity, вполне допустимое для вещественных чисел. Соотв-но встречая 12/0 компилятор ничего не делит, а просто заменяет деление присвоением d:=Infinity

        Цитата Chow @
        Ошибка деления на 0 возникает только для целых типов.
        У вас же - Double. Там никаких ошибок быть не может т.к. результат деления на 0 - Inf

        С поправкой, что это относится только к константам, т.к. при явном делении в рантайме d:=c/0 ошибка EZeroDivide ес-но возникает (если ее специально не маскировать вызовом SetExceptionMask)
          все гораздо проще... компилятор оптимизирует строчки:
          ExpandedWrap disabled
            d := 12/0;
             d:=d*2;
             Self.Tag := Trunc(D*2);
          в
          ExpandedWrap disabled
            Self.Tag := Trunc((12/0)*2*2);

          может даже быть так, что переменная в опертивной памяти не наблюдается
            Цитата SPrograMMer @
            все гораздо проще...

            А что проще то ? По любому при наличии в константном выражении деления на 0 компилятор заменяет все выражение на Infinity, которое для процессора является вполне легальным значением и соотв-но ни его загрузка в FPU, ни умножения\деления и т.п. на конечные значения не вызывают никаких исключений. Поэтому независимо от того соптимизирует компилятор вычисления или нет, ошибка тут будет не EZeroDivide, а EInvalidOp при попытке преобразовать Infinity к целому числу через Trunc
            Сообщение отредактировано: leo -
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0.0799 ]   [ 16 queries used ]   [ Generated: 15.05.26, 11:45 GMT ]