• Jueves 14 de Noviembre de 2024, 17:03

Autor Tema:  Variable Global  (Leído 2253 veces)

JaMFRY

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Variable Global
« en: Sábado 23 de Diciembre de 2006, 00:32 »
0
Estoy implementando una clase en C++, y dispongo del archivo.hpp de dicha clase, en el cual declaro las funciones, la estructura y una Variable Global (int M).
Despues en el archivo .cpp implento las funciones, y mi problema viene cuando en el constructor de la clase le doy valor a la variable global M, por ejemplo M=5;
hasta aqui todo correcto, pero cuando sale del constructor y llama a otra funcion, el valor de la M se me pierde y por defecto se vuelve a M=0. Y no entiendo porque sucede esto si al ser global tendria que mantener el valor de M=5.

Si me podeis hechar una mano del montivo por que me sucede esto, estaria muy agradecido.
Por si sirve de algo lo estoy haciendo en Linux en g++ v.4


Un Saludo.

bleglaiger

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Variable Global
« Respuesta #1 en: Sábado 23 de Diciembre de 2006, 00:37 »
0
puedes poner el codigo aca para estudiarlo seria bueno para poderte ayudar :D

*********THE KING IS COMING***********
IMG]http://http://yakisova-web.hp.infoseek.co.jp/blade3.jpg[/IMG]
****THE KING IS COMING****

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Variable Global
« Respuesta #2 en: Sábado 23 de Diciembre de 2006, 10:14 »
0
Seguramente le estes asignando ese valor a una variable local ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JaMFRY

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Variable Global
« Respuesta #3 en: Sábado 23 de Diciembre de 2006, 12:44 »
0
Mi codigo en el citas.cpp:
Código: Text
  1. citas::citas()
  2. {
  3.   M = 1001;
  4.   quants = 0;
  5.   taula = new node*[M];
  6.   for(int i=0; i<M; i++)
  7.   {
  8.     taula[i] = NULL;
  9.   }
  10. }
  11.  
  12. y mi codigo en el citas.hpp:
  13.  
  14. int M;
  15. int quants;
  16. struct node{
  17.   string Key;
  18.   string Valor;
  19.   node* seg;
  20. };
  21. node** taula;
  22.  

alguna idea???

bleglaiger

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Variable Global
« Respuesta #4 en: Sábado 23 de Diciembre de 2006, 16:11 »
0
Citar
JaMFRY

que te parece si delcaras tu variable gloval M solo en la clase citas y no el el codigo de php, osea quitale del codigo de php siq ueires que el valor no se peurda peus ii te das cuenta en el oro codigo tu variable M no tien ningun valor asiq ue pro defecto te loe sta toamndo por M=0;
bueno creoq eue se es tu problema si no lo es que aml toy proque no lo ude ahcer pero epseroq uet e sirva jeje
************THE KING IS COMING**********
IMG]http://http://yakisova-web.hp.infoseek.co.jp/blade3.jpg[/IMG]
****THE KING IS COMING****

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Variable Global
« Respuesta #5 en: Sábado 23 de Diciembre de 2006, 16:32 »
0
Para variables globales usa extern, prueba así:

citas.h
Código: Text
  1.  
  2. class Citas {
  3. public:
  4.   Citas();
  5. private:
  6. };
  7.  
  8. extern int M;
  9.  
  10.  

citas.cpp
Código: Text
  1.  
  2. #include "citas.h"
  3.  
  4. // Declara e inicializa variable global.
  5. int M = 1;
  6.  
  7. Citas::Citas() {
  8.   M = 10;
  9. }
  10.  

prueba.cpp
Código: Text
  1.  
  2. #include "citas.h"
  3.  
  4. int main() {
  5.   cout << "Valor de M antes de crear el objeto: " << M << endl;
  6.  
  7.   Citas misCitas;
  8.  
  9.   cout << "Valor de M después de crear el objeto: " << M << endl;
  10.  
  11.   system( "pause" );
  12.   return 0;
  13. }
  14.  
  15.  

Cita de: "bleglaiger"
Citar
JaMFRY
que te parece si delcaras tu variable gloval M solo en la clase citas y no el el codigo de php, osea quitale del codigo de php siq ueires que el valor no se peurda peus ii te das cuenta en el oro codigo tu variable M no tien ningun valor asiq ue pro defecto te loe sta toamndo por M=0;
bueno creoq eue se es tu problema si no lo es que aml toy proque no lo ude ahcer pero epseroq uet e sirva jeje
************THE KING IS COMING**********
¿¿Qué dijo??  :blink:

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

bleglaiger

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Variable Global
« Respuesta #6 en: Sábado 23 de Diciembre de 2006, 16:39 »
0
Citar
Geo

