• Viernes 15 de Noviembre de 2024, 11:27

Autor Tema:  Punteros Y Casteo  (Leído 2198 veces)

LUCAS_S

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
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
  1.  
  2. int FE_Procesar( void * datos_filtro){  
  3.     TFiltroExtraer * Filtro = (TFiltroExtraer*) datos_filtro;
  4.  
  5. Filtro->n=2;
  6.      return FALSE;
  7.         };  
  8.  
  9.  
  10.  

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
  1.  
  2.  
  3. int FC_Procesar( void * datos_filtro){  
  4.     TFiltroContar * Filtro = (TFiltroContar*) datos_filtro;
  5.  
  6. Filtro->cantidad=1;
  7.      return FALSE;
  8.         };  
  9.  
  10.  
  11.  

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

pitukilloloco

  • Miembro MUY activo
  • ***
  • Mensajes: 104
    • Ver Perfil
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
  1.  
  2. #include <stdio.h>
  3. #include <conio.h>
  4.  
  5. struct TFiltroExtraer {
  6.        int n;
  7. };
  8.  
  9. struct TFiltroContar {
  10.        int cantidad;
  11. };
  12.  
  13. int FE_Procesar (void *datos_filtro)
  14. {  
  15.    TFiltroExtraer *Filtro = (TFiltroExtraer*)datos_filtro;
  16.  
  17.    Filtro->n=2;
  18.    return 0;
  19. };
  20.  
  21. int FC_Procesar (void *datos_filtro)
  22. {  
  23.    TFiltroContar *Filtro = (TFiltroContar*)datos_filtro;
  24.  
  25.    Filtro->cantidad=1;
  26.    return 0;
  27. };        
  28.  
  29. main ()
  30. {
  31.      struct TFiltroExtraer e;
  32.      struct TFiltroContar c;
  33.      
  34.      FE_Procesar (&e);
  35.      FC_Procesar (&c);
  36.      printf ("\ne.n: %d\tc.cantidad: %d", e.n, c.cantidad);
  37.      getch();
  38. }
  39.  
  40.  

me dio como resultado
        e.n: 2        c.cantidad: 1
por lo que no veo problema.

LUCAS_S

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
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
  1.  
  2. #include <stdio.h>
  3. #include <conio.h>
  4.  
  5. struct TFiltroExtraer {
  6.       int n;
  7. };
  8.  
  9. struct TFiltroContar {
  10.       int cantidad;
  11. };
  12.  
  13. int FE_Procesar (void *datos_filtro)
  14. {  
  15.   TFiltroExtraer *Filtro = (TFiltroExtraer*)datos_filtro;
  16.  
  17.   Filtro->n=2;
  18.   return 0;
  19. };
  20.  
  21. int FC_Procesar (void *datos_filtro)
  22. {  
  23.   TFiltroContar *Filtro = (TFiltroContar*)datos_filtro;
  24.  
  25.   Filtro->cantidad=1;
  26.   return 0;
  27. };        
  28.  
  29. main ()
  30. {
  31.     void *e;
  32.     FE_Procesar (e);
  33.     TFiltroExtraer *Filtro1 = (TFiltroExtraer*) e;
  34.     printf ("n: %i\n", Filtro1->n);
  35.     FC_Procesar (e);
  36.     TFiltroContar *Filtro = (TFiltroContar*) e;    
  37.     printf ("cantidad: %i",Filtro->cantidad);
  38.     getch();
  39. }
  40.  
  41.  

este ke hice ni siquiera corre
tambien uso devc++

pitukilloloco

  • Miembro MUY activo
  • ***
  • Mensajes: 104
    • Ver Perfil
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
  1.  
  2. void *e;
  3.  
  4.  
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
  1.  
  2. FE_Procesar (e);
  3.  
  4.  
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
  1.  
  2. struct TFiltroExtraer tfe;
  3. void *e;
  4. e = (struct TFiltroExtraer *)&tfe;
  5.  
  6.  
o crear la variable de la estructura dinámicamente y asignarle la dirección a e así
Código: Text
  1.  
  2. void *e;
  3. e = (struct TFiltroContar *)malloc (sizeof (struct TFiltroExtraer));
  4.  
  5.  
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
    • Ver Perfil
