Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Fatidico suspisious pointer conversion.

Estas en el tema de Fatidico suspisious pointer conversion. en el foro de C/C++ en Foros del Web. Buenas gente, ya entiendo mejor la listas, un gran paso ejje. Pero hay una cosa que no logro resolver, los malditos warnings, y cunado son ...
  #1 (permalink)  
Antiguo 21/01/2012, 05:13
 
Fecha de Ingreso: septiembre-2011
Mensajes: 87
Antigüedad: 13 años, 2 meses
Puntos: 6
Fatidico suspisious pointer conversion.

Buenas gente, ya entiendo mejor la listas, un gran paso ejje.

Pero hay una cosa que no logro resolver, los malditos warnings, y cunado son de suspisious pointer no me gustan nada.

tengo declarada la tupla nodo, con el prototipo de la funcion añadir.(Lo siento esta en Catalan ejej):
Código C:
Ver original
  1. struct LEnters{
  2.     int info;
  3.     struct Enters *seg;
  4. };
  5.  
  6.  
  7. int afegirInici(struct LEnters **pinici, int num);

Aqui el c:
Código C:
Ver original
  1. int afegirInici(struct LEnters **pinici, int num){
  2.  
  3.     struct LEnters *aux;
  4.  
  5.     aux=malloc(sizeof(struct LEnters));
  6.  
  7.     if(aux==NULL) return 1;
  8.  
  9.     aux->info=num;
  10.     aux->seg=*pinici;
  11.     *pinici=aux;
  12.  
  13.    return 0;
  14. }

El suspisious pinter me lo lanza siempre que accedo aux->seg;, osea siempre que accedo al seg, que es un puntero a struct.

Sera que no accedo bien a ese puntero?

Gracias.
  #2 (permalink)  
Antiguo 21/01/2012, 05:57
 
Fecha de Ingreso: septiembre-2011
Mensajes: 87
Antigüedad: 13 años, 2 meses
Puntos: 6
Respuesta: Fatidico suspisious pointer conversion.

esta todo bien?
  #3 (permalink)  
Antiguo 21/01/2012, 10:03
 
Fecha de Ingreso: diciembre-2011
Ubicación: Crespo - Entre Rios
Mensajes: 155
Antigüedad: 12 años, 11 meses
Puntos: 25
Respuesta: Fatidico suspisious pointer conversion.

que raro, a mi no dio ninguna advertencia, solamente no compilaba, para que compile cambie las siguientes lineas:

en el primero codigo:
linea 3:

Código C:
Ver original
  1. struct LEnters *seg;//el tipo estaba mal, le agrege la L

en el segundo codigo:
linea 5:
Código C:
Ver original
  1. //la funcion malloc devuelve un puntero a void, asi que tienes que agregar antes
  2. //(LEnters*) para la compatibilidad de tipo
  3. LEnters *aux=(LEnters*)malloc(sizeof(LEnters));
  #4 (permalink)  
Antiguo 21/01/2012, 11:11
 
Fecha de Ingreso: septiembre-2011
Mensajes: 87
Antigüedad: 13 años, 2 meses
Puntos: 6
Respuesta: Fatidico suspisious pointer conversion.

Lo primero es verdad, que pajaro!!! Eso es por tanto tocar jejej. A mi incluso me compila, como vamos con el borland c++...

lo segundo no hace falta asegurarte que te devuelva un puntero a LEnters. No entiendo porque lo haces.

Salduos y muchas gracias.
  #5 (permalink)  
Antiguo 21/01/2012, 12:52
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 10 meses
Puntos: 94
Respuesta: Fatidico suspisious pointer conversion.

La funcion malloc te devuelve un puntero a void por lo que deberias castear ese retorno al tipo (LEnters *), si bien compila perfectamente e incluso no tira warning es porque internamente el compilador lo "interpreta" como si fuese correcto. ojo no te acostumbres a dejarlo sin castear es de buena practica hacerlo ademas cuando trabajes con el tipo de dato void * vas a ver que si o si necesitas castear
No soy un experto en C pero mas o menos asi me explicaron el tema de malloc

Saludos
  #6 (permalink)  
Antiguo 21/01/2012, 13:12
 
Fecha de Ingreso: diciembre-2011
Ubicación: Crespo - Entre Rios
Mensajes: 155
Antigüedad: 12 años, 11 meses
Puntos: 25
Respuesta: Fatidico suspisious pointer conversion.

por lo que estuve leyendo, el warning te lo da al trabajar con un puntero de puntero, o sea, cuando usas el dobre asterisco **Puntero......

