PDA

Ver la versión completa : [Programación] Fichero de cabecera



turco
08/09/2008, 01:08
Hola a todos. Ahora que llega el invierno estoy retomando un poco la programación con SDL. Quiero hacer un pequeño menú de opciones típico de los juegos, pero resulta que no puedo compilar un fichero bastante simple y no sé por qué [Ahhh].

Tengo un archivo de cabecera menu.h con lo siguiente


#ifndef _MENU_H
#define _MENU_H

#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>

typedef struct Menu {
char *title;
char *entries;
} Menu;

int muestraMenu(Menu menu, TTF_Font fuente, SDL_Surface* surface);

#endif
Luego en menu.c tengo



#ifndef _MENU_C
#define _MENU_C

#include "menu.h"
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>

int muestraMenu(Menu menu, TTF_Font* fuente, SDL_Surface* surface) {
SDL_Surface *textoRenderizado;
SDL_Color color;

color.r = 25;
color.g = 150;
color.b = 180;

textoRenderizado = TTF_RenderText_Blended(fuente, menu.entries[0], color);

SDL_BlitSurface(textoRenderizado, NULL, surface, NULL);

return 0;
}

#endif
Cuando intento obtener el fichero objeto con gcc -c menu.c obtengo los siguientes errorres:
menu.c:15: error: tipos en conflicto para ‘muestraMenu’
menu.h:14: error: la declaración previa de ‘muestraMenu’ estaba aquí

La linea en las que da el primer error es la de comienzo de la definicion de la función muestraMenu, es decir, la linea donde va el nombre y los parámetros.

Bueno pues a ver si alguien puede ayudarme y explicarme porqué da este error. A lo mejor es una cosa tonta pero la verdad es que no veo lo que estoy haciendo mal.

Saludos.

Puck2099
08/09/2008, 01:17
Te falta un * en el h.

int muestraMenu(Menu menu, TTF_Font fuente, SDL_Surface* surface);

int muestraMenu(Menu menu, TTF_Font* fuente, SDL_Surface* surface) {

chipan
08/09/2008, 01:26
Te falta un * en el h.

int muestraMenu(Menu menu, TTF_Font fuente, SDL_Surface* surface);

int muestraMenu(Menu menu, TTF_Font* fuente, SDL_Surface* surface) {
Ahora lo afirmo... el que inventó los punteros odiaba a la humanidad.

Puck2099
08/09/2008, 01:32
Ahora lo afirmo... el que inventó los punteros odiaba a la humanidad.

Qué va, los punteros es la cosa más bonita (y útil) que hay en la programación :)

chipan
08/09/2008, 01:35
y poco intuitiva, y antididáctica, y tocapel**as...

Puck2099
08/09/2008, 01:38
y poco intuitiva, y antididáctica, y tocapel**as...

¡Qué va! puede llevar a problemas, pero es bastante intuitiva si sabes bien qué son y para qué se usan.

En cuanto a antididáctica... puede ser, pero los punteros no se inventaron para enseñar :p

Como diría Voltaire, si no existieran los punteros habría que inventarlos :angel1:

titerote
08/09/2008, 01:39
Y por si aún te interesa solucionar el error, en el typedef estás repitiendo el nombre. Pon por ejemplo typedef struct _Menu {...} Menu; o simplemente typedef struct { .... } Menu;

turco
08/09/2008, 01:50
Gracias Puck. Es verdad que me faltaba el *. Pero me sigue dando el mismo error. Seguramente el asterisco antes si estaba lo que pasa que me hartado de cambiar cosillas aquí y allí a ver si lo hacia funcionar y se me habrá quedado eso atrás.

Otra de las cosas que he probado ha sido lo del typedef, titerote, pero sigue sin funcionar. Sigue dando exactamente el mismo error.


Ahora lo afirmo... el que inventó los punteros odiaba a la humanidad. Pues a mi me gustan :D

:loco:

Puck2099
08/09/2008, 01:54
Mmmm, prueba a limpiar los .o y recompilar, porque el resto parece que está todo bien...

Eso sí, yo quitaría los includes y las directivas #ifndef _MENU_C, #define _MENU_C, #endif del .c, no creo que sean necesarias para nada.

turco
08/09/2008, 02:03
Ya compila [wei5]!!

He borrado un menu.o anterior y ya compila.

Gracias por la recomendación Puck2099 ;)

