Autor Tema: dudas con punteros  (Leído 6782 veces)

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

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: dudas con punteros
« Respuesta #15 en: 24 de Enero de 2010, 23:17:32 »
Osea que no puedo utilizar punteros a variables que están en la ROM en CCS, ouch! pequeño gran problema  :D

Nop. Al menos no que yo conozca. Obviamente podrias trabajarlo en ASM y esquivar las restricciones del CCS, aunque creo que hacer esa combinacion con el ya inestable CCS, no es recomendable...


Es buena la idea que das Bruno, pero se le dan muchas vueltas para algo tan sencillo.

:D Uno hace lo que puede, dentro de lo que el lenguaje le permite! Si tenes la posibilidad de hacerlo con C18 y te parece mejor, ni lo dudes! :D
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: dudas con punteros
« Respuesta #16 en: 24 de Enero de 2010, 23:23:26 »
Es buena la idea que das Bruno, pero se le dan muchas vueltas para algo tan sencillo.

:D Uno hace lo que puede, dentro de lo que el lenguaje le permite! Si tenes la posibilidad de hacerlo con C18 y te parece mejor, ni lo dudes! :D

 :D :D Muchas gracias Bruno!! Voy a ver que hago, siempre apunto a usar  CCS porque lo que se comparte le sirve a mas usuarios, C18 se usa poco.  :?


Saludos!

No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: dudas con punteros
« Respuesta #17 en: 12 de Agosto de 2010, 13:14:49 »
Tengo un problemita trabajando con punteros en C18  :? Defino, por ejemplo, el siguiente tipo de estructura:
Código: C
  1. typedef struct{
  2.     UINT8       OUTPUT;
  3.     float       OUTPUT_VALOR;
  4.     UINT8       STATUS;
  5. }OBJECTS_ANALOG_OUTPUT;

En una función creo un array de estructuras, cargo sus valores y la entrego por referencia a otra función declarada de la siguiente forma:
Código: C
  1. void vFuncion(....,OBJECTS_ANALOG_OUTPUT *ObjectsParameters);

El problema surge cuando intento, en esta última función, dividir la variable float en sus bytes:

Código: C
  1. LB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR);
  2. HB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR+1);
  3. UB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR+2);
  4. MB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR+3);

Pensé que era lo adecuando pero el compilador me dice:
Citar
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
:D :D

Y yo, ya me perdí!  :D

Saludos!




« Última modificación: 12 de Agosto de 2010, 13:16:58 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: dudas con punteros
« Respuesta #18 en: 12 de Agosto de 2010, 13:30:47 »
Hola Suky

Probá así... (jaja ahora soné como argentino  :D )

Código: [Seleccionar]
void vFuncion(....,OBJECTS_ANALOG_OUTPUT *ObjectsParameters, ...)
{
UINT8 byte3, byte2, byte1, byte0; //MSB a LSB
UINT8 *apuntador;

...

apuntador = (UINT8 *)&ObjectsParameters[k].OUTPUT_VALOR;
byte0=*(apuntador); //little endian
byte1=*(apuntador + 1);
byte2=*(apuntador + 2);
byte3=*(apuntador + 3);
}

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: dudas con punteros
« Respuesta #19 en: 12 de Agosto de 2010, 13:38:09 »
Naaa! No vale, creaste otra variable  :D Así ya lo había arreglado, pero no queria dar el brazo a torcer  :mrgreen:


Gracias Santiago!  ;-)
No contesto mensajes privados, las consultas en el foro

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: dudas con punteros
« Respuesta #20 en: 12 de Agosto de 2010, 13:51:32 »
Bueno, C internamente también creará otra variable para almacenar el apuntador temporal usando tu pseudo-código. Además, un apuntador en un PIC18 sólo emplea 2 bytes de RAM. ;)

En tu código veo dos problemas.

Código: [Seleccionar]
   1.
      LB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR);
   2.
      HB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR+1);
   3.
      UB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR+2);
   4.
      MB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR+3);

Al poner OUTPUT_VALOR+1 o OUTPUT_VALOR+2 no estás modificando la dirección RAM de OUTPUT_VALOR, estás modificando su valor Flotante.

Si luego haces un casting (UINT8 *) entonces estás copiando exactamente la misma dirección RAM de OUTPUT_VALOR pero en cada línea te dará un resultado diferente por lo que te comento arriba.

Suerte  :mrgreen:

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: dudas con punteros
« Respuesta #21 en: 12 de Agosto de 2010, 13:58:09 »
Bueno, C internamente también creará otra variable para almacenar el apuntador temporal usando tu pseudo-código. Además, un apuntador en un PIC18 sólo emplea 2 bytes de RAM. ;)


