PDA

Ver la versión completa : [Ayuda] Estructuras y punteros en C



turco
07/01/2010, 19:03
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


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.


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.

Jedive
07/01/2010, 19:21
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.

Topochan
07/01/2010, 19:36
Tienes lo que se llama referencia cruzada, las funciones preedeclaralas antes.

juanvvc
07/01/2010, 20:08
Vamos, que añadas esta línea al principio del archivo MicroGadgets.c, o en el archivo MicroGadgets.h si lo tienes :)


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.

turco
07/01/2010, 20:39
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.

juanvvc
07/01/2010, 21:17
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í.

turco
07/01/2010, 21:32
Acabo de guardar estos apuntes en mi Bloc de Notas [candado]