вторник, 19 января 2016 г.

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

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

var 
x1, x2 : word; 
y1 : longint
...
x1 := 275;
x2 := 280;
y1 := x1 - x2;

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

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

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

Ну и на сладкое:

3 комментария:

  1. Итого, наконец-то (!!!) целочисленный PID-регулятор зашевелился так, как ему и положено. Пока лишь очень грубо настроил, но паять уже вполне позволяет. Даже полигоны. Осталось хорошенько оттюнинговать PID и, пожалуй, в основном будет всё. Останется добавить sleep timeout и пробуждение (тут надо думать, как именно: потрогать энкодер, как в eSol, или же делать какую-то активную подставку).

    ОтветитьУдалить
    Ответы
    1. Паскаль вроде как с жёсткой типизацией был, и неявных кастов вообще не должен делать, а получается что делает? выходки навроде unsignedint(-1) к чему приводят?
      +датчик движения в ручку, он крохотный, место наверняка можно выкроить...

      Удалить
    2. Тут от Паскаля разве что привычный синтаксис. Типизация как бы жесткая, но там же нарукоблудили ребята из белградского Университета. И это периодически лезет наружу.

      «выходки навроде unsignedint(-1) к чему приводят?» – я взял микропаскалевский тип word, ожидаемо переполнило, выдало 65535.

      Удалить

Ваш комментарий откроется после проверки и подтверждения.
Благодарю за понимание необходимости проверки!