PDA

Ver la versión completa : Problema con variables globales



Puck2099
04/09/2005, 12:21
Hola,

Me gustaría usar una variable global y compartirla entre los distintos ficheros .c de mi juego, así que, mirando mi manual de programación, he hecho lo siguiente:

En el módulo gpmain.c he declarado un extern int lang que luego he vuelto a declarar dentro de su función correspondiente como int lang = 1;

En el módulo auxiliar.c vuelvo a declararla como global y externa con extern int lang y luego la uso directamente dentro de una función: lang = 3;

Pues bien, el gcc me da un error de undefined reference to 'lang' cuando hago uso de la variable en el módulo auxiliar.c

¿Alguna idea de qué está mal o cómo hacer esto?

Gracias :)

Wave
04/09/2005, 12:22
Creo que en gpmain.c no deberia ser externa.

Puck2099
04/09/2005, 12:26
Creo que en gpmain.c no deberia ser externa.

Pero es que es ahí donde la defino e inicializo. Por otro lado, he editado el texto anterior, donde me da el error del gcc es cuando uso la variable en el módulo auxiliar.c

Gracias

anibarro
04/09/2005, 12:31
Puck, la variable lang, declarala normalmente en el modulo gpmain.c por ejemplo, es decir, pones "int lang" al principio de todo, como una variable globall cualquiera.
Luego, en cada uno de los .c que quieras usarla, la declaras donde la necesites como "extern int lang". Con esto indicas al compilador que la variable "lang" no es nueva, y el ya averiguara donde está en la fase de enlazado ;)

De todas formas ¿no seria mejor incluir la variable como un parámetro que se pasa en las funciones que lo necesiten?

Aiken
04/09/2005, 12:32
en gpmain.c declarara como
int lang; (solo al principio, dentro de las funciones nada, solo usarla)

en los demas como
extern int lang; (pero al principio de los archivos solo, dentro de las funciones no, solo usala)


posiblemente sea mas etico declararla tambien (o solo ahi) como extern dentro de las funciones pero creo recordar que no es obligatorio ;)

Aiken :brindis:

anibarro
04/09/2005, 12:34
Aiken pero no haria falta declarar "extern int lang" al principio de los ficheros si no lo necesita mas q en una funcion por ejemplo, con que la declare dentro de esa funcion ya vale ;P

Aiken
04/09/2005, 12:35
Aiken pero no haria falta declarar "extern int lang" al principio de los ficheros si no lo necesita mas q en una funcion por ejemplo, con que la declare dentro de esa funcion ya vale ;P

tienes razon, lo he editado ;)

En todo caso su problema es en gpmain.c ;)

Aiken

Puck2099
04/09/2005, 12:55
Vale, ya me funciona como me habéis dicho :)

anibarro, hasta ahora pasaba todas las variables como parámetros, pero es un coñazo porque se juntan algunas funciones con 10 o 20 parámetros (la mayoría opciones de configuración) y luego, cada vez que necesito acceder a una variable nueva, tengo que ponerme a editar las cabeceras, las llamadas a función...

Así me resulta más sencillo en algunos casos :)

Muchas gracias a todos

billyberjas
04/09/2005, 13:00
pasa una estructura en lugar de variables.

Saludos

Aiken
04/09/2005, 13:36
pasa una estructura en lugar de variables.

Saludos


cierto, create una estructura myconf o algo asi

si tienes que añadir opciones lo añades a la definicion de la estructura y punto ;)

la estructura asi a priori parece mejor opcion que las 20 variables globales, aunque yo tengo cosas como globales, no me fio mucho de las globales, a mi habia una cosa que me daba problema porque tenia arrays enteros como globales, parece ser que la pila de las variables globales no es infinita :D

Aiken

oankali
05/09/2005, 08:40
Yo utilizo una estructura global para mis opciones, y también tengo algunas variables globales para otras tareas.
A parte de tener todas las opciones bien localizadas, con la estructura se te simplifican las tareas de escritura y lectura de las opciones en la SMC.

Oankali.

Nota: Enhorabuena por este primer puesto compartido en el concurso de remakes :brindis: