2010-04-14 21 views
11

Quiero definir un tipo llamado Int_1_100_Type que es una variable integer en el rango de 1 a 100. ¿Cómo debo definir esto?
por ejemplo: estoy pasando esta variable a una función que acepta variable de tipo Int_1_100_Type, funca(Int_1_100_Type Var1)Definir rangos enteros en C

+9

¿Por qué el voto a favor? Solo porque lo que OP quiere hacer no se puede hacer en C, no significa que la pregunta no sea lo suficientemente clara y razonable. –

+0

¿Por qué querrías hacer esto? Si su función necesita información en un rango particular, puede hacer una comprobación de límites en una variable 'int 'normal. – tzaman

+7

@tzaman Si el lenguaje lo admite (y algunos lo hacen) es una buena característica y evita escribir comprobaciones de rango por todas partes. –

Respuesta

5

No se puede, C no tiene dicha funcionalidad. Por supuesto, puede escribir un int:

typedef int int_1_100_Type; 

pero no hay forma de restringir su rango. En C++, podría crear un nuevo tipo con esta funcionalidad, pero creo que muy pocas personas se molestarían; solo necesita poner controles de rango en la (s) función (es) que usan el tipo.

+0

¿Quizás uno podría fingir con un 'enum', si uno estaba clínicamente loco? Por supuesto, incluso eso no evitaría que nadie pasara ningún entero antiguo. – tzaman

+0

No realmente. Una enumeración siempre tiene un rango que incluye 0, y la cantidad de valores posibles siempre es una potencia de 2.Ejemplo clásico: el rango de 'derechos de enum {Read = 1, Write = 2};' incluye 0 (sin derechos) y 3 (ambos). – MSalters

+0

Incluso podría 'typedef' a' char' en este caso. – caf

1

No se puede poner ese tipo de límite en el rango de un entero.

Puede, por supuesto typedef de todos modos:

typedef int int_1_100; 

o incluso mejor:

typedef unsigned int int_1_100; 

Pero nada en C le impedirá escribir:

int_1_100 x = 1000; 

implementar algo así, necesitas ocultar la implementación, pero eso hará que sea más difícil inicializar ize el valor (e imposible de asignar valores del tipo en la pila, con la ocultación intacta).

0

En C++, habría una forma de hacerlo escribiendo una clase que actuaría como un entero, pero sería demasiado esfuerzo y una solución demasiado pesada para ser práctico.

Gracias a Naveen por señalar que la pregunta era solo C.

+3

está etiquetada como c not C++. – Naveen

+0

Uh, sí mi mal ... Esto solo sería posible en C++ – wich

0

No hay forma en que c defina un tipo que debe estar en un rango específico. Sin embargo, puede verificar cada valor en sus funciones, p.

int funca(int Var1) 
{ 
    assert(Var1 >= 1); 
    assert(Var1 < 101); 
    ... 
} 
4

Por supuesto que puede. Todo lo que necesita es un poco basado en objetos C.

crear un archivo con una estructura y algunos miembros

typedef struct s_foo { 
    int member; 
} Foo; 

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

hacer cumplir su condición en el mutador/ctor

Si lo hace en su propio archivo, también puede ocultar el impl de la clase, puede hacer oo-like C

+0

(Grr ... no formateando en los comentarios) En los últimos meses he aprendido una forma aún mejor de hacerlo. Es un poco elaborado, pero aquí está la versión corta. agregue "newFoo" y "get" como miembros de la estructura Foo (miembros que tienen punteros de función), y puede implementar "newFoo" y "get" como funciones estáticas en un archivo C separado, siempre que tenga un constructor para Foo (que proporcionaría encapsulación, implementación-ocultación (algún nivel), y una agradable interfaz abstracta para crear objetos de tipo Foo) – shiva