Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas Con Variables Globales

Iniciado por shephiroth, 13 de Octubre de 2004, 11:19:10 PM

« anterior - próximo »

shephiroth

 Buenas.

Me imagino que la pregunta q voy a hacer os parecerá un poco chorra, pero nunca me hicieron falta hasta y me salio la duda.

Tengo problemas con este tipo de variables, pues son globales solo en el mismo archivo.

QUOTE ("programa.cpp")

int variableglobal;

void main()
{
....
}
[/quote]

QUOTE ("diseño.cpp")


void hacerloquesea()
{
variableglobal=1;
}
[/quote]

Al compilar me dice que en diseño.cpp la "variableglobal" no esta declarada.

Alguien me puede explicar que estoy haciendo mal?? (VC++.net 2002)

GRACIAS.

DraKKaR

 Añade la siguiente línea al principio del fichero "diseño.cpp":

extern int variableglobal;

y listo.

shephiroth

 Muy buenas.

Menuda rapidez xDD

Lo primero gracias, ahora funciona sin problemas. Pero, podría preguntar porque pasa eso?? oy a tenerlo que hacer en todos los archivos y/o variables q necesite??? pasaría lo mismo con las funciones???

GRACIAS ^^

DraKKaR

 Cuando decloaras una variable global en un *.cpp, ésta sólo se puede ver desde dentro de él, en principio.

La clausula extern que has añadido al fichero diseño.cpp le indica que existe (o debería) una declaración de esa variable en otro fichero. El compilador se lo cree por el momento y lo comprobará más tarde, en el proceso de linkado.

De hecho, si usas extern para indicar que la variable está declarada en otro fichero, y no es así, dará un error de linkado.

Espero haberme explicado bien.

shephiroth

 Buenas.

Creo que si que lo entendí......el problema esta en el cpp.....entonces lo que deberia hacer sería crear un programa.h en el q declarase las variables globales??? (ademas de declarar ahi los prototipos y mantener la misma estructura en todos los ficheros .cpp y .h)

MUCHISIMAS GRACIAS ^^

DraKKaR

Cita de: "shephiroth"Buenas.

Creo que si que lo entendí......el problema esta en el cpp.....entonces lo que deberia hacer sería crear un programa.h en el q declarase las variables globales??? (ademas de declarar ahi los prototipos y mantener la misma estructura en todos los ficheros .cpp y .h)

MUCHISIMAS GRACIAS ^^
Ummm.. no es buena idea declarar las variables en un fichero de cabecera (*.h). Para que lo entiendas bien:

- Declaras en el fichero "cabecera.h" la variable:
int global;
- Desde los 2 ficheros *.cpp incluyes el fichero de cabecera:
#include "cabecera.h"
- Entonces al linkar te dará un error diciendote que la variable "int global" está declarada en los 2 cpp.

Lo que tendrías ke hacer es no usar variables globales si estás usando C++. No son un buen ejemplo de un código bien diseñado. Si de todos modos las necesitas, declaralas en un *.cpp. Y en el fichero de cabecera las haces visibles a los otros *.cpp por medio de un extern:
extern int global;

Así, todos los *.cpp que incluyan el fichero de cabecera, tendrán declarada correctamente la variable global.

Las funciones son un poco diferentes. A grandes rasgos, para que no te dé problemas. deberías declarar las funciones en los ficheros de cabecera, e imlpementarlas en los ficheros *.cpp.

Pogacha

 A ver si te sirve el ejemplo:

NumeroAleatoreo.h

#ifndef __NUMERO_ALEATOREO_H__  // esto sirve para que el archivo solo sea incluido una soloa vez
#define __NUMERO_ALEATOREO_H__

extern int Semilla;

void Set_Semilla(int semilla);
int Get_Numero_Aleatoreo(void);

#endif


NumeroAleatoreo.cpp:


#include "NumeroAleatoreo.h"  
// en este caso no es necesario incluirlo, pero habrá veces que si lo sera,
// en esos casos no debes preocuparte por el extern int Semilla (por ejemplo),
// el compilador se dara cuenta y usara esta que esta aquí.

int Semilla=0;

void Set_Semilla(int semilla)
{
  Semilla=semilla;
}

int Get_Numero_Aleatoreo(void)
{
 int x=Semilla;
 Semilla+=0x12345678;
 Semilla*=0x23456789;
 return (Semilla%0x34567890);
}

#endif


main.cpp:

#include "numeroaleatoreo.cpp"

int main()
{
  Set_Semilla(10);  // pone 10 en semilla
  Semilla = 100;    // accede directamente a semilla
  int x=Get_Numero_Aleatoreo();
  printf("%d\n", x);
}

shephiroth

 Muy buenas.

Como siempre muchas gracias, ahora me quedo todo perfectamente aclarado.


Lo que tendrías ke hacer es no usar variables globales si estás usando C++.


Normalmente como comente no he necesitado tratar con variables globales, pero este es un caso especial. Estoy empezando con directx, y en los ejemplos que me estoy bajando utilizan el Device creado como variable global. Yo estoy trasteando el codigo y empezando a separarlo en archivos (sino es un caos) y me empezo a dar problemas.


Las funciones son un poco diferentes. A grandes rasgos, para que no te dé problemas. deberías declarar las funciones en los ficheros de cabecera, e imlpementarlas en los ficheros *.cpp.


No se si serán cosas de costumbre o no, pero en archivo principal de mis trabajos los suelo hacer en un .cpp sin cabecera, en el que primero declaro variables globales, luego funciones de prototipos, luego incluyo demas archivos que necesito, y luego implemento las funciones principales. El resto de archivos incluidos se podría decir que ya intento seguir "el standar" que he visto por internet (.h para prototipos y documentacion, .cpp para implementacion). La verdad ahora si descanso de un proyecto por una semana a la hora de retomarlo lo veo mas claro (antes todo en .cpp´s y sin documentacion  (nooo) ).

Decir queda q esas variable solo las utilizaba en el propio archivo.

Pogacha gracias por el ejemplo  (ole)

GRACIAS ^^

Pogacha

 Ahora que me doy cuenta en main.cpp puse
#include "numeroaleatoreo.cpp"
en vez de
#include "numeroaleatoreo.h"
espero no haber causado problemas con esto  :( .

Saludos

shephiroth

Cita de: "Pogacha"espero no haber causado problemas con esto  :( .

Saludos
Buenas.

No te preocupes, la verdad que nunca he sabido muy bien cual de las dos es la correcta, aunque en ambas compila correctamente. Mientras en el cpp se incluya el .h y en el principal se incluya alguno todo compila.


Pogacha

 Tienes razón. No justifica pero "aleatoreo" esta muy difundida también.
 

Abc7

 ey pero no se t ocurra poner
extern int variable = 0;

xq.. adivina?? error!

salu2






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.