User Tag List

Resultados 1 al 7 de 7

Tema: Estructuras y punteros en C

  1. #1

    Fecha de ingreso
    Jan 2008
    Ubicación
    Sevilla
    Mensajes
    447
    Mencionado
    5 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    106
    Agradecer Thanks Received 
    74
    Thanked in
    Agradecido 23 veces en [ARG:2 UNDEFINED] posts

    Question Estructuras y punteros en C

    Hola a todos, estoy intentando programar en C después de mucho tiempo, y parece ser que lo tengo un poco oxidado porque nada más empezar he tenido este error que no sé de donde viene.

    Tengo el siguiente código
    Código:
    typedef struct {
    	int TYPE;
    	int x, y, w, h;
    } MG_Component;
    
    MG_Component* createComponent(int type) {
    	MG_Component* c = NULL;
    	switch(type) {
    		case TYPE_PANEL: c = createPanel();  // LINEA 26
    	}
    	return c;
    }
    
    MG_Component* createPanel() {  // LINEA 31
    	MG_Component* panel = (MG_Component*) malloc( sizeof(MG_Component) );
    	panel->TYPE = TYPE_PANEL;
    	panel->x = 0;
    	panel->y = 0;
    	panel->w = 0;
    	panel->h = 0;
    
    	return panel;
    }
    Y cuando intento compilar con el GCC me da los siguientes errores.
    Código:
    MicroGadgets.c:31: error: tipos en conflicto para ‘createPanel’
    MicroGadgets.c:26: error: la declaración implícita previa de ‘createPanel’ estaba aquí
    A ver si alguien puede ayudarme.
    Nota: he marcado las lineas reales donde da los errores porque he ahorrado código fuente al escribir.

  2. #2

    Fecha de ingreso
    Aug 2004
    Ubicación
    Madrid, Spain
    Mensajes
    353
    Mencionado
    0 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    0
    Thanked in
    Agradecido 0 veces en [ARG:2 UNDEFINED] posts
    En el momento en que llamas a createPanel(), aún no se ha declarado la función. En C++ daría un error, pero C simplemente asume que devuelve int y sigue. Cuando se llega a la línea 31, la función se declara, y el valor de retorno no corresponde con el que se había asumido, con lo que da error.

  3. #3

    Fecha de ingreso
    Nov 2003
    Ubicación
    Elche (Alicante)
    Mensajes
    1,275
    Mencionado
    0 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    0
    Thanked in
    Agradecido 0 veces en [ARG:2 UNDEFINED] posts
    Tienes lo que se llama referencia cruzada, las funciones preedeclaralas antes.

    ]

  4. #4

    Fecha de ingreso
    Mar 2007
    Ubicación
    Barna
    Mensajes
    10,341
    Mencionado
    93 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    368
    Agradecer Thanks Received 
    1,791
    Thanked in
    Agradecido 944 veces en [ARG:2 UNDEFINED] posts
    Vamos, que añadas esta línea al principio del archivo MicroGadgets.c, o en el archivo MicroGadgets.h si lo tienes

    Código:
    MG_Component* createPanel();
    Otra posibilidad es que cambies el orden de las funciones y definas createPanel() antes que createComponent()

    En cualquier caso, recuerda que en C siempre tienes que declarar antes que usar, funciones incluidas.
    Última edición por juanvvc; 07/01/2010 a las 21:12

  5. #5

    Fecha de ingreso
    Jan 2008
    Ubicación
    Sevilla
    Mensajes
    447
    Mencionado
    5 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    106
    Agradecer Thanks Received 
    74
    Thanked in
    Agradecido 23 veces en [ARG:2 UNDEFINED] posts

    Thumbs up

    Muchas gracias a todos.

    Me ha parecido muy interesante la explicacioń de Jedive
    En el momento en que llamas a createPanel(), aún no se ha declarado la función. En C++ daría un error, pero C simplemente asume que devuelve int y sigue. Cuando se llega a la línea 31, la función se declara, y el valor de retorno no corresponde con el que se había asumido, con lo que da error.
    Gracias de nuevo.
    Última edición por turco; 07/01/2010 a las 21:47

  6. #6

    Fecha de ingreso
    Mar 2007
    Ubicación
    Barna
    Mensajes
    10,341
    Mencionado
    93 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    368
    Agradecer Thanks Received 
    1,791
    Thanked in
    Agradecido 944 veces en [ARG:2 UNDEFINED] posts
    Si usas GCC y quieres que no asuma int en las funciones no declaradas (y además te dé errores más informativos por si te vuelve a pasar) utiliza las opciones "-Werror -Wmissing-declarations".

    Pero aún mejor es que utilices "-Werror -Wall", no te dejará pasar ni una, te obliga a escribirlo todo perfectamente y corregirás muchos errores en tiempo de ejecución que ni sabías que estaban ahí.
    Última edición por juanvvc; 07/01/2010 a las 22:20

  7. #7

    Fecha de ingreso
    Jan 2008
    Ubicación
    Sevilla
    Mensajes
    447
    Mencionado
    5 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    106
    Agradecer Thanks Received 
    74
    Thanked in
    Agradecido 23 veces en [ARG:2 UNDEFINED] posts
    Acabo de guardar estos apuntes en mi Bloc de Notas

Etiquetas para este tema

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •