SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: m0skit0 en Jueves 2 de Abril de 2009, 12:35

Título: [Solucionado] Globales en C++
Publicado por: m0skit0 en Jueves 2 de Abril de 2009, 12:35
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:
Título: Re: Globales en C++
Publicado por: Eternal Idol en Jueves 2 de Abril de 2009, 12:44
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.
Título: Re: Globales en C++
Publicado por: m0skit0 en Jueves 2 de Abril de 2009, 12:59
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 (http://alleg.sourceforge.net/stabledocs/en/alleg005.html#install_int_ex) aconseja ponerlo de esta forma.

Gracias de nuevo Eternal Idol.
Título: Re: Globales en C++
Publicado por: Eternal Idol en Jueves 2 de Abril de 2009, 13:07
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.
Título: Re: Globales en C++
Publicado por: m0skit0 en Jueves 2 de Abril de 2009, 13:35
Ahí tienes, a ver qué tal.
Título: Re: Globales en C++
Publicado por: Eternal Idol en Jueves 2 de Abril de 2009, 14:12
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.  
Título: Re: Globales en C++
Publicado por: fachamix en Viernes 3 de Abril de 2009, 17:58
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???
Título: Re: Globales en C++
Publicado por: Eternal Idol en Viernes 3 de Abril de 2009, 18:06
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 ...
Título: Re: Globales en C++
Publicado por: m0skit0 en Viernes 3 de Abril de 2009, 22:09
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:
Título: Re: Globales en C++
Publicado por: Eternal Idol en Viernes 3 de Abril de 2009, 23:19
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 ...