QUE MALVADO QUE CULPA TENGO YO DE NO SABERME EXPLICAR MUCHO JAJA
PERO BUENO ALGO SI SIRVIO ESPERO QUE SI O SI NO PIÑA PS NO ENTENDI BIEN EL PROBLEMA

*******************THE KING IS COMING*************
IMG]http://http://yakisova-web.hp.infoseek.co.jp/blade3.jpg[/IMG]
****THE KING IS COMING****

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Variable Global
« Respuesta #7 en: Sábado 23 de Diciembre de 2006, 16:47 »
0
Cita de: "bleglaiger"
QUE MALVADO QUE CULPA TENGO YO DE NO SABERME EXPLICAR MUCHO JAJA
PERO BUENO ALGO SI SIRVIO ESPERO QUE SI O SI NO PIÑA PS NO ENTENDI BIEN EL PROBLEMA
No es malvado, por favor presta atencion y aprende a usar el foro. No escribas todo en mayusculas que significa que estas gritando.

Mira los errores de tu mensaje:
que te parece si delcaras tu variable gloval M solo en la clase citas y no el el codigo de php, osea quitale del codigo de php siq ueires que el valor no se peurda peus ii te das cuenta en el oro codigo tu variable M no tien ningun valor asiq ue pro defecto te loe sta toamndo por M=0;
bueno creoq eue se es tu problema si no lo es que aml toy proque no lo ude ahcer pero epseroq uet e sirva jeje

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Max_D

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
    • http://sitioteca.spaces.live.com/
Re: Variable Global
« Respuesta #8 en: Sábado 23 de Diciembre de 2006, 20:19 »
0
Eso va a ser que esta encriptado  :blink:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Variable Global
« Respuesta #9 en: Sábado 23 de Diciembre de 2006, 20:36 »
0
Cita de: "Max_D"
Eso va a ser que esta encriptado  :blink:
Si, tal vez sea un algoritmo para que los traductores on-line no puedan ser capaces de funcionar con sus mensajes y asi nadie que no sepa castellano los pueda leer (?)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JaMFRY

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Variable Global
« Respuesta #10 en: Domingo 24 de Diciembre de 2006, 16:00 »
0
He probado las 2 maneras que me haveis comentado, pero la del "extern int M", cuando lo pongo en el .hpp el g++ del linux no le mola y me da un error del comando extern.

La otra opcion que me haveis dado de poner "int M" solo en el .cpp no me sirve, ya que mas adelante creo un objeto de la clase citas, y necesito llamar a M, y como no la tengo declarada en el .hpp me da error, resumiendo que por fuerza tengo que declarar "int M" en el .hpp, ya que si hiciera lo siguente:

citas b;

b.M= 5; <--- "me dice logicamente que no hay una variable M de la clase citas".

Alguna otra sugerencia, porfavor, es que estoy encallado ahy, y una vez tenga eso ya me ira bien el resto de la clase.Merci.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Variable Global
« Respuesta #11 en: Domingo 24 de Diciembre de 2006, 16:14 »
0
Cita de: "JaMFRY"
citas b;

b.M= 5; <--- "me dice logicamente que no hay una variable M de la clase citas".
Pero pero pero ... ¿Es una variable global? Si fuera una variable global no intentarias hacer b.M = 5;

Que tal si la declaras dentro de la clase pero como static ... ¿Eso es lo que estas tratando de hacer? ¿Una variable de la clase? De esta manera solo una copia es mantenida ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Variable Global
« Respuesta #12 en: Domingo 24 de Diciembre de 2006, 17:07 »
0
Cita de: "JaMFRY"
He probado las 2 maneras que me haveis comentado, pero la del "extern int M", cuando lo pongo en el .hpp el g++ del linux no le mola y me da un error del comando extern.
¿Qué error te da? Yo lo he compilado perfectamente con gcc 4.1.2 en Ubuntu Edgy.

Lo que te respondí no fueron "dos maneras" sino una sola. La variable global está en el .h, todos los archivos desde los que necesites acceder a la variable global M deberán incluir el archivo citas.h, yo prefiero colocar todas las globales en un archivo globales.h. Además, en cada archivo .cpp también debes incluir una declaración (int M;), pero sólo en uno de ellos inicializarla (int M = ALGO;).

Cita de: "JaMFRY"
La otra opcion que me haveis dado de poner "int M" solo en el .cpp no me sirve, ya que mas adelante creo un objeto de la clase citas, y necesito llamar a M, y como no la tengo declarada en el .hpp me da error, resumiendo que por fuerza tengo que declarar "int M" en el .hpp, ya que si hiciera lo siguente:

citas b;

