| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 24/08/2007 8:12 am | | | Título: |
| | Mijail escribió: | | worm escribió: | | ¿Lo que deseas es determinar si la variable "variable" es de tipo char y en base a eso generar una determinada accion? |
Me referia exactamente a eso. Ya veo que no puedo. |
En buen plan y siendo completamente honesto no le veo utilidad ya que si la declaracion de la variable y su uso se encuentran en el mismo bloque uno ya sabe cual es el tipo de esta.
Y si la declaracion y uso se encuentran en bloques diferentes (me refiero a funciones) se debe pasar el argumento ya sea como un tipo fijo, mediante una funcion con un numero variable de argumentos o mediante un puntero generico (el tipo "void *") pero en estos dos ultimos casos se tendria que pasar a la funcion informacion adicional para realizar la conversion correcta.
Por cierto el numero de bits por caracter usualmente es ocho pero esto no esta garantizado, es mejor utilizar la macro CHAR_BIT definida en limits.h para conocer este valor. En el caso del numero de bits que componen cada tipo este esta dado por la implementacion siendo el minimo 16 bits para los tipos short e int y 32 para el tipo long.
Un caso similar es el rango valido de cada tipo.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
|
| Volver arriba | |
 |
cheroky
Registrado: 22 Sep 2005 Mensajes: 1372 Ubicación: En ecx esperando un call
| Publicado: 25/08/2007 9:59 am | | | Título: |
| Quizas simplemente quiera saber si el dato almacenado corresponde al juego de caractres asccii y este es alfanumerico o del alfabeto, un problema de concepto en los novatos es confundir el tipo char con una 'letra'.
S2. _________________ - Explícito es mejor que implícito. - Simple es mejor que complejo. - Complejo es mejor que complicado. - Plano es mejor que anidado. - Ralo es mejor que denso. |
|
| Volver arriba | |
 |