Re: Punteros Y Casteo
« Respuesta #4 en: Viernes 13 de Mayo de 2005, 03:10 »
0
bueno muchas gracias!!   :D  
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
  1.  
  2.  
  3. void PR_Ejecutar( TEjecutor_T_F * ejecutor ){
  4. /*
  5. Ejecuta la cadena de tubos y filtros y genera la salida.
  6. PRE: ejecutor creado
  7. POS: Se generó la salida y no puede volver a ejecutarse.
  8. */
  9. telem Elem;
  10. TTubo entrada,salida;
  11. palabra e;
  12. int eof=FALSE,saco=TRUE,nerror=TRUE;
  13. C_Crear(&salida,sizeof(palabra));
  14. C_Crear(&entrada,sizeof(palabra));
  15.  
  16. while (eof==FALSE)
  17. {
  18. nerror=TRUE;
  19. C_Vaciar(&entrada);
  20. ls_MoverCorriente(&(ejecutor-&#62;lista_ejecutor),LS_PRIMERO);
  21. ls_ElemCorriente(ejecutor-&#62;lista_ejecutor,&Elem);
  22. saco=C_Sacar(&(ejecutor-&#62;entrada),&e);
  23. if (saco==TRUE) C_Agregar(&entrada,&e);
  24. else eof=TRUE; // No hay mas palabras
  25. while (nerror==TRUE) // Mientras no se acaben los filtros(la lista_ejecutor)
  26. {
  27. eof=Elem.filtro.fnProceso(Elem.filtro.datos_filtro,&entrada,&(Elem.salida),eof);
  28. if (eof==TRUE) nerror=FALSE;
  29. if (eof==FALSE){
  30. C_Vaciar(&entrada);
  31. copia(&entrada,&(Elem.salida));
  32. C_Vaciar(&Elem.salida);
  33. ls_ModifCorriente(&(ejecutor-&#62;lista_ejecutor),&Elem);
  34. nerror=ls_MoverCorriente(&(ejecutor-&#62;lista_ejecutor),LS_SIGUIENTE);
  35. if (nerror==TRUE)
  36. ls_ElemCorriente(ejecutor-&#62;lista_ejecutor,&Elem);
  37. else if (eof==FALSE) copia(&salida,&entrada);
  38. };
  39. };
  40. };
  41. saco=TRUE;
  42. while (saco==TRUE){
  43. saco=C_Sacar(&salida,&e);
  44. if (saco==TRUE)
  45. fprintf(ejecutor-&#62;archivo_salida,&#34;%s&#092;n&#34;,e);
  46. };
  47. C_Vaciar(&salida);
  48. C_Vaciar(&entrada);
  49. };
  50.  
  51.  

aca pongo 2 filtros:
Código: Text
  1.  
  2. int FE_Procesar( void * datos_filtro, TTubo * entrada, TTubo * salida, int eof ){
  3. palabra nueva;
  4. palabra palabras[max_palabras];
  5. int N;
  6.  
  7. TFiltroExtraer * Filtro = (TFiltroExtraer*) datos_filtro;
  8. if (!C_Vacia(*entrada)){
  9. C_Sacar(entrada,&nueva);
  10. separar(nueva,palabras,&N);
  11. if ((Filtro-&#62;n &#62; N )||(Filtro-&#62;n == 0)) return FALSE;
  12. else {
  13. C_Agregar(salida,&(palabras[(Filtro-&#62;n)-1]));
  14. return FALSE;
  15. };
  16. }
  17. else
  18. if ( eof ){
  19. return TRUE;
  20. }
  21. else
  22. return FALSE;
  23. };
  24.  
  25.  
y otro

Código: Text
  1.  
  2. int FCC_Procesar( void * datos_filtro, TTubo * entrada, TTubo * salida, int eof )
  3. {
  4. palabra nueva,palabra_agregar,palabra_aux;
  5.  
  6. char cant[5];
  7.  
  8. // Casteo los datos filtro a un puntero a TFiltroContarCon
  9. TFiltroContarCon * FiltroContarCon = (TFiltroContarCon*) datos_filtro;
  10. if (!C_Vacia( *entrada )) {
  11. C_Sacar( entrada, &nueva );
  12. if ( strcmp( nueva, FiltroContarCon-&#62;ultimaPalabra ) == 0 ){ // Son iguales --&#62; sumo contador y la emito
  13. FiltroContarCon-&#62;cantidad=(FiltroContarCon-&#62;cantidad)+1;
  14. strcpy(cant,&#34;&#34;);
  15. itoa(FiltroContarCon-&#62;cantidad,cant,10);
  16. strcpy(palabra_agregar,&#34;00&#34;);
  17. strcat(palabra_agregar,cant);
  18. strcat (palabra_agregar,&#34;;&#34;);
  19. strcat(palabra_agregar,nueva);
  20. C_Agregar( salida,&palabra_agregar );
  21. strcpy( FiltroContarCon-&#62;ultimaPalabra,&#34;&#34;);
  22. strcpy( FiltroContarCon-&#62;ultimaPalabra, nueva );
  23. return FALSE;
  24. }
  25. else // Son distintas
  26. {
  27.  
  28. (FiltroContarCon-&#62;cantidad)=1;
  29. strcpy(cant,&#34;&#34;);
  30. itoa(FiltroContarCon-&#62;cantidad,cant,10);
  31. strcpy(palabra_agregar,&#34;00&#34;);
  32. strcat(palabra_agregar,cant);
  33. strcat (palabra_agregar,&#34;;&#34;);
  34. strcat(palabra_agregar,nueva);
  35. C_Agregar( salida,&palabra_agregar );
  36. strcpy( FiltroContarCon-&#62;ultimaPalabra,&#34;&#34;);
  37. strcpy( FiltroContarCon-&#62;ultimaPalabra, nueva );
  38. return FALSE;
  39. }
  40. }
  41. else {
  42. if ( eof ){
  43. return TRUE;
  44. }
  45. else return FALSE;
  46. }
  47.  
  48. };
  49.  
  50.  
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
    • Ver Perfil
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 :D