b.M= 5; <--- "me dice logicamente que no hay una variable M de la clase citas".

Alguna otra sugerencia, porfavor, es que estoy encallado ahy, y una vez tenga eso ya me ira bien el resto de la clase.Merci.
Por supuesto que tendrás un error, M es una variable global, no una variable miembro de la clase Citas.

Probemos de nuevo, son muchos archivos pero espero entiendas la idea:

[citas.h]
Código: Text
  1.  
  2. class Citas {
  3. public:
  4.   Citas();
  5. };
  6.  
  7.  

[citas.cpp]
Código: Text
  1.  
  2. #include &#34;citas.h&#34;
  3. #include &#34;globales.h&#34;
  4.  
  5. Citas::Citas() {
  6.   M = 100;
  7. }
  8.  
  9.  

[globales.h]
Código: Text
  1.  
  2. extern int M;
  3.  
  4.  

[globales.cpp]
Código: Text
  1.  
  2. #include &#34;globales.h&#34;
  3.  
  4. int M = 1;
  5.  
  6.  

[main.cpp]
Código: Text
  1.  
  2. #include &#34;globales.h&#34;
  3. #include &#34;citas.h&#34;
  4. #include &#60;iostream&#62;
  5. using std::cout;
  6. using std::endl;
  7.  
  8. int main() {
  9.   cout &#60;&#60; &#34;Valor de M antes de crear el objeto: &#34; &#60;&#60; M &#60;&#60; endl;
  10.   Citas misCitas;
  11.   cout &#60;&#60; &#34;Valor de M después de crear el objeto: &#34; &#60;&#60; M &#60;&#60; endl;
  12.  
  13.   return 0;
  14. }
  15.  
  16.  

[Makefile]
Código: Text
  1.  
  2. prueba: main.o citas.o globales.o
  3.   g++ -o prueba main.o citas.o globales.o
  4.  
  5. main.o: main.cpp
  6.   g++ -o main.o -c main.cpp
  7.  
  8. citas.o: citas.cpp
  9.   g++ -o citas.o -c citas.cpp
  10.  
  11. globales.o: globales.cpp
  12.   g++ -o globales.o -c globales.cpp
  13.  
  14.  

Claro, faltan detalles como la protección contra múltiples include...
Con esos archivos, haz pruebas, por ejemplo, borra la definición int M = 1 de globales.cpp, o quítale la inicialización, agrega una declaración int M; antes de la función main en main.cpp...

Cita de: "Eternal Idol"
Que tal si la declaras dentro de la clase pero como static ... ¿Eso es lo que estas tratando de hacer? ¿Una variable de la clase? De esta manera solo una copia es mantenida ...

Je, después de todo el "rollo" que escribí veo esto y ya me surgió la duda, ¿qué es lo que quieres concretamente?

Suerte,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

JaMFRY

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Variable Global
« Respuesta #13 en: Domingo 24 de Diciembre de 2006, 18:01 »
0
Perdon por la confunsion que he podido provocar,  mi caso es que yo declaro en el .hpp un variable "int M".
Y cuando llamo al constructor de la clase Citas(), en el .cpp le doy valor "M=5;"
cuando sale del constructor y llama a otra funcion que tambien utiliza la variable M, al ser otra funcion a la M tiene por valor "M=0", y este es mi problema que quiero que M siga siendo "M=5", nose si ahora se entiende un poco mejor??

Por si asi os haceis una idea, lo que estoy haciendo es una tabla de Hash, y he implementado una funcion para Redimensionar la tabla, es decir cambiar el valor de M, en el caso que haya muchas colisiones. Entonces para ello creo otro objeto de la clase:

Citas b;
b.M = 101;

En definitiva, que nose porque al salir del constructor el valor de M se me pierde.

Si intento poner "extern int M" en el .hpp como me haveis comentando me da un error: clase de almacenamiento especificado para 'M'.
Se tiende ahora más mi problema??

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Variable Global
« Respuesta #14 en: Domingo 24 de Diciembre de 2006, 23:49 »
0
Creo que no sólo nos confundiste, sino que tú también estás confundido :P.

Esto no es una variable global:
Código: Text
  1.  
  2. Citas b;
  3. b.M = 101;
  4.  
  5.  

Eso es una variable miembro de la clase b, cuyo identificador/nombre/alias es M. Creo que buscas hacer lo que comentó Eternal, aunque con la variable global como te la he mostrado no creo que tuvieras problemas.

Lo que me imagino que estás haciendo es declarar lo que te comenté (extern int M) pero dentro de la declaración de la clase (eso me imagino por el mensaje de error), allí no puedes usar extern. ¿No has probado con el código que he puesto (los 5 archivos)?

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip