Martes 5 de Noviembre de 2024, 11:47
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Punteros Y Casteo
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Punteros Y Casteo (Leído 2187 veces)
LUCAS_S
Nuevo Miembro
Mensajes: 4
Punteros Y Casteo
«
en:
Miércoles 11 de Mayo de 2005, 18:56 »
0
hola ke tal????
bueno mi problema es ke tengo esta funcion:
Código: Text
int FE_Procesar( void * datos_filtro){
TFiltroExtraer * Filtro = (TFiltroExtraer*) datos_filtro;
Filtro->n=2;
return FALSE;
};
en donde TFiltroExtraer es un struct con un campo que se llama n (int)
y mas abajo accedo a esta otra funcion:
Código: Text
int FC_Procesar( void * datos_filtro){
TFiltroContar * Filtro = (TFiltroContar*) datos_filtro;
Filtro->cantidad=1;
return FALSE;
};
en donde TFiltroContar es un struct con un campo que se llama cantidad (int)
el problema esta cuando salgo de la segunda funcion, el puntero datos filtro no sale con cantidad=1 sino con cantidad=9182732 (no exactamente eso pero parecido)
pienso ke el problema es en el casteo....
pero no se...
saben cual es el problema?????
saludos
Tweet
pitukilloloco
Miembro MUY activo
Mensajes: 104
Re: Punteros Y Casteo
«
Respuesta #1 en:
Jueves 12 de Mayo de 2005, 00:46 »
0
Corrí tu ejemplo con el compilador dev c++ y no me dio problemas, este es el ejemplo que puse
Código: Text
#include <stdio.h>
#include <conio.h>
struct TFiltroExtraer {
int n;
};
struct TFiltroContar {
int cantidad;
};
int FE_Procesar (void *datos_filtro)
{
TFiltroExtraer *Filtro = (TFiltroExtraer*)datos_filtro;
Filtro->n=2;
return 0;
};
int FC_Procesar (void *datos_filtro)
{
TFiltroContar *Filtro = (TFiltroContar*)datos_filtro;
Filtro->cantidad=1;
return 0;
};
main ()
{
struct TFiltroExtraer e;
struct TFiltroContar c;
FE_Procesar (&e);
FC_Procesar (&c);
printf ("\ne.n: %d\tc.cantidad: %d", e.n, c.cantidad);
getch();
}
me dio como resultado
e.n: 2 c.cantidad: 1
por lo que no veo problema.
LUCAS_S
Nuevo Miembro
Mensajes: 4
Re: Punteros Y Casteo
«
Respuesta #2 en:
Jueves 12 de Mayo de 2005, 02:09 »
0
si es verdad me anda, pero el ke tengo es algo asi: en realidad es un programa mucho mas complejo, y grande, asike puede ser ke el problema este en otro lado
Código: Text
#include <stdio.h>
#include <conio.h>
struct TFiltroExtraer {
int n;
};
struct TFiltroContar {
int cantidad;
};
int FE_Procesar (void *datos_filtro)
{
TFiltroExtraer *Filtro = (TFiltroExtraer*)datos_filtro;
Filtro->n=2;
return 0;
};
int FC_Procesar (void *datos_filtro)
{
TFiltroContar *Filtro = (TFiltroContar*)datos_filtro;
Filtro->cantidad=1;
return 0;
};
main ()
{
void *e;
FE_Procesar (e);
TFiltroExtraer *Filtro1 = (TFiltroExtraer*) e;
printf ("n: %i\n", Filtro1->n);
FC_Procesar (e);
TFiltroContar *Filtro = (TFiltroContar*) e;
printf ("cantidad: %i",Filtro->cantidad);
getch();
}
este ke hice ni siquiera corre
tambien uso devc++
pitukilloloco
Miembro MUY activo
Mensajes: 104
Re: Punteros Y Casteo
«
Respuesta #3 en:
Jueves 12 de Mayo de 2005, 07:44 »
0
Bueno, en este último ejemplo que pones defines al comienzo un apuntador genérico
Código: Text
void *e;
pero no lo haces que apunte a algo, por lo que cuando le pasas ese apuntador a la función
FE_Procesar
Código: Text
FE_Procesar (e);
pues lógicamente va a haber un error, pues esta función supone que el parámetro que está recibiendo está apuntando a una parte válida de memoria. Lo correcto es inicializarlo asignándole la dirección de una variable que hayas creado antes de cualquiera de las dos estructuras, por ejemplo
Código: Text
struct TFiltroExtraer tfe;
void *e;
e = (struct TFiltroExtraer *)&tfe;
o crear la variable de la estructura dinámicamente y asignarle la dirección a
e
así
Código: Text
void *e;
e = (struct TFiltroContar *)malloc (sizeof (struct TFiltroExtraer));
Si usas
malloc
no se te olvide incluír
<malloc.h>
, que es el encabezado que usa dev c++ y microsoft C para manejar la memoria dinámica (bueno, estoy suponiendo que estás programando en C, ya que en C++ en vez de usar la función
malloc
para solicitar memoria dinámica puedes usar la palabra reservada
new
para hacer lo mismo)
Corrí este último código que pusiste haciendo la 2a corrección que te indiqué (la que usa
malloc
) y me corrió sin ningún problema dándome como salida
n: 2
cantidad: 1
LUCAS_S
Nuevo Miembro
Mensajes: 4
Re: Punteros Y Casteo
«
Respuesta #4 en:
Viernes 13 de Mayo de 2005, 03:10 »
0
bueno muchas gracias!!
anda bien este programa
pero en realidad tengo ke hacer algo parecido, pero no anda bien 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: Text
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: Text
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: Text
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 puedas probar , pero aunke sea si ves algo raro me podes decir
muchas gracias
saludos
LUCAS_S
Nuevo Miembro
Mensajes: 4
Re: Punteros Y Casteo
«
Respuesta #5 en:
Viernes 13 de Mayo de 2005, 03:23 »
0
GRACIASSSS!!!!
SE ME OCURRIO ALGO CON LO KE ME DIJISTE DEL MALLOC Y LO SOLUCIONE!
ANDA BIEN!!!!!
TE AGRADESCO MUCHISIMO!
SALUDOS
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Punteros Y Casteo