hardyx
08/09/2008, 02:26
Como dice Puck, las directivas que has puesto de _MENU_C no tienen sentido en el menu.c, y se usan sólo en los fichero .H para no incluirlos varias veces.

Yo definiría la función muestraMenú de esta manera:

int muestraMenu(Menu &menu, TTF_Font *fuente, SDL_Surface* surface);
De esta manera pasas la estructura por referencia, en vez de por valor que haría una copia. O si te gusta más como puntero: "const Menu *menu".

turco
08/09/2008, 02:42
Gracias hardyx.
Es otra recomendación que tendré en cuenta. La verdad es que el error al final no sé por lo que me ha dado y me lo he vuelto a encontrar y he hecho lo de antes pero ahora no funciona [Ahhh]

hardyx
08/09/2008, 03:13
Revisa que tengas la declaración y la implementación idénticas. Borra todos los ficheros de salida, y vuelve a compilar. Mira a ver si te has dejado abierto un #ifndef ... #endif

turco
08/09/2008, 10:05
Bueno pues compilé el mismo fichero con g++ en vez de con gcc y funcionó. Supongo que será algún problema con archivos temporales o algo así.

La cuestión es que ya está solucionado. Gracias a todos.

hardyx
08/09/2008, 11:49
Lo que te he puesto de la referencia "Menu &menu" es para C++, por eso si lo has usado sólo te va a funcionar con el g++. Suerte en tu proyecto.

swapd0
08/09/2008, 15:37
Un consejo, los #ifndef FICHERO_H #define ... solo se ponen en los fichero de cebeceras

turco
09/09/2008, 00:20
Tengo otra duda. A lo mejor lo debería haber puesto en otro hilo, pero no sé, supongo que se puede aprocechar este.

La estructura Menu contiene un puntero a un vector de cadenas de caracteres...

typedef struct Menu {
char *title;
char **entries;
int selected;
} Menu;donde almacenaré las cadenas de las opciones del menú.
Tengo creada un función para pintar los menús sin saber a priori el número de elementos que tiene ese vector. La cuestión es, ¿cómo puedo saber cuantos elementos contiene el vector?:loco:. En principio me gustaría hacerlo sin pasarlo en ninguna variable, quiero decir, me gustaría obtenerlo si es posible de forma dinámica.

En el caso de que no se pueda hacer esto, seguramente haga una lista de entradas, pero no sé hasta que punto sería "correcto" hacer esto porque cada nodo de la lista sólo tendría en principio una cadena de texto que posiblemente no cambie durante toda la ejecución del programa.

Saludos y si es necesario, moveré este post a otro hilo ya que realmente no tiene mucho que ver con el título.

Theck
09/09/2008, 13:11
Siempre puedes usar el objeto "Vector" que es un array dinámico ;)

titerote
09/09/2008, 13:59
Siempre puedes usar el objeto "Vector" que es un array dinámico ;)

O puedes hacer que la última cadena de ese array sea un valor especial en plan "FIN", o un NULL directamente.

turco
09/09/2008, 16:40
Ok. Gracias. Al final guardaré el número de elementos en una variable entera dentro de la estructura. La verdad no es lo que más me gusta porque ya me supone "una limitación" en cuanto a que debo saber el número de elementos de antemano, aunque seguro que me facilitará más de una operación.

Lo del objeto Vector no porque quiero trabajar en C, y supongo que eso será C++.

Puck2099
09/09/2008, 17:07
Ok. Gracias. Al final guardaré el número de elementos en una variable entera dentro de la estructura. La verdad no es lo que más me gusta porque ya me supone "una limitación" en cuanto a que debo saber el número de elementos de antemano, aunque seguro que me facilitará más de una operación.

¿Y por qué no usas una lista enlazada?

Drumpi
09/09/2008, 17:28
En fenix, en algun caso, usábamos el primer valor de la cadena para decir la cantidad de valores que tiene dicho array, aunque claro, si es de tipo char a lo mejor hay algun conflicto ¿o no?