Autor Tema: no consigo crear variables globales en c30.  (Leído 3366 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
no consigo crear variables globales en c30.
« en: 19 de Julio de 2011, 19:12:20 »
estoy intentando definir unasvariables globales compartidas por dos modulos distintos, me explico: tengo el programa principal (main.c) y un archivo lcd.c los cuales quiero que compartan unas variables. Para ello defini un archivo variables.h que añadí al proyecto y el cual incluyo en cada uno de los modulos (main.c y lcd.c).
Si no hago el include en alguno de los dos me da un error de compilacion porque no me reconoce dicha variable. Si hago el include en ambos me da un error de enlazado y me pone que la definición de la variable está duplicada, y ante esto , no se que hacer para compartir esas variables globales. El compilador que utilizo es el c30.

¿alguna solución para crear variables globales?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: no consigo crear variables globales en c30.
« Respuesta #1 en: 19 de Julio de 2011, 23:04:52 »
Lee sobre el modificador extern


Saludos
No contesto mensajes privados, las consultas en el foro

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: no consigo crear variables globales en c30.
« Respuesta #2 en: 20 de Julio de 2011, 18:49:59 »
Hola black_flowers,

yo he tenido problemas similares cuando creo proyectos con varios archivos. Normalmente los puedo solucionar, pero creo que debe haber un patrón a seguir, aunque nunca he encontrado información al respecto.

lo que hago es:
cuando tengo que compartir info entre funciones declaradas en distintos archivos:
Código: C
  1. // src1.c. Declara e inicializa la variable
  2. int variable = 0;
  3.  
  4. // inc1.h.  Declara la variable como externa. NO la inicializa
  5. extern inr variable;
  6.  
  7. // src2.c. Incluye inc1.h por tanto tiene la variable declarada como externa.
  8. #include "inc1.h"

Cosas similares me ocurren con defines, structs, funciones... creo que tiene que haber un patron estandarizado a seguir...alguien conoce algun libro donde venga algo?

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: no consigo crear variables globales en c30.
« Respuesta #3 en: 20 de Julio de 2011, 19:25:58 »
sí, asi es como lo hice, tambien me suena raro ya que aunque suelo programar en c nunca me he encontrado con esta situación excepto en el mplab.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: no consigo crear variables globales en c30.
« Respuesta #4 en: 20 de Julio de 2011, 20:32:16 »
Puede ser una opción: Programación en C, Metodologia, Algoritmos y estructura de datos de Joyanes Aguilar,Luis & Zahonero Martínez, Ignacio. Seguramente en todos los libros de C se debe explicar eso.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado naccchhho

  • PIC10
  • *
  • Mensajes: 1
Re: no consigo crear variables globales en c30.
« Respuesta #5 en: 20 de Julio de 2011, 21:03:55 »
Hola black_flowers...a ver si ayuda esto....

Una variable externa debe definirse solo una vez, fuera de cualquier función. Dicha variable debe declararse en cada función que se desee tener acceso a ella, para ello utilizas una proposición extern.
Si el programa está en varios archivos y una variable global la definis en un archivoA, y también la utiliza un archivoB y un archivoC, entonces necesitas declaraciones extern en archivoB y C. Generalmente lo que se hace es reunir declaraciones extern de variables y funciones en un archivo separado, header, y este es incluido al principio de cada archivo fuente.

Suerte...

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: no consigo crear variables globales en c30.
« Respuesta #6 en: 21 de Julio de 2011, 10:01:47 »
Citar
Puede ser una opción: Programación en C, Metodologia, Algoritmos y estructura de datos de Joyanes Aguilar,Luis & Zahonero Martínez, Ignacio. Seguramente en todos los
libros de C se debe explicar eso.
suky me he "comprado" el libro en rapidshare y no he encontrado nada de lo que buscaba. Bueno, en el apartado 3.1 Estructura general de un programa en C explica como estructurar un programa, pero se refiere a un programa pequeño con un único archivo fuente...


Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: no consigo crear variables globales en c30.
« Respuesta #7 en: 21 de Julio de 2011, 11:09:22 »
Sin embargo sigue dandome un error con las variables static. Parece ser que con las static no funciona esto.
« Última modificación: 21 de Julio de 2011, 11:11:39 por black_flowers »

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: no consigo crear variables globales en c30.
« Respuesta #8 en: 21 de Julio de 2011, 11:34:16 »
Hola, normalmente es una practica poco aconsejable compartir variables globales entre módulos, atenta contra el principio de encapsulación de datos. Para cuando no quede alternativa yo utilizo esta técnica.

global.h
Código: C
  1. /* Esta macro define el tipo de storage */
  2. #ifdef __FORCE_STORAGE_LINK__
  3.   #define _STORAGE_LINK_
  4. #else
  5.   #define _STORAGE_LINK_ extern
  6. #endif
  7. ...
  8.  
  9. _STORAGE_LINK_ int Var1;
  10. _STORAGE_LINK_ long Var2;

Si tengo varios módulos C solamente en uno define la macro __FORCE_STORAGE_LINK__

archivo1.c
Código: C
  1. #define __FORCE_STORAGE_LINK__
  2. #include "global.h"
  3.  
  4. ...

archivo2.c
Código: C
  1. #include "global.h"
  2.  
  3. ...

De esta manera automatizo bastante las cosas, cuando necesito definir una nueva variable global y que va a ser usada por varios módulos, entonces solamente la agrego al archivo global.h

Saludos !

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: no consigo crear variables globales en c30.
« Respuesta #9 en: 22 de Julio de 2011, 09:05:00 »
Hola, normalmente es una practica poco aconsejable compartir variables globales entre módulos, atenta contra el principio de encapsulación de datos.

y cual se supone que seria el metodo correcto?, ya que hay veces que es necesario compartir datos entre funciones de distintos archivos, por ejemplo el archivo lcd puede necesitar compartir informacion con elmodulo del convertidor analogico digital, en este caso cual es lo recomendable? ¿una funcion tal vez? ¿punteros?

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: no consigo crear variables globales en c30.
« Respuesta #10 en: 22 de Julio de 2011, 14:17:07 »
Hola, si estas con la memoria de programa casi al limite no te queda otra que usar variables globales y compartirlas con extern. Si queres usar una interfaz más limpia tenes que usar funciones, algo así:

Modulo1.h
Código: C
  1. long GetValue( void );
  2. void SetValue( long NewValue );

Modulo1.c
Código: C
  1. static long FValue;
  2. long GetValue( void )
  3. {
  4.   return FValue;
  5. }
  6. void SetValue( long NewValue )
  7. {
  8.   FValue = NewValue;
  9. }

Al declarar FStatic como static la hacemos que sea global pero solo visible por el módulo. La idea seria esa.

Saludos !



Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: no consigo crear variables globales en c30.
« Respuesta #11 en: 22 de Julio de 2011, 16:44:08 »
Si queres usar una interfaz más limpia tenes que usar funciones, algo así:

Osea que las variables no pueden ser compartidas entre dos modulos, pero las funciones si. A primera vista me suena un poco raro ya que creia que funciones y variables tenian las mismas caracteristicas de ambito y eso.

Al declarar FStatic como static la hacemos que sea global pero solo visible por el módulo. La idea seria esa.

ese es el problema que tengo ahora, que tengo que acceder desde otro modulo a una variable estatica, y lo que hago es definirla en un .h e incluirlo en ambos modulos. Luego compila sin problema pero el programa no funciona. a lo mejor igual esta creando dos variables distintas con el mismo nombre, una para cada modulo.


Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: no consigo crear variables globales en c30.
« Respuesta #12 en: 22 de Julio de 2011, 17:43:36 »
Hola, no estoy diciendo que no se puedan compartir las variables, en si se pueden lo que digo es que es una buena practica "aislar" las variables globales de los módulos. Después cada uno toma la opción que quiera, la cosa sería dado un programa es bien diferente que funcione a que este bien diseñado, lo primero no implica lo segundo.

Saludos !

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: no consigo crear variables globales en c30.
« Respuesta #13 en: 22 de Julio de 2011, 17:53:33 »
Hola, no estoy diciendo que no se puedan compartir las variables, en si se pueden lo que digo es que es una buena practica "aislar" las variables globales de los módulos. Después cada uno toma la opción que quiera, la cosa sería dado un programa es bien diferente que funcione a que este bien diseñado, lo primero no implica lo segundo.

Saludos !

sí, te entendí perfectamente y te agradezco el consejo,
un saludo!