daltomi
Registrado: 28 Abr 2007 Mensajes: 114 Ubicación: Argentina
| Publicado: 25/08/2007 11:03 am | | | Título: |
| Me parece que podría comprobar la (variable) con el tamaño exacto en C++ del tipo char que es el caracter A, en contra que en C es el tipo int. A ver si me explico mejor:
| Código: | inline int cplusplus() { return(sizeof(char)==sizeof('A')); } ........... int i = 0; char c = 0;
if(cplusplus()) { // cambiar c por i if(sizeof(c)==sizeof('A')) { cout<<"es tipo char"; }else{ cout<<"no es tipo char"; } }
|
Determining C or C++ Compilation at Runtime:
In C++ the size of a constant character ('A') equals that of the type char, which is something you would expect. In C, however, the size of a constant character equals that of the type int. |
|
| Volver arriba | |
 |
|
cheroky
Registrado: 22 Sep 2005 Mensajes: 1372 Ubicación: En ecx esperando un call
| Publicado: 25/08/2007 1:28 pm | | | Título: |
| No entiendo que quieres decir, sizeof se resuelve en tiempo de compilacion, la constante caracter en C++ se promociona a este tipo y asi es su r-value.
En este caso se puede utilizar el mecanismo RTTI de c++ y usar typeid, pero insisto, no creo que nuestro amigo deseara eso, mas bien me inclino por lo que dije antes.
S2. _________________ - Explícito es mejor que implícito. - Simple es mejor que complejo. - Complejo es mejor que complicado. - Plano es mejor que anidado. - Ralo es mejor que denso. |
|
| Volver arriba | |
 |
daltomi
Registrado: 28 Abr 2007 Mensajes: 114 Ubicación: Argentina
| Publicado: 25/08/2007 7:40 pm | | | Título: |
| Cierto que se puede con typeid, no lo tenía presente desde hace tiempo. Sobre si Mijail quiere conocer si (variable) es del tipo char o si corresponde a un código ascii, creo que es la primera, habria que ver que es lo que dice.
Saludos. |
|
| Volver arriba | |
 |
Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 90
| Publicado: 26/08/2007 3:57 am | | | Título: |
| | Esto de la función sizeof() ya lo pensé pero me pareció un poco inútil porque esa variable a la cual miras el tamaño ya sabes que tamaño tiene pues ya la has definido previamente. |
|
| Volver arriba | |
 |
|
rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 26/08/2007 7:27 am | | | Título: |
| Como ya se comento lo mas sencillo seria tener informacion adicional que indicara el tipo del objeto , esto para no tener que recurrir a sizeof.
Un ejemplo sencillo utilizando una union se describe en el tema Union discriminada.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
|
| Volver arriba | |
 |
Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 90
| Publicado: 26/08/2007 11:05 am | | | Título: |
| Aquí tienes la función charint() que he creado la cual te permitiría discernir si cierta cadena de caracteres representa un entero o no. Y además si representa un entero te lo transforma en entero. Esto, para el programa que hiciste te debería servir.
| Código: | #include<stdio.h>
//FUNCION POTENCIA ENTERA QUE DA EL RESULTADO DE A^B int potencia(int a, int b) { int indice,poten=1; for(indice=0 ; indice<b ; indice++) { poten*=a; } return poten; }
//CONVIERTE UNA CADENA DE CARACTERES EN UN NUMERO ENTERO SI LA CADENA REPRESENTA UN NUMERO ENTERO int charint(char *cadena,int *TipoVariable) { int numero=0,longchar,indice; longchar=strlen(cadena); for(indice=0 ; indice<longchar; indice++) { if(cadena[indice]>=48 && cadena[indice]<=57) { numero+=(cadena[indice]-48)*potencia(10,longchar-indice-1); } else { *TipoVariable=1; } } return numero; }
int main() { char cadena[11]; int TipoVar=0; int numero; printf("Escribe un numero\n"); scanf("%s",cadena); numero=charint(cadena,&TipoVar); if( TipoVar==0) { printf("%d es un numero",numero); } else { printf("%s no es un numero",cadena); } return 0; } |
Saludos!  |
|
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 26/08/2007 1:59 pm | | | Título: |
| Para obtener un numero entero en base a una cadena de texto la biblioteca estandar de C provee de varias opciones como atoi, sscanf, strtol, etc., cual de estas elegir depende de que tan solida sea la validacion que uno requiera.
En el caso de desarrollar nuestra propia funcion no es necesario una funcion de potencia, basta con multiplicar el total acumulado por dies y sumar el digito siendo procesado, para esto ultimo se puede utilizar la funcion isdigit (ctype.h):
| Código: | #include <stdio.h> #include <stdlib.h> #include <ctype.h>
int fn_atoi(char *cadena, int *es_entero);
int main(void) { char cadena[11]; int es_entero; int numero; printf("Escribe un numero: "); fflush(stdout); if (scanf("%10s", cadena) != 1) return EXIT_FAILURE; numero = fn_atoi(cadena, &es_entero); if (es_entero) printf("%d es un numero\n", numero); else printf("%s no es un numero\n", cadena); return EXIT_SUCCESS; }
int fn_atoi(char *cadena, int *es_entero) { int numero; for (numero = 0; isdigit(*cadena); cadena++) numero = numero * 10 + (*cadena - '0'); *es_entero = (*cadena == '\0'); return numero; } |
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
|
| Volver arriba | |
 |
|
Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 90
| Publicado: 26/08/2007 4:06 pm | | | Título: |
| | gracias por el apunte! |
|
| Volver arriba | |
 |
spesmod
Registrado: 23 Ago 2007 Mensajes: 33
| Publicado: 28/08/2007 7:09 am | | | Título: |
| pero es que a cualkiera se le cuela un puto error, y me di cuenta cuando ya estaba en el foro... jijiji pero no te vas a kejar con lo demas no? espero q t haya servido, xiao. _________________ |--A--Q--U--A--|
|
|
| Volver arriba | |
 |
|
|