[C con Clase] Ayuda: Como declaro variables en un proyecto?

Steven Davidson steven en conclase.net
Mie Feb 14 05:23:52 CET 2007


Hola Diego,

El pasado 2007-02-14 03:27:29, D1e6o! escribió:

D> Muchas gracias a ambos!!!
D> No lo estoy haciendo bien... je. Lo que hice es siguiendo sus mensajes:
D> En tempor.c
D> #include <windows.h>
D> // Ahora acá esta el problema. No se como declarar freq para poder utilizarla tanto en main como en tempor y que esta tenga el mismo valor, no que cree una variable para cada modulo
D>  DWORD TiempoActual(void)
D>  {
D>    LARGE_INTEGER cuenta;
D>    QueryPerformanceCounter(&cuenta);//retorna el valor en ticks
D>      //paso a milisegundos y lo retorno
D>    return ((DWORD) ((cuenta.QuadPart*1000 ) / freq.QuadPart));
D>  }
D>  
D>   char InitTimer(void)
D>  {
D>   if (!QueryPerformanceFrequency(&freq)) return(0);
D>  }
D> En decla.h
D> #ifndef  _DECLA
D> #define  _DECLA
D> DWORD GetTimer(void);
D> char InitTimer(void);
D> #endif
D> En main.cpp
D> ...
D> #include "decla.h"
D> ...
D> LARGE_INTEGER freq;
D> Lo que no se es como declarar LARGE_INTEGER freq en tempor.c para que sea utlilizada con el mismo valor que en main.cpp y la pueda utilizar tanto en rutinas de main como de temp, porque si la declaro en decla.h e incluyo decla.h en tempo.c ¿no tiene un valor distinto para cada modulo?
D> Porque los errores son:
D> In function `TiempoActual':
D> freq undeclared (first use in this function)
D> (Each undeclared identifier is reported only once for each function it appears in.)
D> In function `InitTimer':
D> freq undeclared (first use in this function)
D> Por otro lado si vuelvo a declarar freq en tempo (cosa que creo que está mal porque tendría un valor en ese modulo y otro en otro) me da otro error:   [Linker error] undefined reference to `TiempoActual()'
D> Cual sería la declaración correcta de variables en los distintos módulos? Muchas Gracias...! (siempre esquivo usar mas de un archivo fuente porque tengo esos problemas.. :( )

El problema es con el enlazador, como ya has notado. Lo que tienes que hacer es indicar al enlazador que tal variable es común y que será compartida. Para esto, tienes que indicar 'extern' como modificador para la declaración. Esto es,

// decla.c

extern LARGE_INTEGER freq;


// tempor.c

extern LARGE_INTEGER freq;


// main.c

LARGE_INTEGER freq;  // Definimos aquí la variable


Ahora la variable 'freq' existe en "main.c", mientras que para los otros ficheros fuentes, la variable realmente es una referencia para el enlazador. En otras palabras, sólo existe una sola variable 'freq'.


Espero que esto te sirva.

Steven


Más información sobre la lista de distribución Cconclase