elrincondelc.com
Inicio :: Foros
Usuario: Clave: Regístrate
Salir


duda de casteo

 
Publicar Nuevo Tema   Responder al Tema    Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
Autor Mensaje
LUCAS_S



Registrado: 05 Abr 2005
Mensajes: 74

MensajePublicado: 11/05/2005 7:09 am Responder citando
Título: duda de casteo

hola
si tengo un puntero a void y lo casteo a un int por ejemplo, y luego quiero castearlo de nuevo pero a otro tipo. Mi pregunta es como hago para sacar el primer casteo (o sea ke ya no este casteado por int)
Volver arriba
Ver perfil del usuario Enviar mensaje privado
MBR



Registrado: 06 May 2005
Mensajes: 103

MensajePublicado: 11/05/2005 8:05 am Responder citando
Título:

Pues hay varias formas de hacer un casting. Si lo que quieres es hacer casting entre variables numéricas (de float a int por ejemplo) se podría hacer directamente en la salida, declarándola como %d en lugar de %f de esta forma:

Código:
printf("Dame un número decimal: ");
scanf("%f",&decimal);
printf("El número en entero es: %d", decimal);

Y así con todos los tipos siempre y cuando el casting sea hacia variables de tipo superior, es decir, de float a short int, de short int a int, de int a long int, y de long int a double, ya que la secuencia es escalonada y cada nivel superior engloba al resto de niveles inferiores.

Por otra parte se puede hacer también un casting anteponiendo el nuevo tipo entre paréntesis delante de la variable a la hora de mostrarla:

Código:
printf("Dame un número decimal: ");
scanf("%f",&decimal);
entero=(int)decimal;
printf("El número en entero es: %d",entero);


Espero que te sirva Wink
Volver arriba
Ver perfil del usuario Enviar mensaje privado
LUCAS_S



Registrado: 05 Abr 2005
Mensajes: 74

MensajePublicado: 11/05/2005 8:26 am Responder citando
Título:

si, pero mi pregunta es si hay alguna forma de hacer el casteo y luego sacarlo,, para volver a hacer otro

gracias y saludos
Volver arriba
Ver perfil del usuario Enviar mensaje privado
alej0



Registrado: 03 May 2005
Mensajes: 8
Ubicación: Chile, Concepcion

MensajePublicado: 11/05/2005 9:11 am Responder citando
Título: cast

el cast no modifica el identificador de la variable al que se le aplica, ni su valor, si no el valor que se asigna, me explico.

Código:

int x;
float y, a;
y=1.8       
x=(int)y;   /* esto hace x=1 - esto no modifica el valor de y */
a=y          /* a = 1.8 */
Volver arriba
Ver perfil del usuario Enviar mensaje privado
MBR



Registrado: 06 May 2005
Mensajes: 103

MensajePublicado: 11/05/2005 10:00 am Responder citando
Título:

LUCAS_S escribió:
si, pero mi pregunta es si hay alguna forma de hacer el casteo y luego sacarlo,, para volver a hacer otro

gracias y saludos

Pues así a bote pronto se me ocurre como solución esta:

Código:
float decimal;
char caracter;
printf("Dame un decimal: ");
scanf("%f",&decimal);
caracter=(int)decimal;
printf("El carácter es: %c",caracter);

Ahí haces dos castings: uno de float a int y a continuación muestras el int como char. Es una concatenación de dos castings...no sé si es exactamente lo que pides. Si especificas un poco más exponiendo tu problema quizá pueda serte de más utilidad.
Volver arriba
Ver perfil del usuario Enviar mensaje privado
LUCAS_S



Registrado: 05 Abr 2005
Mensajes: 74

MensajePublicado: 11/05/2005 12:44 pm Responder citando
Título:

podria ser una solucion pero, aca pongo una parte del programa para ke vean como es:
Es una parte de un sistema de tubos y filtros (tubos son colas y filtros funciones), y todo se almacena en una lista simple
fnProceso es un puntero a funcion, y ahi se genera el problema,: cuando entro a otro filtro distinto (otra funcion) el valor de datos_filtro (ke es un puntero a void) no alamcena lo ke debiera

Código:

