1. В сообществе нашего форума Вконтакте создан раздел по продаже электронных компонентов.
    Каждый может продать в нем свои залежавшиеся детали. Подробности здесь.

Решено О приведении типов в mikroPascal

Тема в разделе "Программирование", создана пользователем trengtor, 23 янв 2016.

Статус темы:
Закрыта.
  1. trengtor

    trengtor Guest

    Пришлось намедни лоб-в-лоб столкнуться с недокументированными особенностями приведения типов в mikroPascal:

    var
    x1, x2 : word;
    y1 : longint

    ...

    x1 := 275;
    x2 := 280;
    y1 := x1 - x2;


    Результат получается 5. Не −5, а именно 5. Это особенность реализации, по-видимому, поэтому у компиляторов MicroE надо либо приводить типы к нужному до выполнения операции, либо не забывать приводить прямо в правой части выражения типы тех операндов, которые отличаются от типа левой части (результата) выражения.

    Для приведенного выше примера:

    y1 := longint(x1) - longint(x2);

    2903458.jpg
     
    : mikropascal
  2. UL7AAjr

    UL7AAjr В доску свой

    Сообщения:
    1.895
    Симпатии:
    310
    Род занятий:
    инженер-программист
    Адрес:
    Алма-Ата
    Ничего не попутали?


    0-xy1.jpg

    0-xy2.jpg
  3. trengtor

    trengtor Guest

    Попутать только бес может :) Человек может перепутать :)

    У меня компилятор для AVR, 6.0.0.0, и в нем всё обстоит именно так, как я написал.

    То, что у вас работает иначе – это, в общем-то, маркер того, что это не особенность, а ошибка неявного приведения типов и отличный показатель «стабильности» качества продукции данной конторы, существующей при Белградском университете. «Пасхалки», подобные описанной, могут оказываться в самых неожиданных местах. Например, в 6.1.0.0 у них «отвалилось» срабатывание CASE по дробному значению переменной типа real, пришлось всё пересаживать на if...then...else, а на форуме мне пробовали объяснять, что «и было нельзя». Но 6.1 я в итоге убрал из-за меньшего удобства и вернул 6.0 – в 6.1.x (и соответствующих ему по поколению, для PIC и, видимо, других платформ, включая и вашу версию под STM32 – ведь ядро IDE у них общее) напрочь пропала поддержка кнопочных шорткатов (для выделенных кнопок клавиатуры и мыши, таких как Copy, Paste, Cut на клавиатурах и переназначаемые кнопки мыши), что дико неудобно и раздражает. IDE эти кнопки просто не видит. Пытаюсь вот донести эту несложную мысль до разработчиков, но студенческий саппорт этому отнюдь не способствует.

    Мораль сей басни такова: проверяйте, как описанную ситуацию обрабатывает ваш компилятор и будьте внутренне готовы к сюрпризам.
    Последнее редактирование модератором: 23 янв 2016
  4. UL7AAjr

    UL7AAjr В доску свой

    Сообщения:
    1.895
    Симпатии:
    310
    Род занятий:
    инженер-программист
    Адрес:
    Алма-Ата
    Чтобы понять, в чем дело с приведением типов, надо смотреть какой код генерится компилятором. Я не могу понять, как реузультат вычитания 275 - 280, а это $FFFB при расширении до 32 бит может превратиться в $00000005. Расширение слова до двойного слова - простая операция, и знак при этом не меняется. Если выполнять беззнаковое расширене, то результатом будет $0000FFFB, т.е. 65531. А никак не 5.

    А вот case по real отключили правильно, удивительно, что работало. Только криворукий программист будет сравнивать числа с плавающей запятой по "=" или не "<>".
  5. trengtor

    trengtor Guest

    Ок. Прошу модераторов удалить данную тему ввиду ее бесполезности.
Статус темы:
Закрыта.

Поделиться этой страницей