Реализация типа данных диапазона - PullRequest
2 голосов
/ 05 января 2012

У меня есть устаревший код, который использует enum в качестве диапазона и перебирает диапазон.Мне нужно перенести это на новую платформу и сделать ее более безопасной.

Примечание: enum s небезопасно перебирать, поскольку могут быть «дыры» или пробелы между значениями.

Я ищу безопасный Cязыковой шаблон для типа диапазона.

Например, учитывая диапазон (КРАСНЫЙ, ФИОЛЕТОВЫЙ, СИНИЙ, ЗЕЛЕНЫЙ, ЖЕЛТЫЙ, ОРАНЖЕВЫЙ), я хочу перебрать каждое значение, например "FOR color IN (RED, VIOLET"), СИНИЙ, ЗЕЛЕНЫЙ, ЖЕЛТЫЙ, ОРАНЖЕВЫЙ) ".

При поиске в SO и в Интернете я получаю ответы о диапазоне типа данных, например диапазоне целого числа.

Этот код будет находиться во встроенной системе, в которой используется процессор ARM7.

Ответы [ 2 ]

3 голосов
/ 05 января 2012

Перечисление может работать нормально, если вы позволяете компилятору выбирать значения.Таким образом, не было бы дыр.Вы можете, например, сделать это:

enum colors {
    FIRST_COLOR=0,
    RED=FIRST_COLOR, VIOLET, BLUE, GREEN, YELLOW, ORANGE,
    NUM_COLORS
}

enum colors color;
for (color=FIRST_COLOR; color<NUM_COLORS; color++) {
    // whatever
}

И цитата из стандарта ANSI C:

Если первый перечислитель не имеет =,значение его константы перечисления равно 0. Каждый последующий перечислитель с no = определяет свою константу перечисления как значение выражения константы, полученного путем добавления 1 к значению предыдущей константы перечисления

1 голос
/ 05 января 2012

Вы можете использовать массив:

 static Color colors[] = {Red, Violet, Green, Yellow, Orange};
 #define SIZE(x) sizeof(x)/sizeof(*x)

 for(x=0; x<SIZE(colors); x++){
      //do stuff with colors[x]
 }

В противном случае вы увидите обычный шаблон:

 enum Colors {FirstColor, Red=0, Violet, Green, Yellow, Orange, LastColor};

 for(x=FirstColor; x<LastColor; x++){
     //do stuff with x.
 }

Но если способ их итерации измениться, вы всегда можете определитьфункция nextcolor() и:

 for(x=FirstColor;x<LastColor;x=nextcolor(x)){
     //do stuff with x.
 }
...