Discussion:
Problemas con punteros
(demasiado antiguo para responder)
Pepe Guay
2003-06-28 16:37:29 UTC
Permalink
El programa que estoy haciendo me revienta de forma erratica. Creo que
es por un problema de tipos con punteros. El compilador me da un
warning que dice: conversion sospechosa de punteros en estas dos
sentencias:

ultimo = ultimo->sig;
ultimo->sig = nodo;

Lo cual no entiendo porque tienen el mismo tipo. Ahi os dejo el codigo
del procedimiento:



typedef struct
{ int valor;
struct tipolista* sig;
} tipolista;



void insertar(tipolista **lista, tipolista *nodo)
{
tipolista *ultimo;

num_cola++;

if(*lista == NULL)
*lista = nodo;
else
{ ultimo = *lista;
while(ultimo->sig!=NULL)
ultimo = ultimo->sig;
ultimo->sig = nodo;
}
}
Fernando Arbeiza
2003-06-28 17:20:26 UTC
Permalink
Post by Pepe Guay
typedef struct
{ int valor;
struct tipolista* sig;
} tipolista;
void insertar(tipolista **lista, tipolista *nodo)
{
tipolista *ultimo;
Aquí está el problema. Último es un puntero a tipolista, sin embargo
ultimo->sig es un puntero a struct tipolista, dos tipos diferentes. De
hecho, ni siquiera has definido ningún tipo struct tipolista (es un tipo
incompleto, si no me equivoco). Pero tienen una solución fácil:

typedef struct tipolista {
int valor;
struct tipolista *sig;
} tipolista;
Post by Pepe Guay
while(ultimo->sig!=NULL)
ultimo = ultimo->sig;
ultimo->sig = nodo;
Ten cuidado, porque al no poner llaves y equivocarte con la indentación
te puede hacer ver un while donde no lo hay.

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Pepe Guay
2003-06-28 18:56:39 UTC
Permalink
Post by Fernando Arbeiza
Post by Pepe Guay
typedef struct
{ int valor;
struct tipolista* sig;
} tipolista;
void insertar(tipolista **lista, tipolista *nodo)
{
tipolista *ultimo;
Aquí está el problema. Último es un puntero a tipolista, sin embargo
ultimo->sig es un puntero a struct tipolista, dos tipos diferentes. De
hecho, ni siquiera has definido ningún tipo struct tipolista (es un tipo
typedef struct tipolista {
int valor;
struct tipolista *sig;
} tipolista;
Lo he hecho como dices y sigue dando el mismo problema.
Fernando Arbeiza
2003-06-28 19:21:50 UTC
Permalink
Hola:

On Sat, 28 Jun 2003 20:56:39 +0200, Pepe Guay
Post by Pepe Guay
Post by Fernando Arbeiza
Aquí está el problema. Último es un puntero a tipolista, sin embargo
ultimo->sig es un puntero a struct tipolista, dos tipos diferentes. De
hecho, ni siquiera has definido ningún tipo struct tipolista (es un tipo
typedef struct tipolista {
int valor;
struct tipolista *sig;
} tipolista;
Lo he hecho como dices y sigue dando el mismo problema.
$ gcc -W -Wall -ansi -pedantic -c -o prueba.o prueba.c
prueba.c: In function `insertar':
prueba.c:12: `num_cola' undeclared (first use in this function)
prueba.c:12: (Each undeclared identifier is reported only once
prueba.c:12: for each function it appears in.)
prueba.c:19: warning: assignment from incompatible pointer type
prueba.c:20: warning: assignment from incompatible pointer type

Elimino num_cola y cambio como te dije; y compilo:

$ gcc -W -Wall -ansi -pedantic -c -o prueba.o prueba.c

Así que deberías aislar el problema y, si no encuentras la causa,
publicar el fichero mínimo y compilable que muestre el error, porque
en ese código no lo veo.

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Loading...