Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

CCS C - SWTICH() bug
http://mcu-bg.com/mcu_site/viewtopic.php?f=14&t=13792
Страница 1 от 1

Автор:  speedblue [ Пет Май 22, 2015 12:14 am ]
Заглавие:  CCS C - SWTICH() bug

Пиша нещо с компилатора на CCS C 5.045 за PIC24F и попаднах на банален бъг който ме замота, беше неочаквано банален. И на други бъгове съм попадал, но да кажем, че някак се преживяват.
Накратко - SWITCH() работи правилно с отрицателни числа само ако проверяваната стойност е 16 бита (signed int16). При 8 бита (signed int8) се омазва. Дизасемблера показва, че при (signed int8) компилатора не се усеща и сравнява с int16.
Не съм тесвал при другите типове процесори.

This does not work correctly:
Код:
#include <24FJ64GA002.h>

void main() {
    signed int8 i8;
   
    i8= -1;
    switch (i8) {
        case -1 :
            i8= 0;    // <---- BUG - Can't reach this line
            break;
    }

    if (i8 == -1) {   // <---- This work OK
        i8= 0;
    }
}


This does work correctly:
Код:
#include <24FJ64GA002.h>

void main() {
    signed int16 i16;
   
    i16= -1;
    switch (i16) {
        case -1 :
            i16= 0;
            break;
    }

    if (i16 == -1) {
        i16= 0;
    }
}

Автор:  Desert Leo [ Пет Май 22, 2015 10:13 am ]
Заглавие:  Re: CCS C - SWTICH() bug

А бе преживяват се, ама докато стоплиш, че е бъг на компилатора... Аз затова съм се закотвил на 5.025 и чакам да понамалее бълването на нови версии, за да скоча на последната.

Автор:  bateAz [ Пет Май 22, 2015 12:10 pm ]
Заглавие:  Re: CCS C - SWTICH() bug

А опитвал ли си как ще се държи вариантът с 8-битов аргумент, ако е така:
case (signed int8)(-1):
....

?

Автор:  speedblue [ Пет Май 22, 2015 5:54 pm ]
Заглавие:  Re: CCS C - SWTICH() bug

Код:
#include <24FJ64GA002.h>

void main() {
    signed int8 i8;
   
    i8= -1;
    switch ((signed int8)i8) {     // Bug
    switch ((signed int16)i8) {    // Work but is bug
    switch (-1) {                  // Work but unusable
        case -1 :                    // Variant 1, bad
        case (signed int8)(-1) :     // Variant 2, bad
            i8= 0;    // <---- BUG - Can't reach this line
            break;
    }

    if (i8 == -1) {   // <---- This work OK
        i8= 0;
    }
}

Автор:  bateAz [ Пет Май 22, 2015 5:59 pm ]
Заглавие:  Re: CCS C - SWTICH() bug

Tова не е онова.
Идеята беше да сложиш каст на case, а не на switch

Автор:  speedblue [ Пет Май 22, 2015 6:14 pm ]
Заглавие:  Re: CCS C - SWTICH() bug

Нищо не помага. Твърдо обработват WORD вместо BYTE и няма откачане от ситуацията с такива трикове.
При използването на IF () съвсем коректно цепят WORD-а на две и ползват правилната част.
Иначе става и така - всички аргументи да са (signed int16) и цепи мрака.... докато не заорат другаде :)

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/