ahora bien, como a mi no me tira el warning te voy a dar las posibles soluciones que deduje:

1

- que la funcion afegirInici reciba como parametros un puntero a LEnters, el protoripo quedaria de la siguiente manera:

int afegirInici(struct LEnters *pinici, int num);

- luego en la linea 10 del segundo codigo borrar el asterisco:

aux->seg=pinici;

2

- cambiar la linea del warning por la siguientes:

- aux->seg=(LEnter*)pinici;

esta ultima tendrias que probarla..... no sabia de que trataba el doble asterisco, asi que alguien mejor entendido de este tema te podria ayudar.

tambien mira esta pagina donde te explica porque te da el warning y las posibles soluciones.

http://c-pointer.blogspot.com/2010/0...s-pointer.html
  #7 (permalink)  
Antiguo 21/01/2012, 15:11
 
Fecha de Ingreso: agosto-2008
Mensajes: 240
Antigüedad: 16 años, 2 meses
Puntos: 6
Respuesta: Fatidico suspisious pointer conversion.

El uso del puntero a puntero es correcto. Con eso está añadiendo el nodo en la lista original, y no en una copia.

Viendo el código original, diría que tu lista sólo contiene un nodo y que cuando intentes añadir otro nodo, dejarás el anterior perdido por la memoria del ordenador.

Un saludo,
gonzo
  #8 (permalink)  
Antiguo 22/01/2012, 03:38
 
Fecha de Ingreso: septiembre-2011
Mensajes: 87
Antigüedad: 13 años, 2 meses
Puntos: 6
Respuesta: Fatidico suspisious pointer conversion.

Cita:
Iniciado por starfix Ver Mensaje
por lo que estuve leyendo, el warning te lo da al trabajar con un puntero de puntero, o sea, cuando usas el dobre asterisco **Puntero......

ahora bien, como a mi no me tira el warning te voy a dar las posibles soluciones que deduje:

1

- que la funcion afegirInici reciba como parametros un puntero a LEnters, el protoripo quedaria de la siguiente manera:

int afegirInici(struct LEnters *pinici, int num);

- luego en la linea 10 del segundo codigo borrar el asterisco:

aux->seg=pinici;

2

- cambiar la linea del warning por la siguientes:

- aux->seg=(LEnter*)pinici;

esta ultima tendrias que probarla..... no sabia de que trataba el doble asterisco, asi que alguien mejor entendido de este tema te podria ayudar.

tambien mira esta pagina donde te explica porque te da el warning y las posibles soluciones.

http://c-pointer.blogspot.com/2010/0...s-pointer.html

Estoy trabajando con un puntero a struct LEnters. Sino me pasaria como dixe gonzo13.
  #9 (permalink)  
Antiguo 22/01/2012, 03:41
 
Fecha de Ingreso: septiembre-2011
Mensajes: 87
Antigüedad: 13 años, 2 meses
Puntos: 6
Respuesta: Fatidico suspisious pointer conversion.

Código C:
Ver original
  1. struct LEnters{
  2.     int info;
  3.     struct LEnters *seg;
  4. };
  5.  
  6.  
  7. int afegirInici(struct LEnters **pinici, int num);
  8.  
  9.  
  10. int afegirInici(struct LEnters **pinici, int num){
  11.  
  12.     struct LEnters *aux;
  13.    //printf("Primer pinici apunta a %p\n", pinici);
  14.     aux=malloc(sizeof(struct LEnters));
  15.     if(aux==NULL) return 1;
  16.     aux->info=num;
  17.     aux->seg=*pinici;
  18.     *pinici=aux;
  19.  
  20.     //printf("Despres: %p\n", pinici);
  21.     //printf("%d  -  %p \n", aux->info, pinici);
  22.  
  23.    return 0;
  24. }

Arreglao, el warning era que al nodo, al atributo seg no lo tenia bien declarado al nombre de struct LEnters.
  #10 (permalink)  
Antiguo 22/01/2012, 03:57
 
Fecha de Ingreso: agosto-2008
Mensajes: 240
Antigüedad: 16 años, 2 meses
Puntos: 6
Respuesta: Fatidico suspisious pointer conversion.

La lista sigue teniendo sólo un nodo y perdiendo el resto de nodos en la memoria. Haz una comprobación "manual" (un folio y un lápiz) de tu código y verás qué ocurre con el nodo que ya tenías en la lista.

Podríamos decirte: "este es el fallo", pero intenta darte cuenta por tí mismo. Es la mejor forma de que no vuelva a ocurrirte.

Un saludo,
gonzo.

Etiquetas: funcion, pointer, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:22.