Autor Tema: (SOLUCIONADO)Problemas con punteros  (Leído 3217 veces)

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
(SOLUCIONADO)Problemas con punteros
« en: 02 de Junio de 2019, 12:42:03 »
Bueno voy a ser claro... estoy usando XC8 para crear un algoritmo para una persona aca en el foro, para "ayudarlo/a", como era muy simple decidi hacerlo. Peeeeroo ocurrio el problema y no le encuentro la solucion o el motivo....

Debido a que para probar otro codigo seleccione un PIC16 y uso el simulador para jugar un rato... el codigo en cuestion es este:

Código: C
  1. #include <xc.h>
  2. #include <stdint.h>
  3. #include <string.h>
  4. #define _XTAL_FREQ 4000000
  5.  
  6. struct myRxStruct
  7. {
  8.         uint8_t indexStr;
  9.         const char  *ptrCheck;
  10.         uint8_t flags;
  11. };
  12.  
  13. struct myRxStruct myRxStruct = {0,0,0};
  14.  
  15. const char *txtComp[]={
  16.     "hola",
  17.     "tiempo"
  18. };
  19.  
  20.  
  21. void test(char a)
  22. {
  23.         char recv;
  24.         recv = a;
  25.         if(!myRxStruct.indexStr)
  26.         {
  27.           // Recien comienzo? Veo si alguno de los string comienza con la letra que quiero
  28.           uint8_t i = 0;
  29.       for(i=0 ;i < (sizeof txtComp / sizeof (txtComp[0]));i++){
  30.         if(*txtComp[i] == recv) {
  31.           // Solo tengo en cuenta cuando tengo alguna coincidencia
  32.           myRxStruct.indexStr = i;
  33.           myRxStruct.indexStr++;
  34.           myRxStruct.ptrCheck = txtComp[i];
  35.           myRxStruct.ptrCheck++;
  36.           break;
  37.         }
  38.       }
  39.         } else {
  40.           // Continuo con las demas letras
  41.           if(recv == *myRxStruct.ptrCheck){
  42.                 // Aca coinciden
  43.                 myRxStruct.ptrCheck++;
  44.                 // Termino el string?
  45.                 if(!*myRxStruct.ptrCheck)
  46.                 {
  47.                         myRxStruct.flags |= myRxStruct.indexStr;
  48.                         myRxStruct.indexStr = 0;
  49.                 }
  50.           } else {
  51.                 // Aca no coincide
  52.                 myRxStruct.indexStr = 0;
  53.           }
  54.         }
  55. }
  56. void main(void){
  57.  
  58.     char text[]= "hola";
  59.     while(1)
  60.     {
  61.         uint8_t j;
  62.         for(j=0;j<sizeof text;j++)
  63.             test(text[j]);
  64.     }
  65. }

El codigo es para una recepcion de UART, supongo nomas que los nombres de los comandos van a comenzar con todas letras distintas para facilitarme la vida. Creo una estructura para mantener todo lo referente a la recepcion ahi dentro.
El codigo deberia verificar la primer letra de una lista de strings. Si hay coincidencia, me copia el puntero a esa string para seguir comparando. Guarda el indice para saber que flag se activo. Y utilizo el indice para saber si recien comienzo o no.
El problema esta ahi... en copiar el puntero... Y me explico mejor con una imagen

 

* ptr.jpg
(29.8 kB, 1293x111 - visto 409 veces)


Si observan en la imagen. Dice que txtComp[0] con direccion en 0x1C y contenido 0x08. El cual 0x08 deberia ser el puntero a la letra 'h' PERO NO ES ASI, si observan el valor del puntero *txtComp[0] al cual puedo acceder es la direccion 0x0E !

Por ende cuando asigno mi valor a mi nuevo puntero obtengo 0x08 lo cual esta MAL.
« Última modificación: 02 de Junio de 2019, 16:35:44 por KILLERJC »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problemas con punteros
« Respuesta #1 en: 02 de Junio de 2019, 12:45:34 »
Parece un bug del compilador... No se como fabricara las direcciones, en un PIC18 funciona correctamente:

 

* ptr18.jpg
(30.84 kB, 1202x113 - visto 402 veces)


No tengo una version actualizada del XC (v1.43 actual v2.05), espero que en versiones posteriores, se arregle lo comentado... Voy a tratar de actualizarlo y ver si funciona.
« Última modificación: 02 de Junio de 2019, 12:49:14 por KILLERJC »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problemas con punteros
« Respuesta #2 en: 02 de Junio de 2019, 14:50:29 »
Acabo de actualizar el compilador. El codigo no funciona para los PIC16 que no pueden acceder a la flash por el FSR como el 16F84A, probe con alguno mas nuevo como el 16F1619 y funciona correctamente, Aunque el IDE te dice que no se puede acceder ya que la direccion que carga es de 0x8801 y la direccion en flash de 0x801, pero funciona.

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Problemas con punteros
« Respuesta #3 en: 02 de Junio de 2019, 15:35:20 »

