Autor Tema: Problema de punteros (posible bug) con el compilador XC8 (SOLUCIONADO)  (Leído 1595 veces)

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

Desconectado RodrigoAndres

  • PIC16
  • ***
  • Mensajes: 171
ola a todos, lo que pasa es que quiero acceder directamente a los bytes de un unsigned int por medio del siguiente codigo:


Código: [Seleccionar]
unsigned int spendticks= 0;

spendticks= TMR1L;                 //escribo la parte baja
*(&spendticks + 1) = TMR1H;   //escrivo la parte alta accediendo a la siguiente pocision de memoria

para la parte baja si funciona, pero para la parte alta no. lo que sucede es que si la variable tiempo esta en la pocision de memoria 0x017, cuando hago *(&tiempo + 1) apunta a la direccion 0x019, no a la 0x018 como yo quiero que aga. imagino que el problema es que el compilador se salta la direccion 0x018 porque pertenece a la variable tiempo y cree que yo no quiero acceder hay, pero en realidad si quiero hacerlo, entonces como le hago?

observen el problema:



saludos y gracias por los consejos.
« Última modificación: 20 de Enero de 2016, 22:04:24 por RodrigoAndres »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema de punteros (posible bug) con el compilador XC8
« Respuesta #1 en: 20 de Enero de 2016, 20:30:49 »
No se si es un error, tal ves el compilador suponga que el puntero es de un int, por lo tanto hace lo que debe, es decir si el puntero es un int, al sumarle uno salta 2 posiciones de memoria.
Creo que es lo unico que puede llegar a ser.

trataste con algo asi?

Código: C
  1. (short int*)(&spendticks + 1) = TMR1H;

No se si es correcto pero es lo unico que se me ocurre, igual para lo que pedis es lo mismo ahcer

Código: C
  1. spendticks = (TMR1H <<8) + TMR1L;

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re:Problema de punteros (posible bug) con el compilador XC8
« Respuesta #2 en: 20 de Enero de 2016, 20:45:30 »
Para que funcione con punteros este es el codigo que alguna vez me enseñaron:

Código: [Seleccionar]
(*((unsigned char*)&spendticks + 1))= TMR1H;
Lo que hace, si no me equivoco es:

Definir un puntero para bytes
Código: [Seleccionar]
(unsigned char*)
Apuntar el puntero definido a la direccion deseada 
Código: [Seleccionar]
((unsigned char*)&spendticks + 1)Modificar el valor de esa posicion de memoria 
Código: [Seleccionar]
(*((unsigned char*)&spendticks + 1))
La clave son los parentesis, de adentro hacia afuera.

Esta forma de hacerlo creaba codigo bastante eficiente, creo que el segundo codigo que posteo KILLERJC tambien es eficiente. cuestion de probar
« Última modificación: 20 de Enero de 2016, 20:50:40 por sander »
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado RodrigoAndres

  • PIC16
  • ***
  • Mensajes: 171
Re:Problema de punteros (posible bug) con el compilador XC8
« Respuesta #3 en: 20 de Enero de 2016, 20:50:47 »
muchas gracias por los consejos.

hice lo del short por que me parecio muy buena idea:
Citar
(short int*)(&spendticks + 1) = TMR1H;
pero no se porque da el error "error: (202) only lvalues can be assigned to or modified"

la rason por la que no he usado:
Citar
spendticks = (TMR1H <<8) + TMR1L;
es porque genera demasiado codigo y el problema es que en estas lecturas cada microsegundo es importante:



lo que se me ocurrio es hacer lo siguiente y funciona muy bien porque solo gasta dos lineas de codigo, pero la verdad desde hace dos meses que no me gusta poner lenguaje asembler porque me hace sentir muy nerdo, por eso estaba preguntado como hacerlo de la otra manera.

Código: [Seleccionar]
asm("MOVFF TMR1L, main@spendticks");
asm("MOVFF TMR1H, main@spendticks+1");

saludos y gracias por la ayuda.


ACTUALIZACION:

gracias por el consejo sander, (*((unsigned char*)&spendticks + 1))  funciono bien, la verdad yo nunca estudie y no sabia como poner eso, gracias por orientarme.

gracias a todos por ayudarme a solucionar este problema

Desconectado RodrigoAndres

  • PIC16
  • ***
  • Mensajes: 171
Re:Problema de punteros (posible bug) con el compilador XC8
« Respuesta #4 en: 20 de Enero de 2016, 21:19:33 »
y asi quedaria en forma de funcion definida, como una forma rapida de leer el timer1 (al menos mucho mas rapida que la funcion ReadTimer1() del XC8)

#define get_timer1(puntero) (*((unsigned char*)puntero)) = TMR1L; (*((unsigned char*)puntero+ 1)) = TMR1H;


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema de punteros (posible bug) con el compilador XC8
« Respuesta #5 en: 20 de Enero de 2016, 21:32:41 »
Buena al menos funciono, era por ahi el tema. Por mas que uno use el & y crea que solo involucra la direccion, en realidad involucra ambas cosas, direccion y tipo, y toda aritmetica con punteros termina afectando el tipo de dato. Fue por eso nomas :P

El por que del error que dio mi codigo, es por que esto

(&spendticks + 1)

No esta en un lugar exacto sino que debe "calcularse", distinto del codigo de sander que el mismo compilador define la posicion. Como lo mio debe "calcularse" entonces no puede estar a la izquierda, es decir no puede ser un lvalue.

Por que lo tomara de esa forma ... no se, pero se que mi codigo estaba mal, ya que al hacer (&spendticks + 1) , ya estaba apuntando mal