Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: Adry89 en 30 Mayo 2010, 21:00 PM

Título: Ayuda con Cola en C (sencillo)
Publicado por: Adry89 en 30 Mayo 2010, 21:00 PM
Bueno, pues me da 4 o 5 errores azules de incompatibilidad de tipos sobre todo y no sé que falla, el programa es muy sencillo de 200 líneas...a ver si me podéis ayudar, estoy desesperada =(

#include <stdio.h>
#include <stdlib.h>

/*declaracion de la cola*/

typedef struct _DATOS
{
    char nombre[20];
    char apellidos[30];
    char telefono[12];
    char movil[12];
    int edad;

}DATOS;

struct nodo
{

int elemento;

struct nodo *siguiente;

};

typedef struct nodo Nodo;

typedef struct
{

Nodo *frente;

Nodo *final;

}Cola;

/*Prototipos de funciones*/

void crearcola(Cola *cola);
void insertar (Cola *cola, int x);
int borrar (Cola *cola);
int estavacia (Cola cola);

int main(void)
{

/*Declaracion de variables locales*/

Nodo *lista;
int num;
DATOS dat;

/*Algoritmo*/

lista = crearcola ();

   do
   {

   printf("--------------------------------\n\n");
   printf("Bienvenido a la agenda del movil \n\n");
   printf("elige una opcion : \n\n");
   printf("1.-Añadir. \n");
   printf("2.-Borrar.\n");
   printf("4.-Salir.\n");

   printf("Su opcion es: ");
   scanf("%d",&num);

    switch(num)
    {

        case 1 :  printf("Introduce los valores del dato");
                  dat = leer ();
                  lista = insertar (dat, lista);
        break;

        case 2 :  borrar (dat, lista);
        break;

        case 3 : 
        break;

      default : printf("Error: Introduce un numero del menu");

    }

   }while(num!=3);


   return(0);

}



/*definicion de las funciones*/

DATOS leer ( void )
{

    /*Declaracion de variables locales*/

    DATOS d;

    /*Algoritmo*/

   printf("Introduce Nombre: ");
   scanf("\n%s", d.nombre);
   printf("Introduce Apellido: ");
   scanf("\n%s",d.apellidos);
   printf("Introduce Telefono: ");
   scanf("\n%s",d.telefono);
   printf("Introduce Movil: ");
   scanf("\n%s",d.movil);
   printf("Introduce Edad: ");
   scanf("%d",&d.edad);

   return(d);
}

void CrearCola(Cola *cola)

{

cola->frente=cola->final=NULL;

}

/*funcion que inserta el dato en la parte final de la cola*/

void insert (Cola *cola, int x)

{

Nodo *nuevo;

nuevo=(Nodo*)malloc(sizeof(Nodo));

nuevo->elemento=x;

nuevo->siguiente=NULL;

if(empty(*cola))

{

cola->frente=nuevo;

}

else

cola->final->siguiente=nuevo;

cola->final=nuevo;

}

/*elimina el elemento que esta aL frente de la cola*/

int remover (Cola *cola)

{

int temp=NULL;

if(!empty(*cola))

{

Nodo *nuevo;

nuevo=cola->frente;

temp=cola->frente->elemento;

cola->frente=cola->frente->siguiente;

free(nuevo);

}

else

printf("ERROR, cola vacia, se puede eliminar\a\n");

return (temp);

}

int empty(Cola cola)

{

return (cola.frente==NULL);

}
Título: Re: Ayuda con Cola en C (sencillo)
Publicado por: nicolas_cof en 30 Mayo 2010, 21:20 PM
Algunos errores a simple vista...

lista = crearcola();
La funcion crearcola() devuelve void, por lo tanto asignarla a una variable es erroneo

default: printf("Error: Introduce un numero del menu");
Te falta poner break;

leer(void)
remover(Cola *cola)
empty(Cola cola)

Te falta definir el prototipo de estas funciones

estavacia (Cola cola);
Mmmm no hay ninguna definicion de esta funcion

void crearcola(Cola *cola); // prototipo
void CrearCola(Cola *cola) {} // definicion

No concuerdan el nombre puesto en el prototipo de la funcion con el nombre en la definicion. Acordate que C es un lenguaje case sensitive.

Salu10.
Título: Re: Ayuda con Cola en C (sencillo)
Publicado por: Adry89 en 30 Mayo 2010, 21:46 PM
Corregido todo eso los fallos azules siguen apareciendo, no tiene nada que ver con lo que has dicho =(
Título: Re: Ayuda con Cola en C (sencillo)
Publicado por: .:BlackCoder:. en 30 Mayo 2010, 21:50 PM
default no lleva break nicolas...

Saludos...
Título: Re: Ayuda con Cola en C (sencillo)
Publicado por: Littlehorse en 30 Mayo 2010, 22:38 PM
Estas llamando funciones sin pasarle parámetros cuando en los prototipos y definiciones especificas los parámetros necesarios para la correcta ejecución de dicha funcion.
Por otro lado, los errores de incompatibilidad radican en utilizar en forma errónea los tipos de datos que declaraste.

Por ejemplo, en esta función que declaraste:


void insertar (Cola *cola, int x);


La llamas así:

insertar (dat, lista);

donde dat y lista son:

DATOS dat;
Nodo *lista;


Todo esto sumado a los errores que ya mencionaron, como por ejemplo asignar el retorno de una función como dato útil cuando en el prototipo esta declarada como void.
Si solucionaste todos los errores mencionados, vuelve a postear el código.

[code=c]código[/code]

Repasa atentamente el manejo de funciones y estructuras.

Saludos!
Título: Re: Ayuda con Cola en C (sencillo)
Publicado por: nicolas_cof en 30 Mayo 2010, 22:46 PM
Cita de: Adry89Corregido todo eso los fallos azules siguen apareciendo, no tiene nada que ver con lo que has dicho =(

Mmmmm en ningun momento te asegure que corrigiendo esos errores, los "fallos azules" iban a desaparecer :P

Estaria bueno que pongas en el post esos "fallos azules" de los que hablas :¬¬

Salu10.
Título: Re: Ayuda con Cola en C (sencillo)
Publicado por: Adry89 en 30 Mayo 2010, 22:53 PM
Muchas gracias a todos por las respuestas. He corregido todo y esto es lo que falla:

hdrhdrh.c:69: error: incompatible types in assignment
hdrhdrh.c:89: error: incompatible type for argument 2 of `insertar'
hdrhdrh.c:89: error: incompatible types in assignment
hdrhdrh.c:185: error: incompatible type for argument 1 of `estavacia'
hdrhdrh.c:192: warning: assignment makes pointer from integer without a cast
hdrhdrh.c:204: error: incompatible types in return

Adjunto el código de nuevo:

#include <stdio.h>
#include <stdlib.h>
#define TAM 30
#define TRUE 1
#define FALSE 0

/*declaracion de la cola*/

typedef struct _DATOS
{
    char nombre[20];
    char apellidos[30];
    char telefono[12];
    char movil[12];
    int edad;

}DATOS;

struct nodo
{

int elemento;

struct nodo *siguiente;

};

typedef struct nodo Nodo;

typedef struct
{

Nodo *frente;

Nodo *final;

}Cola;

/*Prototipos de funciones*/

Nodo crearcola(Cola *cola);
Nodo insertar (Cola *cola, int x);
Nodo borrar (Cola *cola);
int estavacia (Cola cola);
DATOS leer ( void );

int main(void)
{

/*Declaracion de variables locales*/

Nodo *lista;
int num;
DATOS dat;
Cola *cola;

/*Algoritmo*/

lista = crearcola (cola);

   do
   {

   printf("--------------------------------\n\n");
   printf("Bienvenido a la agenda del movil \n\n");
   printf("elige una opcion : \n\n");
   printf("1.-Añadir. \n");
   printf("2.-Borrar.\n");
   printf("4.-Salir.\n");

   printf("Su opcion es: ");
   scanf("%d",&num);

    switch(num)
    {

        case 1 :  printf("Introduce los valores del dato");
                  dat = leer ();
                  lista = insertar (cola,dat);
        break;

        case 2 :  borrar (cola);
        break;

        case 3 :
        break;

      default : printf("Error: Introduce un numero del menu");

    }

   }while(num!=3);


   return(0);

}



/*definicion de las funciones*/

DATOS leer ( void )
{

    /*Declaracion de variables locales*/

    DATOS d;

    /*Algoritmo*/

   printf("Introduce Nombre: ");
   scanf("\n%s", d.nombre);
   printf("Introduce Apellido: ");
   scanf("\n%s",d.apellidos);
   printf("Introduce Telefono: ");
   scanf("\n%s",d.telefono);
   printf("Introduce Movil: ");
   scanf("\n%s",d.movil);
   printf("Introduce Edad: ");
   scanf("%d",&d.edad);

   return(d);
}

Nodo crearcola(Cola *cola)

{

cola->frente=cola->final=NULL;

}

/*funcion que inserta el dato en la parte final de la cola*/

Nodo insertar (Cola *cola, int x)

{

Nodo *nuevo;

nuevo=(Nodo*)malloc(sizeof(Nodo));

nuevo->elemento=x;

nuevo->siguiente=NULL;

if(estavacia(*cola))

{

cola->frente=nuevo;

}

else

cola->final->siguiente=nuevo;

cola->final=nuevo;

}

/*elimina el elemento que esta aL frente de la cola*/

Nodo borrar (Cola *cola)

{

Nodo *temp;
Nodo *nuevo;

temp = NULL;

if(!estavacia(cola))

{


nuevo=cola->frente;

temp=cola->frente->elemento;

cola->frente=cola->frente->siguiente;

free(nuevo);

}

else

printf("ERROR, cola vacia, se puede eliminar\a\n");

return (temp);

}

int estavacia (Cola cola)

{
    int resp;

    if (cola.frente == NULL)
    {
        resp = TRUE;
    }
    else
    {
        resp = FALSE;
    }

    return (resp);

}

Título: Re: Ayuda con Cola en C (sencillo)
Publicado por: nicolas_cof en 30 Mayo 2010, 23:14 PM
Seguis teniendo el error que te explico Littlehorse

Salu10.
Título: Re: Ayuda con Cola en C (sencillo)
Publicado por: Littlehorse en 30 Mayo 2010, 23:21 PM
El código mantiene errores similares al código inicial. Presta atención a los mensajes de error:

Citar69: incompatible types in assignment

lista = crearcola (cola);

Que es lista? que devuelve crearcola?

el prototipo que declaraste es:

Nodo crearcola(Cola *cola);

Como veras, si lo analizas minuciosamente te darás cuenta que estas cometiendo un error. (204: error: incompatible types in return)

Si vas a devolver una referencia, la función debe ser similar a:

Nodo* crearcola(Cola *cola)

O bien puedes hacer algo como:

typedef struct nodo* Nodo;

pero por supuesto si haces esto ultimo tienes que tener cuidado cuando declaras un puntero a nodo en las funciones (ya que no necesitas el asterisco)

Como recomendación déjame decirte que vas a tardar menos repasando punteros, estructuras y funciones, que arreglando el código. Repasa y replantea el ejercicio y veras que es mas fácil de lo que parece.
Título: Re: Ayuda con Cola en C (sencillo)
Publicado por: Adry89 en 30 Mayo 2010, 23:27 PM
Pues me quedan estos 5 fallos :

hdrhdrh.c:59: error: incompatible types in assignment
hdrhdrh.c:79: error: incompatible types in assignment
hdrhdrh.c:175: error: incompatible type for argument 1 of `estavacia'
hdrhdrh.c:182: error: incompatible types in assignment
hdrhdrh.c:194: error: incompatible types in return

Littlehorse, la verdad es que soy bastante novata y no entiendo bien lo que has dicho, sería mucho pedir si me poesn lo que queda de código como le harías tu? Gracias.

#include <stdio.h>
#include <stdlib.h>
#define TAM 30
#define TRUE 1
#define FALSE 0

/*declaracion de la cola*/

typedef struct _DATOS
{
    char nombre[20];
    char apellidos[30];
    char telefono[12];
    char movil[12];
    int edad;

}DATOS;

struct nodo
{

DATOS elemento;

struct nodo *siguiente;

};

typedef struct nodo Nodo;

typedef struct
{

Nodo *frente;

Nodo *final;

}Cola;

/*Prototipos de funciones*/

Nodo crearcola(Cola *cola);
Nodo insertar (Cola *cola, DATOS x);
Nodo borrar (Cola *cola);
int estavacia (Cola cola);
DATOS leer ( void );

int main(void)
{

/*Declaracion de variables locales*/

Nodo *lista;
int num;
DATOS dat;
Cola *cola;

/*Algoritmo*/

lista = crearcola (cola);

   do
   {

   printf("--------------------------------\n\n");
   printf("Bienvenido a la agenda del movil \n\n");
   printf("elige una opcion : \n\n");
   printf("1.-Añadir. \n");
   printf("2.-Borrar.\n");
   printf("4.-Salir.\n");

   printf("Su opcion es: ");
   scanf("%d",&num);

    switch(num)
    {

        case 1 :  printf("Introduce los valores del dato");
                  dat = leer ();
                  lista = insertar (cola,dat);
        break;

        case 2 :  borrar (cola);
        break;

        case 3 :
        break;

      default : printf("Error: Introduce un numero del menu");

    }

   }while(num!=3);


   return(0);

}



/*definicion de las funciones*/

DATOS leer ( void )
{

    /*Declaracion de variables locales*/

    DATOS d;

    /*Algoritmo*/

   printf("Introduce Nombre: ");
   scanf("\n%s", d.nombre);
   printf("Introduce Apellido: ");
   scanf("\n%s",d.apellidos);
   printf("Introduce Telefono: ");
   scanf("\n%s",d.telefono);
   printf("Introduce Movil: ");
   scanf("\n%s",d.movil);
   printf("Introduce Edad: ");
   scanf("%d",&d.edad);

   return(d);
}

Nodo crearcola(Cola *cola)

{

cola->frente=cola->final=NULL;

}

/*funcion que inserta el dato en la parte final de la cola*/

Nodo insertar (Cola *cola, DATOS x)

{

Nodo *nuevo;

nuevo=(Nodo*)malloc(sizeof(Nodo));

nuevo->elemento=x;

nuevo->siguiente=NULL;

if(estavacia(*cola))

{

cola->frente=nuevo;

}

else

cola->final->siguiente=nuevo;

cola->final=nuevo;

}

/*elimina el elemento que esta aL frente de la cola*/

Nodo borrar (Cola *cola)

{

Nodo *temp;
Nodo *nuevo;

temp = NULL;

if(!estavacia(cola))

{


nuevo=cola->frente;

temp=cola->frente->elemento;

cola->frente=cola->frente->siguiente;

free(nuevo);

}

else

printf("ERROR, cola vacia, se puede eliminar\a\n");

return (temp);

}

int estavacia (Cola cola)

{
    int resp;

    if (cola.frente == NULL)
    {
        resp = TRUE;
    }
    else
    {
        resp = FALSE;
    }

    return (resp);

}
Título: Re: Ayuda con Cola en C (sencillo)
Publicado por: Littlehorse en 30 Mayo 2010, 23:40 PM
Prefiero que lo arregles vos misma, vas a aprender mas de esa manera. Creo yo que con lo que se te ha dicho en este post puedes sentarte y analizar tu código en pos de solucionar los errores. Créeme que no te ayudo en nada si te doy el código listo para compilar.

Tomate el tiempo para repasar los temas que te mencione antes y luego vuelve a analizar el código. Gran parte de los errores son por incompatibilidad de tipos y valores de retorno incorrectos, por lo tanto no deberían ser difíciles de solucionar luego que estudies los conceptos básicos relacionados.

A grandes rasgos necesitas repasar 3 cosas:


Saludos