Ver Mensaje Individual
  #10 (permalink)  
Antiguo 31/08/2010, 02:33
Fw190
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 meses
Puntos: 73
Respuesta: Problema con un error de estructura

El error que te da es un error del enlazador (linker). Te indica que estás declarando esas variables en más de un módulo de programa (llamo módulo a un archivo de código fuente). Te explico por qué.

Las variables que declaras fuera de las funciones son globales. Esto quiere decir que son conocidas en todos los módulos que componen el programa. El compilador trata los archivos de código fuente uno por uno, sin tener en cuenta los demás, por lo que si se utiliza una variable definida como global en otro archivo va a dar error (no sabe que esa variable ya está definida en otra parte). De ahí el empleo del atributo extern: Se le dice al compilador que la variable se ha definido en otro lugar. Esto exige que haya SOLO UNA declaración "normal" de la variable en uno de los módulos, y declaraciones con atributo extern en el resto de módulos donde se utilice (deberá coincidir tanto el nombre como el tipo de la variable). Este era el origen de los errores en tu primer post: Las variables estaban declaradas como extern en todos los módulos, de cara al compilador no era incorrecto, pero al enlazar el linker no encontraba la, digamos, "variable original" (de ahí el error de "undefined reference").

El error que te da ahora es justamente lo contrario. Hay variables globales con el mismo nombre en varios módulos, y el enlazador no sabe cuál de ellas es la que debe emplear (aunque para tí sean lo mismo, ya que tienen el mismo nombre y tipo, la cosa cambia después de compilar).

Tienes dos soluciones posibles (suponiendo que, por lo demás, el programa funciona correctamente).

La primera, si quieres emplear variables globales (poco recomendable, y menos aún si deben ser comunes a varios módulos), es declararlas "normalmente" en uno de ellos, y como extern en el resto.

La segunda es declararlas con el atributo static en el módulo principal (de este modo son globales solamente para este módulo, y desconocidas para el resto). Pasa la información a las funciones mediante parámetros (he visto que no utilizas parámetros en ninguna de las funciones que has definido). Tendrás, lógicamente, que cambiar en consecuencia las declaraciones, las implementaciones y las llamadas a las funciones. Aunque algo más pesado que lo anterior (tampoco es para tanto), tiene la ventaja de que "aíslas" los módulos entre sí y evitas posibles "efectos colaterales" que pueden resultar del empleo de variables globales.

En ambos casos, las variables auxiliatres que necesites, en la medida de lo posible, decláralas dentro de las funciones que hagan uso de ellas. Si necesitas que sean globales dentro del módulo, decláralas con el atributo static.

Espero que todo este rollo te ayude a resolver tu problema. Saludos,