Отговори на тема  [ 6 мнения ] 
CCS C - SWTICH() bug 
Автор Съобщение
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Нед Фев 25, 2007 1:41 am
Мнения: 276
Местоположение: София
Мнение 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;
    }
}


Пет Май 22, 2015 12:14 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 10, 2005 3:25 pm
Мнения: 5677
Местоположение: София
Мнение Re: CCS C - SWTICH() bug
А бе преживяват се, ама докато стоплиш, че е бъг на компилатора... Аз затова съм се закотвил на 5.025 и чакам да понамалее бълването на нови версии, за да скоча на последната.


Пет Май 22, 2015 10:13 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение Re: CCS C - SWTICH() bug
А опитвал ли си как ще се държи вариантът с 8-битов аргумент, ако е така:
case (signed int8)(-1):
....

?


Пет Май 22, 2015 12:10 pm
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Нед Фев 25, 2007 1:41 am
Мнения: 276
Местоположение: София
Мнение 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;
    }
}


Последна промяна speedblue на Пет Май 22, 2015 6:08 pm, променена общо 2 пъти



Пет Май 22, 2015 5:54 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение Re: CCS C - SWTICH() bug
Tова не е онова.
Идеята беше да сложиш каст на case, а не на switch


Пет Май 22, 2015 5:59 pm
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Нед Фев 25, 2007 1:41 am
Мнения: 276
Местоположение: София
Мнение Re: CCS C - SWTICH() bug
Нищо не помага. Твърдо обработват WORD вместо BYTE и няма откачане от ситуацията с такива трикове.
При използването на IF () съвсем коректно цепят WORD-а на две и ползват правилната част.
Иначе става и така - всички аргументи да са (signed int16) и цепи мрака.... докато не заорат другаде :)


Пет Май 22, 2015 6:14 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 6 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни