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
Respuesta
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.
¿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
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
Incluso podría 'typedef' a' char' en este caso. – caf
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).
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.
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);
...
}
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
(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
- 1. Extraer enteros de rangos
- 2. Rangos enteros de Python
- 3. Conversión de conjuntos de enteros en rangos utilizando C#
- 4. Conversión de conjuntos de enteros en rangos
- 5. Declaración de caso Delphi para rangos enteros
- 6. Concatenar enteros en C#
- 7. enteros grandes en C#
- 8. Cómo definir duro en código de una matriz de enteros [] []
- 9. Definir matriz en C
- 10. ¿Qué rango de valores pueden almacenar tipos enteros en C++
- 11. Enteros de ancho fijo en C++
- 12. Encontrar rangos contiguos en matrices
- 13. enteros arbitrariamente grandes en C#
- 14. ¿Definir nuevos operadores en C#?
- 15. argumentos enteros para C++
- 16. Rangos de direcciones IPv6
- 17. Manera pitónica de convertir una lista de enteros en una cadena de rangos separados por comas
- 18. ¿Es imposible usar rangos decimales en un interruptor en C#?
- 19. Múltiples rangos en una tabla
- 20. sql - agrupe por en rangos para incluir rangos sin valores
- 21. C# deserializing enumeraciones de enteros
- 22. enteros sin signo en C++ para bucles
- 23. 2 bytes representan 3 enteros en C
- 24. Intercambio de bytes enteros en C++
- 25. Casting entre enteros y punteros en C++
- 26. Cómo convertir caracteres a enteros en C?
- 27. Manejar enteros de longitud arbitraria en C++
- 28. Manejo de enteros "grandes" en C#
- 29. Matrices tridimensionales de enteros en C++
- 30. División de enteros en C++ 11
¿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. –
¿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
@tzaman Si el lenguaje lo admite (y algunos lo hacen) es una buena característica y evita escribir comprobaciones de rango por todas partes. –