Autor Tema: Tipos de variables  (Leído 13258 veces)

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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Tipos de variables
« en: 14 de Marzo de 2008, 18:29:16 »
Hola

Estoy estudiando una librería en donde se definen los tipos de variables que un compilador usa. Me encuentro con variables nuevas para mi. Las pongo a continuación.

Código: [Seleccionar]
/*+----------------------------------------------------------------------------------------------+*/
typedef unsigned char u8; ///< 8bit unsigned integer
typedef unsigned short u16; ///< 16bit unsigned integer
typedef unsigned int u32; ///< 32bit unsigned integer
typedef unsigned long long u64; ///< 64bit unsigned integer
/*+----------------------------------------------------------------------------------------------+*/
typedef signed char s8; ///< 8bit signed integer
typedef signed short s16; ///< 16bit signed integer
typedef signed int s32; ///< 32bit signed integer
typedef signed long long s64; ///< 64bit signed integer
/*+----------------------------------------------------------------------------------------------+*/
typedef volatile unsigned char vu8; ///< 8bit unsigned volatile integer
typedef volatile unsigned short vu16; ///< 16bit unsigned volatile integer
typedef volatile unsigned int vu32; ///< 32bit unsigned volatile integer
typedef volatile unsigned long long vu64; ///< 64bit unsigned volatile integer
/*+----------------------------------------------------------------------------------------------+*/
typedef volatile signed char vs8; ///< 8bit signed volatile integer
typedef volatile signed short vs16; ///< 16bit signed volatile integer
typedef volatile signed int vs32; ///< 32bit signed volatile integer
typedef volatile signed long long vs64; ///< 64bit signed volatile integer
/*+----------------------------------------------------------------------------------------------+*/
// fixed point math typedefs
typedef s16 sfp16;                              ///< 1:7:8 fixed point
typedef s32 sfp32;                              ///< 1:19:8 fixed point
typedef u16 ufp16;                              ///< 8:8 fixed point
typedef u32 ufp32;                              ///< 24:8 fixed point
/*+----------------------------------------------------------------------------------------------+*/
typedef float f32;
typedef double f64;
/*+----------------------------------------------------------------------------------------------+*/
typedef volatile float vf32;
typedef volatile double vf64;
/*+----------------------------------------------------------------------------------------------+*/
typedef unsigned int BOOL;
/*+----------------------------------------------------------------------------------------------+*/
// alias type typedefs
#define FIXED s32                               ///< Alias type for sfp32
/*+----------------------------------------------------------------------------------------------+*/

¿Me podrían explicar las siguientes por favor?

unsigned volatile integer
signed volatile integer
fixed point
volatile float
volatile double

¿Por qué son valátiles? ¿Toda la RAM es volátil no? ¿Por qué punto fijo y no flotante?  :z)

Gracias

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Tipos de variables
« Respuesta #1 en: 14 de Marzo de 2008, 18:33:34 »
A que compilador pertenecen??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Tipos de variables
« Respuesta #2 en: 14 de Marzo de 2008, 18:39:59 »
Hola, el calificador "volatile" instruye al compilador para que no haga ninguna optimizacion sobre la misma y acceda tal cual aparece en el codigo, normalmente en cualquier compilador para embebidos el compilador optimza mucho, ejemplo
...
Código: [Seleccionar]
volatile byte Register; // assumimos que es un registro del micro
byte Prueba;
Prueba = Register;
Prueba = Register;
Prueba = Register;

Si la variable no es "calificada" como volatile el compilador elimina las dos primeras lineas, porque asume que es una operacion sin sentido, al colocar volatile el compilador no optimiza nada, y las tres asignaciones son hechas.
Saludos

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tipos de variables
« Respuesta #3 en: 14 de Marzo de 2008, 18:54:44 »
Richi, ¿entonces conviene usarlas? Porque mejor sigo usando las antiguas int, float, long, etc. No estoy haciendo programas complejos ni importa la velocidad con que se ejecuten.

MGLSoft, estoy adentrándome al compilador que trae el devkitPro para el Nintendo Gamecube. Estoy haciendo mi segundo programa, el primero fue el Hello World  :D

Estaba estudiando las variables que puedo usar y me encontré con esas raras.

Todavía tengo la duda de qué es fixed point.
« Última modificación: 14 de Marzo de 2008, 18:57:08 por migsantiago »

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Tipos de variables
« Respuesta #4 en: 14 de Marzo de 2008, 19:08:04 »
Santiago, normalmente se usan cuando interactuas con el hardware o cuando usas una variable compartida con algun handler de interrupcion. Con respecto a los nombres fixed, integer son llamados typedefs que no son ni mas ni menos que tipos definidos por el usuario para mejor claridad del codigo, ejemplo en "C" standart el Bool no esta implementado es decir no es un tipo de datos intrinsico del lenguaje como lo es char, int, long pero con un simple arreglo se puede definir
Código: [Seleccionar]
typedef unsigned char Bool
El compilador sabe ahora que el tipo Bool es un unsigned char
En el compilador que estas usuando se define asi
Citar
*+----------------------------------------------------------------------------------------------+*/
typedef unsigned int BOOL;
/*+----------------------------------------------------------------------------------------------+*/
En este caso se define como un entero, esto se hace para optimizar el uso del tipo de datos que el micro ( en tu caso seguro que es de 32 bits o mas ) puede manejar mas rapidamente...pero esto es tema para otro post.
Con respecto a Fixed Point se refiere a operando de punto fijo es decir no posee decimales como los floats, double como veras solo es una cuestion de notacion.

