Определить целочисленные диапазоны в C - PullRequest
11 голосов
/ 14 апреля 2010

Я хочу определить тип с именем Int_1_100_Type, который является переменной integer в диапазоне от 1 до 100. Как мне определить это?
например: Я передаю эту переменную в функцию, которая принимает переменную типа Int_1_100_Type, funca(Int_1_100_Type Var1)

Ответы [ 5 ]

5 голосов
/ 14 апреля 2010

Вы не можете, C не имеет такой функциональности.Конечно, вы можете ввести int:

typedef int int_1_100_Type;

, но нет возможности ограничить его диапазон.В C ++ вы могли бы создать новый тип с этой функциональностью, но я думаю, что мало кто будет беспокоиться - вам просто нужно поставить проверки диапазона в функциях, которые используют тип.

4 голосов
/ 14 апреля 2010

Конечно можно. Все, что вам нужно, это маленький объектный C.

создать файл со структурой и некоторыми членами

typedef struct s_foo {
  int member;
} Foo;

Foo* newFoo(int input);   // ctor
void get(Foo *f);         // accessor

Обеспечить ваше состояние в мутаторе / ctor

Если вы делаете это в своем собственном файле, вы также можете скрыть значение класса, вы можете сделать oo-like C

1 голос
/ 14 апреля 2010

Вы не можете установить такое ограничение на диапазон целых чисел.

Вы, конечно, можете typedef это все равно:

typedef int int_1_100;

или даже лучше:

typedef unsigned int int_1_100;

Но ничто в C не помешает вам написать:

int_1_100 x = 1000;

Чтобы реализовать что-то подобное, вам нужно скрыть реализацию, но это усложнит инициализацию значения (и невозможно выделить значения типа в стеке с неповрежденным скрытием).

0 голосов
/ 14 апреля 2010

В c нет способа определить тип, который должен находиться в определенном диапазоне. Однако вы можете проверить каждое значение в ваших функциях, например,

int funca(int Var1)
{
    assert(Var1 >= 1);
    assert(Var1 < 101);
    ...
}
0 голосов
/ 14 апреля 2010

В C ++ был бы способ сделать это, написав класс, который действовал бы как целое число, но это было бы слишком много усилий и слишком тяжелое решение, чтобы быть практичным.

Спасибо, Навин, за указание, что вопрос был только на C.

...