Autor Tema: Nota sobre el "cast" en CCS y otras zarandajas  (Leído 3584 veces)

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

Conectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Nota sobre el "cast" en CCS y otras zarandajas
« en: 24 de Agosto de 2009, 18:14:07 »
Publico esta nota porque me ha pasado un caso simpático (cuando está solucionado) que ha estado a punto de terminar con mis nervios (durante el tiempo en que no ha estado solucionado)

El caso es que estaba haciendo un cálculo que implicaba una variable de 16 bits sumada y multiplicada a dos constantes que generaban un valor de 32 bits.

Utilizando la conocida técnica de "castear" la variable, esto es decirle al compilador cómo quiero que trate a una variable determinada, creí (erróneamente) que todo estaba solucionado.

Código: CSS
  1. int16 IdWide=256;
  2.    int32 pNext_EVENT_Location;
  3.  
  4.    pNext_EVENT_Location = (int32) (IdWide +  1) * 1024;

Evidentemente no es así. Este cálculo salía mal y aunque sospechaba que era el "cast" lo que me estaba jodiendo el cálculo no lograba dar con qué era exactamente. Puse todas las combinaciones del (int32) que se me ocurrieron hasta que logré que el cálculo saliese correctamente pero "casteando" a lo bestia. O sea absolutamente TODO:

Código: CSS
  1. int16 IdWide=256;
  2.    int32 pNext_EVENT_Location;
  3.  
  4.    pNext_EVENT_Location = (int32) (((int32)IdWide +  (int32)1) * (int32)1024);

Todo ello en CSS v.3.242 que es la que yo uso (normalmente).

Avisados quedáis.  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Nota sobre el "cast" en CCS y otras zarandajas
« Respuesta #1 en: 24 de Agosto de 2009, 19:07:48 »
Hola, creo que declarando a la constante 1024 por 1024UL lo solucionas.

Saludos !

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Nota sobre el "cast" en CCS y otras zarandajas
« Respuesta #2 en: 24 de Agosto de 2009, 19:26:10 »
RedPic en la ayuda de CCS indica como se debe hacer, osea como tu dices cast a lo bestia:

Cita de: Ayuda CCS
The result is then the same as the operands.  Each operator in an expression is evaluated independently.  For example:

i32 = i16 - (i8 + i8)

The + operator is 8 bit, the result is converted to 16 bit after the addition and the - is 16 bit, that result is converted to 32 bit and the assignment is done.  Note that if i8 is 200 and i16 is 400 then the result in i32 is 256.  (200 plus 200 is 144 with a 8 bit +)

Explicit conversion may be done at any point with (type) inserted before the expression to be converted.  For example in the above the perhaps desired effect may be achieved by doing:
 
i32 = i16 - ((long)i8 + i8)

In this case the first i8 is converted to 16 bit, then the add is a 16 bit add and the second i8 is forced to 16 bit.

Hay que indicar variable a variable de como quiere que sea tratada para que no ocurra el truncamiento de bits.

Para mi lo correcto seria:

Código: C
  1. pNext_EVENT_Location =(((int32) IdWide) +  1 )* 1024;

Hola, creo que declarando a la constante 1024 por 1024UL lo solucionas.

Saludos !

No entiendo a que te refieres?


Saludos!
« Última modificación: 24 de Agosto de 2009, 19:28:29 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Nota sobre el "cast" en CCS y otras zarandajas
« Respuesta #3 en: 24 de Agosto de 2009, 20:06:00 »
Hola, en esto el CCS se comporta como el ANSI, lo que decia es que no es necesario castear cada miembro, en el caso bastaria con castear la constante de esta manera:

Código: C
  1. pNext_EVENT_Location = ( IdWide ++ ) * 1024UL;

Por lo menos en ANSI debería funcionar.

Saludos !

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Nota sobre el "cast" en CCS y otras zarandajas
« Respuesta #4 en: 24 de Agosto de 2009, 20:28:17 »
Hola, en esto el CCS se comporta como el ANSI, lo que decia es que no es necesario castear cada miembro, en el caso bastaria con castear la constante de esta manera:

Código: C
  1. pNext_EVENT_Location = ( IdWide ++ ) * 1024UL;

Por lo menos en ANSI debería funcionar.

Saludos !