Es cierto  :? Entonces da lo mismo!  :oops:
En tu código veo dos problemas.
Código: [Seleccionar]
   1.
      LB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR);
   2.
      HB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR+1);
   3.
      UB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR+2);
   4.
      MB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR+3);

Al poner OUTPUT_VALOR+1 o OUTPUT_VALOR+2 no estás modificando la dirección RAM de OUTPUT_VALOR, estás modificando su valor Flotante.

Si luego haces un casting (UINT8 *) entonces estás copiando exactamente la misma dirección RAM de OUTPUT_VALOR pero en cada línea te dará un resultado diferente por lo que te comento arriba.

Nop! fíjate los parentesis  :mrgreen: Y acuérdate que es un puntero  ;-)

Saludos!

No contesto mensajes privados, las consultas en el foro

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: dudas con punteros
« Respuesta #22 en: 12 de Agosto de 2010, 14:06:42 »
Sí, sí, tenés razón ( :mrgreen: )

Entonces si quieres imaginar que estás ahorrándote una variable, corrijamos tu código...

Código: [Seleccionar]

      LB=*((UINT8*)&ObjectsParameters[k].OUTPUT_VALOR);

      HB=*( (UINT8*)&ObjectsParameters[k].OUTPUT_VALOR + 1);

      UB=*( (UINT8*)&ObjectsParameters[k].OUTPUT_VALOR + 2);

      MB=*( (UINT8*)&ObjectsParameters[k].OUTPUT_VALOR + 3);

Para la segunda línea, una interpretación sería:

- Extrae la dirección RAM de OUTPUT_VALOR.
- Interpreta la dirección RAM como un apuntador a un entero de 1 byte (casting).
- Le suma 1, pero como es apuntador entonces le suma el número de bytes que ocupa la variable. En este caso al ser un byte, pues la suma es dirección RAM + 1.
- El * pide que el contenido de la dirección RAM sea leído y asignado a HB.

Creo que sólo faltaban los ampersands.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: dudas con punteros
« Respuesta #23 en: 12 de Agosto de 2010, 14:16:03 »
Sí, sí, tenés razón ( :mrgreen: )

Entonces si quieres imaginar que estás ahorrándote una variable, corrijamos tu código...

Código: [Seleccionar]

      LB=*((UINT8*)&ObjectsParameters[k].OUTPUT_VALOR);

      HB=*( (UINT8*)&ObjectsParameters[k].OUTPUT_VALOR + 1);

      UB=*( (UINT8*)&ObjectsParameters[k].OUTPUT_VALOR + 2);

      MB=*( (UINT8*)&ObjectsParameters[k].OUTPUT_VALOR + 3);

Para la segunda línea, una interpretación sería:

- Extrae la dirección RAM de OUTPUT_VALOR.
- Interpreta la dirección RAM como un apuntador a un entero de 1 byte (casting).
- Le suma 1, pero como es apuntador entonces le suma el número de bytes que ocupa la variable. En este caso al ser un byte, pues la suma es dirección RAM + 1.
- El * pide que el contenido de la dirección RAM sea leído y asignado a HB.

Creo que sólo faltaban los ampersands.


 :-/  :-/ Exactamente, había creado otro proyecto más sencillo para poder hacer un debug  :mrgreen:

Código: C
  1. void vFuncion(OBJECTS_ANALOG_OUTPUT *Ptr){
  2. char LB, HB, UB, MB;
  3.  
  4.     LB=*((char *)&Ptr->OUTPUT_VALOR);
  5.     HB=*((char *)&Ptr->OUTPUT_VALOR+1);
  6.     UB=*((char *)&Ptr->OUTPUT_VALOR+2);
  7.     MB=*((char *)&Ptr->OUTPUT_VALOR+3);
  8.         Nop();
  9.  
  10. }


Así funciona! (Va el operador -> y no el ., eso lo indicó el compilador  :mrgreen: ) Estoy feliz, ahorro una variable en la RAM  :D :D :D Mejor me pongo a trabajar en algo en serio  :D

Gracias Mig  ;-)


Saludos!
« Última modificación: 12 de Agosto de 2010, 14:28:23 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: dudas con punteros
« Respuesta #24 en: 12 de Agosto de 2010, 21:14:03 »
Claro, cuando queres acceder a un elemento de una estructura apuntada se usa ->. Nunca entendi por q la complicaron asi jeje.
suerte!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein