Autor Tema: Nombres de variables en C  (Leído 4198 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado spike

  • PIC10
  • *
  • Mensajes: 9
Nombres de variables en C
« en: 21 de Febrero de 2008, 13:23:05 »
Hola a todos,

Estoy haciendo una cosa muy simple y muy fácil, tanto como sumar, pero si utilizo los nombres de las variables no funciona.
Tengo el siguiente código:

-------------------------------
#include <16f877.h>
float flo, flo2;
float numerador=1.0, denominador=1.0;

void main() {
flo=numerador+denominador;
flo2=1.0+1.0;
   #asm   // para ver directamente el contenido de las variables en memória:
               movf  flo,0 // contenido de flo
               movwf 0x0C
               movlw flo
               movwf 0x0D // dirección de flo en memória
               movf  flo2,0 // contenido de flo2
               movwf 0x1C
               movlw flo2
               movwf 0x1D // dirección de flo2 en memória
   #endasm
}
-------------------------------

Al simular esto, el resultado de flo2 es 80 00 00 00 (2 en el formato de los floats de CSS)  pero el resultado de flo es cero, ya sume, reste o divida.
Estoy pensando que es un problema del compilador, que no compila bien cuando son floats, porque haga lo que haga con variables floats, da cero. Esto lo miro directamente en memória con el codigo en ensamblador. ¿Alguien sabe porqué no funciona cuando utilizo los nombres de las variables?

Vosotros que compilador utilizais??
Yo uso el CCS C versión 4.014.

Conoceis alguna función que transforme de float a integer?

Saludos y gracias,

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Nombres de variables en C
« Respuesta #1 en: 21 de Febrero de 2008, 15:16:42 »
Raro, para mi es un bug del CCS...
Con Make8() puedes hacer que el valor de una float se represente en 4 bytes. :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Nombres de variables en C
« Respuesta #2 en: 21 de Febrero de 2008, 15:23:09 »
Un float típicamente ocupará 4 bytes no 2.  Debieras hacer lo que haces 4 veces por variable y no solo 2.

En cuanto a la función, en C es válido hacer también

int a;
float f;

a = f;

Te debiera tomar la parte entera nada más.
- 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 Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Nombres de variables en C
« Respuesta #3 en: 21 de Febrero de 2008, 16:47:24 »
Y esto de declarar las variables y asignarles valor a la vez nunca me pareció apropiado:

float numerador=1.0, denominador=1.0;

Lo primero, declarar todas las variables...y después les asignas lo que tengas que asignarles

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Nombres de variables en C
« Respuesta #4 en: 21 de Febrero de 2008, 18:13:04 »
Hola spike

trata de ver el valor de flo2 pero todo completo y si es posible en el mplab-sim, porque al mirar solo un registro de 8 bits, estaras viendo la parte truncada de su contenido. (como bien te dijeron que float son 4 bytes)

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Nombres de variables en C
« Respuesta #5 en: 21 de Febrero de 2008, 18:50:02 »
Hola

Como te comenta Modulay, asígnale valores a numerador y denominador dentro de main; y otra sugerencia, haz la suma con un casting.

Código: [Seleccionar]
#include <16f877.h>
float flo, flo2;
float numerador,denominador;

void main() {
numerador=1.0;
denominador=1.0;
flo=(float)numerador+denominador; //solo hacer el casting si asignando valores dentro del main no funciona
flo2=1.0+1.0;
   #asm   // para ver directamente el contenido de las variables en memória:
               movf  flo,0 // contenido de flo
               movwf 0x0C
               movlw flo
               movwf 0x0D // dirección de flo en memória
               movf  flo2,0 // contenido de flo2
               movwf 0x1C
               movlw flo2
               movwf 0x1D // dirección de flo2 en memória
   #endasm
}


Desconectado spike

  • PIC10
  • *
  • Mensajes: 9
Re: Nombres de variables en C
« Respuesta #6 en: 21 de Febrero de 2008, 19:08:24 »
Hola spike

trata de ver el valor de flo2 pero todo completo y si es posible en el mplab-sim, porque al mirar solo un registro de 8 bits, estaras viendo la parte truncada de su contenido. (como bien te dijeron que float son 4 bytes)



Si, en 0x1C guardo el contenido de uno de los 4 registros de 8 bits del float flo2, solo para ver rapidamente si ha calculado bien. Si quiero ver el numero entero voy a la dirección que señana 0x1D. Y lo mismo con flo.

Desconectado spike

  • PIC10
  • *
  • Mensajes: 9
Re: Nombres de variables en C
« Respuesta #7 en: 21 de Febrero de 2008, 19:15:45 »
Hola

Como te comenta Modulay, asígnale valores a numerador y denominador dentro de main; y otra sugerencia, haz la suma con un casting.


Pues he provado el casting de todas formas, como lo has puesto y con castings individuales a las variables, pero na de na... no se, vosotros qué compilador utilizais?

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Nombres de variables en C
« Respuesta #8 en: 21 de Febrero de 2008, 23:00:28 »
Yo uso CCS 3.245.

Compilé el programa y lo simulé en Proteus. Aquí la ventana del resultado:



El resultado de flo y de flo2 es 80 00 00 00, ambos se calculan bien. Los datos que mueves quedan así:

0x0c=80 que es el byte más significativo de flo
0x0d=20 que es la dirección del byte más significativo de flo

0x1c=80 que es el byte más significativo de flo2
0x1d=24 que es la dirección del byte más significativo de flo2

Ambas operaciones se hacen bien. La imagen las muestra, talvez está faltándote algo en tu simulación. Si quieres mándame tu hex (preferentemente el .cof) y veo si hace lo mismo, porque tu hex está hecho con un CCS nuevo.

« Última modificación: 21 de Febrero de 2008, 23:02:30 por migsantiago »

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Nombres de variables en C
« Respuesta #9 en: 22 de Febrero de 2008, 08:21:03 »
migsantiago el casteo de sumar 2 floats y asignarselo a otro float es totalmente innecesario.  El casteo es para cambiar el tipo de interpretación de un variable.  SI es flot y le dices que es float no cambia nada.

Algo que acabo de ver recién y no noté antes es lo siguiente:

1) Aún se sigue queriendo mostrar 2 bytes por cada float cuando un float tiene 4 (32 bits, 24 bits para mantisa y 8 para exponente)
2) El dump a memoria que hace ese código de assembler es guardar el contenido de flo a la posición 0x0C y 0x0D del micro, que son registros del micro! Osea... está muy mal hacer eso.
3) Si se quiere mostrar el contenido de un float byte a byte mi sugerencia es "castearlo" a char e imprimir byte a byte.  Guardarlo en un arreglo o donde se quiera pero no hacer eso que hizo spike porque con cada compilación pudiera ser que el compilador decida alojar las variables en otro lado y si le decimos que en vez de 0x0C sea 0x40, tal vez justo en esa compilación 0x40 esté ocupado.

Yo haría algo como lo siguiente :


unsigned char * ptr1, ptr2;
unsigned char i;
char mifloat[4];

ptr1 = (char *)&flo;
ptr2 = &mifloat[0];
i=4;
do {
    *ptr2 = *ptr1;
    ptr2++;
    ptr1++;
} while (--i);


Luego se puede entonces procesar mifloat y mostrar cada byte por separado.  Hay muchas formas de hacer lo mismo pero esta es la que primero se me ocurrió.
No puse el ++ al lado de la asignación del contenido de ptr2 y ptr1 para que el código sea más fácil de interpretar.

Saludos



- 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 MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Nombres de variables en C
« Respuesta #10 en: 22 de Febrero de 2008, 08:26:32 »
Correcto lo que dice Mauricio.
Lo que si se puede hacer es obligar al compilador a utilizar un determinado rango de memoria para alojar las variables float, de modo de conocer cual es el offset donde inicia esas variables, alli si que el compilador las va a ubicar siempre en el mismo lugar. :mrgreen:

Creo que la directiva es ROM, para obligarlo....
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado spike

  • PIC10
  • *
  • Mensajes: 9
Re: Nombres de variables en C
« Respuesta #11 en: 22 de Febrero de 2008, 08:52:58 »
Hola migsantiago,
Ahora no estoy en casa, asi que lo mirare esta tarde, pero me he fijado en una cosa:

