Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: shephiroth en 13 de Octubre de 2004, 11:19:10 PM

Título: Problemas Con Variables Globales
Publicado por: shephiroth en 13 de Octubre de 2004, 11:19:10 PM
 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.
Título: Problemas Con Variables Globales
Publicado por: DraKKaR en 13 de Octubre de 2004, 11:23:36 PM
 Añade la siguiente línea al principio del fichero "diseño.cpp":

extern int variableglobal;

y listo.
Título: Problemas Con Variables Globales
Publicado por: shephiroth en 13 de Octubre de 2004, 11:26:46 PM
 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 ^^
Título: Problemas Con Variables Globales
Publicado por: DraKKaR en 13 de Octubre de 2004, 11:36:31 PM
 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.
Título: Problemas Con Variables Globales
Publicado por: shephiroth en 13 de Octubre de 2004, 11:47:29 PM
 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 ^^
Título: Problemas Con Variables Globales
Publicado por: DraKKaR en 14 de Octubre de 2004, 12:14:11 AM
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.
Título: Problemas Con Variables Globales
Publicado por: Pogacha en 14 de Octubre de 2004, 01:01:08 AM
 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);
}
Título: Problemas Con Variables Globales
Publicado por: shephiroth en 14 de Octubre de 2004, 10:15:39 AM
 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 ^^
Título: Problemas Con Variables Globales
Publicado por: Pogacha en 14 de Octubre de 2004, 03:09:25 PM
 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
Título: Problemas Con Variables Globales
Publicado por: shephiroth en 14 de Octubre de 2004, 04:41:03 PM
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.
Título: Problemas Con Variables Globales
Publicado por: Mars Attacks en 15 de Octubre de 2004, 01:15:05 AM
 http://buscon.rae.es/draeI/SrvltGUIBusUsua...&LEMA=aleatorio
Título: Problemas Con Variables Globales
Publicado por: Pogacha en 15 de Octubre de 2004, 01:20:02 AM
 Tienes razón. No justifica pero "aleatoreo" esta muy difundida también.
 
Título: Problemas Con Variables Globales
Publicado por: Abc7 en 15 de Octubre de 2004, 05:03:31 AM
 ey pero no se t ocurra poner
extern int variable = 0;

xq.. adivina?? error!

salu2