Código: [Seleccionar]
for(i=0 ;i < (sizeof txtComp / sizeof (const char *));i++)
En el 18F2550    sizeof (const char *)  es 3 , como txtComp tiene 2 elementos ==> (sizeof txtComp/sizeof(const char *) es 0 ==> Nunca se ejecuta nada dentro del for.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problemas con punteros
« Respuesta #4 en: 02 de Junio de 2019, 15:51:22 »
El problema no era ese por el que preguntaba pero si, hay un error... acabo de modificar el código, tenia un error ahí, que tenia que cambiar el const char * por txtComp[0], con esos cambios me da correcto, pero aun asi ni siquiera el primero funcionaba, es decir entraba dentro del for pero ahi llegaba.

Para el caso especifico de un PIC18F4550, con el compilador XC v2.05, tengo que sizeof de txtComp es de 4, y sizeof de txtComp[0] es 2, por lo tanto me da 2..
Para 3 elementos, sizeof txtComp 6, por lo que al dividirlo me da 3
Para 4 elementos, sizeof txtComp 8, por lo que al dividirlo me da 4
Para 5 elementos, sizeof txtComp 10, por lo que al dividirlo me da 5

Código: C
  1. (sizeof txtComp / sizeof (txtComp[0]))
Observa que el sizeof de txtComp me da el tamaño total, al dividirlo por cada uno de los elementos, se cuanto elementos tengo.


El problema esta entre la silla y el teclado. Funciona correctamente....
Yo miraba el las variables y era obvio que nunca iban a coincidir.


El 0x08 que muestra es en realidad el indice de la tabla. No la direccion. El compilador genera correctamente el codigo llamando a la tabla.
« Última modificación: 02 de Junio de 2019, 16:34:35 por KILLERJC »

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Problemas con punteros
« Respuesta #5 en: 02 de Junio de 2019, 16:22:25 »
...
Código: C
  1. (sizeof txtComp / sizeof (const char *))
me devuelve 1 con los 2 elementos. Por lo tanto necesito que sea <=.
Si agrego un texto mas al array txtComp, obtengo el valor 2, lo cual es correcto.
...

 :shock:  Ahora me intriga por qué me da diferente.

Yo copypastié tu código, lo compilé y al debuggear veo que elimina el for.

Le inserté tres instrucciones nada mas que para comprobar los valores que tomaban los sizeof
Código: [Seleccionar]
        volatile uint8_t szcchar   = sizeof (const char *) ;
        volatile uint8_t sztxtComp = sizeof txtComp  ;
        volatile uint8_t ilimit = sztxtComp/szcchar ;

y lo que asigna a cada variable es  3,2, y 0 respectivamente.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problemas con punteros
« Respuesta #6 en: 02 de Junio de 2019, 16:35:30 »
Ahi te respondi.... perdon por editar varias veces... el tema estaria solucionado.. el compilador se maneja medio raro y no podes guiarte con el visor de variables...

Ese fue mi error.

Tambien hubo un par de cosas para evitar los warning que me salian...

Código: C
  1. myRxStruct.indexStr = i;
  2.           myRxStruct.indexStr++;
  3.           myRxStruct.ptrCheck = txtComp[i];
  4.           myRxStruct.ptrCheck++;

Si juntaba las 2 primeras haciendo i + 1 , me decia que estaba intentando meter un entero con signo en un unsigned.....
Y tambien me tiraba warning o un error si hacia &txtComp[1]. Ya ni recuerdo con lo que probe.
« Última modificación: 02 de Junio de 2019, 16:38:47 por KILLERJC »

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Problemas con punteros
« Respuesta #7 en: 02 de Junio de 2019, 17:31:41 »
Ahi te respondi.... perdon por editar varias veces... el tema estaria solucionado.. el compilador se maneja medio raro y no podes guiarte con el visor de variables...
...

No usé el visor de variables, lo ejecuto en el Proteus y ahi veo lo que va haciendo.

La verdad es que estas cosas refuerzan mi rechazo por XC8   :lol:

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:(SOLUCIONADO)Problemas con punteros
« Respuesta #8 en: 02 de Junio de 2019, 18:39:55 »
En realidad por la limitacion en hardware, es que se separa del comportamiento del C "estandar". El IDE esta preparado para eso .. para un C correcto... Es ahi donde radica el error.
Y el visor de variables da la informacion correcta.

Es el compilador quien debe hacer magia para utilizar lo que poseen los PICs. A medida que van avanzando los PICs eso se va solucionando...