TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: migsantiago en 02 de Abril de 2006, 13:37:00
-
Hola
Estaba haciendo un programa y me pasé de listo jejeje, declaré un arreglo de 32 variables tipo int16 y otro arreglo de 32 elementos de tipo float. Se me acabó la RAM y CCS no me dejaba compilar. Tuve que borrar el 2do arreglo.
Lo que no sé es cuantos bytes consume una variable float o una double. Lo que encontré en la ayuda es:
int1
Defines a 1 bit number
int8
Defines an 8 bit number
int16
Defines a 16 bit number
int32
Defines a 32 bit number
char
Defines a 8 bit character
float
Defines a 32 bit floating point number
short
By default the same as int1
Int
By default the same as int8
long
By default the same as int16
void
Indicates no specific type
Pero no indica el no. de bytes usados. Por favor díganme si hay una tabla que los marque y también que indique los límites superior e inferior del tipo de dato, por ejemplo, int8 va de 0 a 255. Gracias.
-
Buenas!!!bueno decir que 8 bits = 1byte....
Suerte!!!
-
jeje eso ya lo sé

pero por ejemplo, ¿qué rango tiene esa variable?
-
Echale un vistazo al fichero float.h
-
Ya revisé la info y ya me di cuenta de los datos jejeje, gracias amigos.
-
Escrito originalmente por migsantiago
jeje eso ya lo sé 
pero por ejemplo, ¿cuántos bytes usa una variable float? ¿qué rango tiene esa variable? 
De acuerdo a lo que leo, interpreto que una variable float te ocupa 4 bytes (32 bits).
El tema es que depende como tu compilador almacene dicha variable y de ahí sabras en que rangos funciona pero es normal que use el modo de Microchip o el de la IEEE.
Microchip usa 4 bytes. 1 byte para el exponente (+127 a -128) y 3 bytes para la mantisa (24 bits de precisión). Eso te da -8388608 a +8388607 como mantisa sumado el exponente.
Ahora habría que ver que formato usa el compilador CCS. Como no lo uso no tengo el manual, pero seguro por algun lado lo debiera mencionar.
Lecturas recomendadas.
Floating Point to ASCII Conversion
http://ww1.microchip.com/downloads/en/AppNotes/00670b.pdf
IEEE 754 Compliant Floating Point Routines
http://ww1.microchip.com/downloads/en/AppNotes/00575.pdf
Wikipedia
http://es.wikipedia.org/wiki/IEEE_754
Saludos
-
Gracias Maunix.
-
Y corroborando lo que dice el amigo manuix, en el manual del compilador, concretamente en la pagina 268, dice que declara 1 byte para el exponente y 3 bytes para la mantisa.
Suerte!!!
-
Escrito originalmente por vszener
Y corroborando lo que dice el amigo manuix, en el manual del compilador, concretamente en la pagina 268, dice que declara 1 byte para el exponente y 3 bytes para la mantisa.
Suerte!!!
Era lo más lógico pero ... como en software cada uno puede hacer lo que quiere... jeje. El problema comienza cuando uno pretende comuunicarse con otros sistemas.
De todas formas era raro que el CCS use un formato totalmente a medida de ellos pero.... ante la duda mejor no afirmar nada no?
En definitiva si el compilador no pretende hacer algo que se comunique con el exterior o con otros sistemas entonces podria implementar su propio sistema número de punto flotante pero para que reinventar la rueda si ya fue inventada no?
Saludos
-
En software se puede hacer CASI lo que uno quiere... me acabo de llevar una súper descepción... hice todo un programa que me tomó unas horas y cuando doy compilar me sale el CCS con que: "Arrays of bits are not permitted" ahhh

Todo mi programa trabaja así...
int1 trama_power[]=
{1,1,0,1,0,1,0,0,1,0,0,0,0};
int1 trama_volup[]=
{1,0,1,0,0,1,0,0,1,0,0,0,0};
int1 trama_voldown[]=
{1,1,1,0,0,1,0,0,1,0,0,0,0};
int1 trama_chup[]=
{1,0,0,0,0,1,0,0,1,0,0,0,0};
int1 trama_chdown[]=
{1,1,0,0,0,1,0,0,1,0,0,0,0};
Pero bueno, lo volveré a hacer mañana.
-
Escrito originalmente por migsantiago
En software se puede hacer CASI lo que uno quiere... me acabo de llevar una súper descepción... hice todo un programa que me tomó unas horas y cuando doy compilar me sale el CCS con que: "Arrays of bits are not permitted" ahhh 
Todo mi programa trabaja así...
int1 trama_power[]=
{1,1,0,1,0,1,0,0,1,0,0,0,0};
int1 trama_volup[]=
{1,0,1,0,0,1,0,0,1,0,0,0,0};
int1 trama_voldown[]=
{1,1,1,0,0,1,0,0,1,0,0,0,0};
int1 trama_chup[]=
{1,0,0,0,0,1,0,0,1,0,0,0,0};
int1 trama_chdown[]=
{1,1,0,0,0,1,0,0,1,0,0,0,0};
Pero bueno, lo volveré a hacer mañana. 
Je, es que acabas de tocar un tema crucial... que tiene que ver con el mínimo dato que puede manejar un micro o una posición de memoria.
El inconveniente de los arrays de bits es como direccionarlos! Se complica y mucho. Osea si quieres el 9no bit, sería el 1er bit del 2do byte. Te imaginas una instrucción que haga eso? que sepa que bit tocar de un byte? automáticamente?
No la hay, entonces por eso te sacan corriendo con dicho array..
No sos al primero que se le ocurre, no te sientas mal, pero dejame decirte que no es algo simple eso de arrays de bits....
Conque "en software uno puede hacer lo que quiere" me referia a la convención de los numeros de punto flotante 
Saludos
-
Sí, me lo imaginaba, creía que C era adaptable hasta donde uno quisiera, pero ya vi que tiene uno que otro límite.
Para corregir mi error hice un int16 que contuviera los 13 bits de mi arreglo y todo funcionó O.K., de hecho el programa quedó mucho más pequeño.