Saludos !

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tipos de variables
« Respuesta #5 en: 14 de Marzo de 2008, 19:29:07 »
Ohh, entonces el fixed point, ¿se puede considerar como un unsigned int por ejemplo?

El procesador del Nintendo es de 128bits, pero la variable int es trabajada por el compilador a 32bits.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Tipos de variables
« Respuesta #6 en: 14 de Marzo de 2008, 19:54:26 »
Ohh, entonces el fixed point, ¿se puede considerar como un unsigned int por ejemplo?
Correcto !
Citar
El procesador del Nintendo es de 128bits, pero la variable int es trabajada por el compilador a 32bits.
Pabada de micro tiene :lol:

Saludos !

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tipos de variables
« Respuesta #7 en: 06 de Abril de 2008, 17:24:57 »
Hola de nuevo

¿Qué significa una declaración de variable así?

extern u8 variable[];

Sé que es una cadena de chars de tamaño indefinido, pero ¿qué se logra con ponerle extern?  :o

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Tipos de variables
« Respuesta #8 en: 06 de Abril de 2008, 19:21:38 »
La idea es que tengo vision global, el compilador trata a la variable como esta declarada ( U8 char * ) y el linker define la direccion real de la misa, obvio que en algun modulo debe estar declarada. Basicamente es lo mismo cuando en assembler  declaras variables como PUBLIC y EXTERN.
Saludos !

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tipos de variables
« Respuesta #9 en: 06 de Abril de 2008, 21:31:11 »
Ah OK, entonces es global nadamás. Tenía la idea de que al poner extern se usaba otra memoria RAM externa, y como el Nintendo tiene memoria RAM de audio, creí que era esa.

Gracias Richi

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Tipos de variables
« Respuesta #10 en: 06 de Abril de 2008, 21:39:11 »
La etiqueta extern se pone cuando una variable esta declarada en otro fichero y dado que solo se puede resolver en tiempo de "linkado", para evitar que el compilador de un error de variable no declarada, se utiliza esta etiqueta.

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tipos de variables
« Respuesta #11 en: 06 de Abril de 2008, 22:23:18 »
Mmhh, sí, de hecho la llena con lo obtenido de un archivo .s, pero estoy viendo si alguien me puede ayudar...  :mrgreen:

http://www.todopic.com.ar/foros/index.php?topic=21215.0

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Tipos de variables
« Respuesta #12 en: 07 de Abril de 2008, 17:45:10 »
Mi consejo es que las variables las definas siempre como su tipado normal. 

Usa el modo "volatile" cuando la variable sea global y no solo se modifique en la rutina actual sino que pueda ser modificada por otras rutinas de modo inesperado ya sea por interrupción (caso típico de microcontroladores) o por "eventos" que serían interrupciones al flujo normal de ejecución de un programa, esto último ya aplica más a sistemas operativos como windows o linux.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tipos de variables
« Respuesta #13 en: 07 de Abril de 2008, 22:25:32 »
OK, Maunix.

Es que en los programas de ejemplo que veo en este compilador para el Gamecube, estoy viendo puras variables raras y métodos de rellenarlas igual de raros.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Tipos de variables
« Respuesta #14 en: 08 de Abril de 2008, 08:22:29 »
OK, Maunix.

Es que en los programas de ejemplo que veo en este compilador para el Gamecube, estoy viendo puras variables raras y métodos de rellenarlas igual de raros.

Lo de los métodos de rellenarlas podrías postearlos y vemos si los podemos comprender

Lo de las 'variables raras' que mencionaste más arriba en el post, en realidad simplemente es una forma de "cambiar el nombre" de un tipo de variable ya sea para abreviar su sintaxis (vu8 sería volatile unsigned char) o también para unificar tipos de variables entre compiladores.

A veces sucede que uno usa varios compiladores para una misma plataforma o bien usa varias plataformas, y quiere que un código se " lo más transportable posible " entre compiladores y entre plataformas.   Entonces, una forma es declarar tipos de variable que signifiquen lo mismo sin depender de la plataforma.

Para ser más claro

Por ejemplo, en ccs el tipo int es un tipo de 8 bits.  En C18 int es un tipo de 16 bits.  Si quisiéramos copiar/pegar un código de C18 en ccs sin tener en cuenta ese pequeño gran detalle, el código es muy muy muy posible que no funcione.  Entonces una forma sería hacer un archivo .h de encabezados en CCS y otro en C18.  Ambos de mismo nombre pero diferente contenido.

Ese archivo podría tener algo así como

En CCS

typedef BYTE int


En C18

typedef BYTE char


Luego en el código "transportable" declararíamos las variables como BYTE y asunto solucionado.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)