Richi, cuidado con ese ++ del lado derecho. La operación involucraría multiplicar IdWide por 1024, después se asigna el valor de Event_location y ya hasta el final se incrementaría el valor de IdWide en IdWide, cosa muy diferente a lo que Redpic busca.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Nota sobre el "cast" en CCS y otras zarandajas
« Respuesta #5 en: 24 de Agosto de 2009, 22:03:03 »
Hola Santiago, al colacar el parentesis forzas que el incremento se haga antes de la multplicación.

Saludos !

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Nota sobre el "cast" en CCS y otras zarandajas
« Respuesta #6 en: 24 de Agosto de 2009, 22:22:48 »
ermm... eso no es lo preocupante...  :mrgreen:

El problema es que la variable IdWide no debe cambiar su valor y si usas un ++ entonces al terminar la línea la variable ya valdrá uno más cuando no debe cambiar. El valor de IdWide es incrementado después de que pNext_EVENT_Location recibe su valor, nunca antes ya que usas el ++ a la derecha.

Si usas...

Código: [Seleccionar]
pNext_EVENT_Location = ( ++IdWide ) * 1024UL;
... el valor de IdWide sí será incrementado antes de la multiplicación, pero de todas formas no hay que cambiarlo, solo hay que leerlo.

Una pequeña explicación de i++ vs ++i...
http://www.todopic.com.ar/foros/index.php?topic=25785.msg211105#msg211105

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Nota sobre el "cast" en CCS y otras zarandajas
« Respuesta #7 en: 24 de Agosto de 2009, 22:44:19 »
Hola Santiago, si tenez razon no me habia dado cuenta, el valor de la variable se incrementa, sorry !

Saludos !

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Nota sobre el "cast" en CCS y otras zarandajas
« Respuesta #8 en: 25 de Agosto de 2009, 00:43:50 »
¿Y así no va?

Código: C
  1. pNext_EVENT_Location = (int32) (IdWide +  1UL) * 1024UL;

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Nota sobre el "cast" en CCS y otras zarandajas
« Respuesta #9 en: 25 de Agosto de 2009, 01:12:13 »
Yo estoy seguro que es así:  :mrgreen:

Código: C
  1. pNext_EVENT_Location =(((int32) IdWide) +  1 )* 1024;
No contesto mensajes privados, las consultas en el foro

Conectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Nota sobre el "cast" en CCS y otras zarandajas
« Respuesta #10 en: 25 de Agosto de 2009, 02:56:35 »
Gracias muchachos por vuestras respuestas, han sido muy clarificadoras, sobre todo la cita de la ayuda del CCS de Suki.

Como ahora ya me funciona voy a probar vuestras otras combinaciones para ver qué tal: el UL de Richi y el mono-cast de Suky  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Nota sobre el "cast" en CCS y otras zarandajas
« Respuesta #11 en: 25 de Agosto de 2009, 08:08:04 »
Es todo un problema esto del cast, ya me trajo muchas veces varios dolores de cabeza, por ej los defines son tambien constantes, de 32bits?

Apoyo a suky, me parece q esa es la forma

lo de la otra forma de cast "lu" al final, no lo sabia, se puede hacer con cualquier tipo de variable??

Saludos
.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Nota sobre el "cast" en CCS y otras zarandajas
« Respuesta #12 en: 25 de Agosto de 2009, 16:21:08 »
tiene que ver con la precedencia del operador, el paréntesis es el operador que tiene la mayor prioridad de todos los operadores. Como es díficil acordarse quien viene primero, si la suma o el or, yo siempre encierro entre paréntesis la línea que quiero que ejecute primero.

ej: (i+1)/((j+4)*4)

esto también se cumple para los statments en los condicionales y ciclos repetitivos.

para el casteo no tiene mayores dificultades, excepto para el punto flotante.

ejemplo:

(float)((a+25.0)*(b-c))

las constantes se deben escribir como flotantes

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

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Nota sobre el "cast" en CCS y otras zarandajas
« Respuesta #13 en: 25 de Agosto de 2009, 16:40:24 »
Basicamente este tipo de cosas se denominan "integral promotions" aca una nota que lo explica mejor

http://msdn.microsoft.com/en-us/library/fc9te331.aspx

Como moraleja con solo castear un miembro alcanza, yo lo hice al colocar el sufijo UL en la constante y Suky lo hizo con el otro miembro, las dos son totalmente válidas.

Saludos !


 

anything