En la imagen que nos has dejado, hay un recuadro (arriba a la derecha) que pone que la dirección de flo es 0x020 y la de flo2 es 0x024.
Pero en el cuadro de abajo, si miramos 0x1D (dirección flo2, en decimal 0029) es cero! y también deberia de conener 0x24.
Esta tarde lo mirare bien, porque ahora creo que va a ser que estoy mirando en una  dirección que no es.

-----

Sobre lo que dice maunix en el punto 1 tiene razón, mostramos 2 bytes de los 4 que hay, pero eso lo hago solo para ver de una forma rapida si ha calculado bien.

Lo de guardar el contenido en 0x0C si que esta mal, pero me aseguro de que no machaco el resultado viendo que la dirección de la variable esta en otro sitio, también es solo para ver rapidamente donde se guarda el resultado entero.

El dódigo que nos has dejado es muy interesante!! tamién lo provare esta tarde.

Saludos

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Nombres de variables en C
« Respuesta #12 en: 22 de Febrero de 2008, 10:33:43 »
En la imagen que nos has dejado, hay un recuadro (arriba a la derecha) que pone que la dirección de flo es 0x020 y la de flo2 es 0x024.
Pero en el cuadro de abajo, si miramos 0x1D (dirección flo2, en decimal 0029) es cero! y también deberia de conener 0x24.
Esta tarde lo mirare bien, porque ahora creo que va a ser que estoy mirando en una  dirección que no es.
Segun lo que yo leo no es que sea cero es que no está definida para el simulador, lo cual es muy diferente a que sea 0.


Sobre lo que dice maunix en el punto 1 tiene razón, mostramos 2 bytes de los 4 que hay, pero eso lo hago solo para ver de una forma rapida si ha calculado bien.

Tu forma rápida de verlo sobreescribes el registro 0x0C y 0x0D que corresponden al PIR1 y PIR2, si guardas lo mismo en otra variable no hay problemas.

En cuanto a hacer


movlw flo


Ahi solamente obtienes la dirección de memoria de inicio de donde está guardada flo.  Pero no verás el contenido de flo.

Si observas bien la pantalla de memoria ram, lo que yo veo es

flo está ubicado a partir de 0x20 y si ves la pantalla a partir de 0x20 tienes: 0x80 0x00 0x00 0x00

flo2 está ubicado a partir de 0x24 y si ves la pantalla a partir de 0x20 tienes: 0x80 0x00 0x00 0x00

Por lo cual flo y flo2 son ambas iguales.

Saludos
- 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 spike

  • PIC10
  • *
  • Mensajes: 9
Re: Nombres de variables en C
« Respuesta #13 en: 22 de Febrero de 2008, 16:06:19 »
Adjunto los ficheros .cof y .hex para ver si os da un buen resultado.
Podeis ver en la foto que a mi no.
Muchas gracias!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Nombres de variables en C
« Respuesta #14 en: 22 de Febrero de 2008, 23:59:00 »
Hola

Ejecuté el .hex (no pude con el .cof) y el resultado es el siguiente:



0x0c=00 mal
0x0d=00 mal

0x1c=80 que es el byte más significativo de flo2
0x1d=24 que es la dirección del byte más significativo de flo2

Tu compilador está haciendo algo raro, porque con mi hex si funcionó. Te voy a adjuntar mis hex y cof generados con CCS 3.245 para que los simules en tu compu y veas qué onda.

http://www.4shared.com/file/38656803/4052f842/spike_probandoc.html


 

anything