void PR_Ejecutar( TEjecutor_T_F * ejecutor ){
/*
Ejecuta la cadena de tubos y filtros y genera la salida.
PRE: ejecutor creado
POS: Se generó la salida y no puede volver a ejecutarse.
*/
telem Elem;
TTubo entrada,salida;
palabra e;
int eof=FALSE,saco=TRUE,nerror=TRUE;
C_Crear(&salida,sizeof(palabra));
C_Crear(&entrada,sizeof(palabra));

while (eof==FALSE)
{
nerror=TRUE;
C_Vaciar(&entrada);
ls_MoverCorriente(&(ejecutor->lista_ejecutor),LS_PRIMERO);
ls_ElemCorriente(ejecutor->lista_ejecutor,&Elem);
saco=C_Sacar(&(ejecutor->entrada),&e);
if (saco==TRUE) C_Agregar(&entrada,&e);
else eof=TRUE; // No hay mas palabras
while (nerror==TRUE) // Mientras no se acaben los filtros(la lista_ejecutor)
{
eof=Elem.filtro.fnProceso(Elem.filtro.datos_filtro,&entrada,&(Elem.salida),eof);
if (eof==TRUE) nerror=FALSE;
if (eof==FALSE){
C_Vaciar(&entrada);
copia(&entrada,&(Elem.salida));
C_Vaciar(&Elem.salida);
ls_ModifCorriente(&(ejecutor->lista_ejecutor),&Elem);
nerror=ls_MoverCorriente(&(ejecutor->lista_ejecutor),LS_SIGUIENTE);
if (nerror==TRUE)
ls_ElemCorriente(ejecutor->lista_ejecutor,&Elem);
else if (eof==FALSE) copia(&salida,&entrada);
};
};
};
saco=TRUE;
while (saco==TRUE){
saco=C_Sacar(&salida,&e);
if (saco==TRUE)
fprintf(ejecutor->archivo_salida,"%s\n",e);
};
C_Vaciar(&salida);
C_Vaciar(&entrada);
};


Aca pongo 2 filtros:


Código:
 

int FE_Procesar( void * datos_filtro, TTubo * entrada, TTubo * salida, int eof ){
palabra nueva;
palabra palabras[max_palabras];
int N;

TFiltroExtraer * Filtro = (TFiltroExtraer*) datos_filtro;
if (!C_Vacia(*entrada)){
C_Sacar(entrada,&nueva);
separar(nueva,palabras,&N);
if ((Filtro->n > N )||(Filtro->n == 0)) return FALSE;
else {
C_Agregar(salida,&(palabras[(Filtro->n)-1]));
return FALSE;
};
}
else
if ( eof ){
return TRUE;
}
else
return FALSE;
};
       


Y otro:
Código:
 
int FCC_Procesar( void * datos_filtro, TTubo * entrada, TTubo * salida, int eof )
{
palabra nueva,palabra_agregar,palabra_aux;

char cant[5];

// Casteo los datos filtro a un puntero a TFiltroContarCon
TFiltroContarCon * FiltroContarCon = (TFiltroContarCon*) datos_filtro;
if (!C_Vacia( *entrada )) {
C_Sacar( entrada, &nueva );
if ( strcmp( nueva, FiltroContarCon->ultimaPalabra ) == 0 ){ // Son iguales --> sumo contador y la emito
FiltroContarCon->cantidad=(FiltroContarCon->cantidad)+1;
strcpy(cant,"");
itoa(FiltroContarCon->cantidad,cant,10);
strcpy(palabra_agregar,"00");
strcat(palabra_agregar,cant);
strcat (palabra_agregar,";");
strcat(palabra_agregar,nueva);
C_Agregar( salida,&palabra_agregar );
strcpy( FiltroContarCon->ultimaPalabra,"");
strcpy( FiltroContarCon->ultimaPalabra, nueva );
return FALSE;
}
else // Son distintas
{

(FiltroContarCon->cantidad)=1;
strcpy(cant,"");
itoa(FiltroContarCon->cantidad,cant,10);
strcpy(palabra_agregar,"00");
strcat(palabra_agregar,cant);
strcat (palabra_agregar,";");
strcat(palabra_agregar,nueva);
C_Agregar( salida,&palabra_agregar );
strcpy( FiltroContarCon->ultimaPalabra,"");
strcpy( FiltroContarCon->ultimaPalabra, nueva );
return FALSE;
}
}
else {
if ( eof ){
return TRUE;
}
else return FALSE;
}

};
 

No creo ke lo puedan probar , pero aunke sea si ven algo raro avisenn
muchas gracias

saludos
Volver arriba
Ver perfil del usuario Enviar mensaje privado
Mostrar mensajes anteriores:   
Publicar Nuevo Tema   Responder al Tema    Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1 Todas las horas están en GMT - 8 Horas

 
Saltar a:  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com, 1999-2007

Un proyecto de UrlanHeat.com