• Miércoles 20 de Noviembre de 2024, 12:23

Autor Tema:  [Solucionado] Globales en C++  (Leído 2131 veces)

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
[Solucionado] Globales en C++
« en: Jueves 2 de Abril de 2009, 12:35 »
0
Tengo en el fichero clases.h las especificaciones de las clases y una variable global, con un .cpp por cada implementación de clase.

Código: C++
  1. //clases.h
  2. //Variables globales
  3. volatile int contador_ticks;
  4.  
Luego, en main.cpp tengo una función global (que se usa como rutina de interrupción):

Código: C++
  1. //main.cpp
  2. //Rutina de interrupción del temporizador
  3. void interrupcion_tick()
  4. {
  5.     contador_ticks++;
  6. }
  7. END_OF_FUNCTION(interrupcion_tick);
  8.  
Compila, pero el enlazado me da errores:

Código: Text
  1. ccoordenada.o(.text+0x0) In function `Z17interrupcion_tickv':
  2. 171 clases.h multiple definition of `interrupcion_tick()'
  3.  
Y así en todos las compilaciones objeto (.o) de todos los .cpp.

Lo que más me intriga es que la línea que me marca de clases.h (171)... no existe, puesto que el fichero sólo tiene 168 líneas :ph34r:
« última modificación: Viernes 3 de Abril de 2009, 22:09 por m0skit0 »

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Globales en C++
« Respuesta #1 en: Jueves 2 de Abril de 2009, 12:44 »
0
La variable contador_ticks tiene que ser declarada como extern en la cabecera (volatile no tiene sentido para una variable global, no puede estar en un registro eternamente) y tenes que definirla en un solo modulo de codigo.

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.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Globales en C++
« Respuesta #2 en: Jueves 2 de Abril de 2009, 12:59 »
0
Sigo con los mismos errores:

Código: C++
  1. //clases.h
  2. //Variables globales
  3. extern volatile int contador_ticks;
  4.  
Esta declaración sólo aparece en clases.h. Aunque cada .cpp de clase tiene un #include "clases.h". ¿Será por esto?

Cita de: "Eternal Idol"
volatile no tiene sentido para una variable global, no puede estar en un registro eternamente
La documentación de Allegro aconseja ponerlo de esta forma.

Gracias de nuevo Eternal Idol.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Globales en C++
« Respuesta #3 en: Jueves 2 de Abril de 2009, 13:07 »
0
No, que varios incluyan clases.h deberia funcionar con el extern (siempre que en algun modulo lo definas, pero el error seria otro). Reduci el problema a la minima expresion compilable y lo vemos, sin Allegro de ser posible.

PD. Allegro esta obsoleto ... aunque yo me confundi con register.

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.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Globales en C++
« Respuesta #4 en: Jueves 2 de Abril de 2009, 13:35 »
0
Ahí tienes, a ver qué tal.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Globales en C++
« Respuesta #5 en: Jueves 2 de Abril de 2009, 14:12 »
0
El error ahora no es el mismo:
/ccoDdaaa.o(.text+0x4):main.cpp: undefined reference to `contador'
/ccoDdaaa.o(.text+0xa):main.cpp: undefined reference to `contador'
collect2: ld returned 1 exit status

main.obj : error LNK2019: unresolved external symbol "int volatile contador" (?contador@@3HC) referenced in function "void __cdecl interrupcion_reloj(void)" (?interrupcion_reloj@@YAXXZ)
main.exe : fatal error LNK1120: 1 unresolved externals

Como te decia tenes que definirlo en algun modulo, en  este caso en el main:

Código: Text
  1. #include "clases.h"
  2.  
  3. volatile int contador = 0;
  4. ...
  5.  
  6.  

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.

fachamix

  • Miembro MUY activo
  • ***
  • Mensajes: 173
  • Nacionalidad: ar
    • Ver Perfil
Re: Globales en C++
« Respuesta #6 en: Viernes 3 de Abril de 2009, 17:58 »
0
no moskito, el extern tienes que usarlo en el ,cpp no en el .h donde esta la declaracion original.

EI: juntando mensajes.

//main.cpp
//Rutina de interrupción del temporizador
void interrupcion_tick()
{
contador_ticks++;
}
END_OF_FUNCTION(interrupcion_tick); //NUNCA E VISTO ESTO CHE, PORQUE SE LA USA???
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Globales en C++
« Respuesta #7 en: Viernes 3 de Abril de 2009, 18:06 »
0
Cita de: "fachamix"
no moskito, el extern tienes que usarlo en el ,cpp no en el .h donde esta la declaracion original.

Tal y como lo explique funcione perfectamente, comprobalo.

Cita de: "fachamix"
NUNCA E VISTO ESTO CHE, PORQUE SE LA USA???

Es algo de Allegro ...

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.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Globales en C++
« Respuesta #8 en: Viernes 3 de Abril de 2009, 22:09 »
0
Cita de: "Eternal Idol"
Tal y como lo explique funcione perfectamente, comprobalo.
Sí, pero da error en cgeneral.cpp: "variable contador undeclared". Así que lo puse en cgeneral.cpp y tira :P Ahí se queda.

Cita de: "fachamix"
END_OF_FUNCTION(interrupcion_tick); //NUNCA E VISTO ESTO CHE, PORQUE SE LA USA???
Como ha dicho Eternal Idol.

 :hola:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Globales en C++
« Respuesta #9 en: Viernes 3 de Abril de 2009, 23:19 »
0
Cita de: "m0skit0"
Sí, pero da error en cgeneral.cpp: "variable contador undeclared". Así que lo puse en cgeneral.cpp y tira :P Ahí se queda.

Dara error en un modulo por no incluir la cabecera donde esta declarado ...

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.