Autor Tema: Error Expecting a( por punteros  (Leído 2784 veces)

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

Desconectado daniel27r

  • PIC10
  • *
  • Mensajes: 5
Error Expecting a( por punteros
« en: 13 de Septiembre de 2010, 11:37:21 »
Buenas compañeros, estoy usando el compilador PCW v 4.088 y tengo un error a la hora de definir un puntero. Vi el tutorial C-18 que posteó Suky y verifiqué que hasta donde pude ver lo estoy definiendo bien... Les agradecería mucho su ayuda porque la verdad no tengo idea de como seguir... Mi código es el siguiente:

Código: C
  1. #include <16F877A.h>                ///   libreria para el manejo del pic16f877a
  2. //#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT
  3.  
  4. #use delay(clock=4000000) //4MHz
  5. #byte port_a=0X05
  6. #byte port_b=0X06
  7. #byte port_c=0X07
  8. #byte port_d=0X08
  9. #byte port_e=0X09
  10. //#org 0x1F00, 0x1FFF {}
  11.  
  12.  
  13. #include <lcd_mod.c>  // Librería para el manejo del lcd para ver las conexiones
  14.                   // abran el archivo C:\Archivos de programa\PICC\Drivers\lcd.c
  15.                   // y ahi les muestra.
  16.  
  17. // As defined in the following structure the pin connection is as follows:
  18. //     D0  unusued
  19. //     D1  rw
  20. //     D2  rs
  21. //     D3  enable
  22. //     D5  D5
  23. //     D6  D6
  24. //     D7  D7
  25. //
  26. //   LCD pins D0-D3 are not used and PIC D3 is not used.
  27.  
  28. //#define use_portc_lcd TRUE
  29. char num1;
  30. char *pnum;
  31.  
  32. pnum = &num1;
  33.  
  34. void data_av(port_e){ // Espere a que se presione una tecla
  35. while(port_e!=4){}
  36. //return
  37. }
  38.  
  39. void main()
  40. {
  41. set_tris_a(0xFF);
  42. set_tris_b(0x0);
  43. set_tris_c(0xFF);
  44. set_tris_d(0x0);
  45. set_tris_e(0x4);
  46. port_e=0;
  47. port_b=0;
  48.  
  49.  
  50. comparar:
  51. switch(port_c){
  52.  
  53. case 0:
  54. pnum++;
  55. port_b=1;
  56. *pnum=1;
  57. data_av(4);
  58. break;
  59.  
  60. case 1:
  61. pnum++;
  62. port_b=2;
  63. *pnum=2;
  64. data_av(4);
  65. break;
  66.  
  67. case 2:
  68. pnum++;
  69. port_b=3;
  70. *pnum=3;
  71. data_av(4);
  72. break;
  73.  
  74. case 14:       // caso ENTER
  75. pnum = &num1;
  76. pnum++;
  77. if(*pnum==1)
  78.    pnum++;
  79. else
  80. pnum = &num1;
  81.       if(*pnum==2)
  82.          if(*pnum==3)
  83.          else
  84.          pnum = &num1;
  85.       else
  86.       pnum = &num1;
  87. break;
  88.  
  89. default:
  90. break;
  91. }
  92.  
  93. }   // fin de programa

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Error Expecting a( por punteros
« Respuesta #1 en: 13 de Septiembre de 2010, 11:58:07 »
Si quieres asignarle el valor al definirlo puede ser así:

Código: C
  1. char num1;
  2. char *pnum=&num1;


Y acostumbra a usar el par {} para definir el alcance de la estructura de control, es más sencillo entender el código  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado daniel27r

  • PIC10
  • *
  • Mensajes: 5
Re: Error Expecting a( por punteros
« Respuesta #2 en: 13 de Septiembre de 2010, 12:42:21 »
Muchas gracias Suky!!!    :) Y por la respuesta tan rápida, que foro mas eficiente, te lo agradezco! Una pregunta, ya que estamos en esto para mejorar mi sintaxis, en qué parte del código debería poner las llaves {} para que se entienda mejor el código? Es que no sé a que te refieres por estructura de control en mi código

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Error Expecting a( por punteros
« Respuesta #3 en: 13 de Septiembre de 2010, 12:56:12 »
Muchas gracias Suky!!!    :) Y por la respuesta tan rápida, que foro mas eficiente, te lo agradezco! Una pregunta, ya que estamos en esto para mejorar mi sintaxis, en qué parte del código debería poner las llaves {} para que se entienda mejor el código? Es que no sé a que te refieres por estructura de control en mi código

jejeje! A Gregory hay que serle eficiente  :mrgreen:  :D

Respecto a {}, en los if/else anidados  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado daniel27r

  • PIC10
  • *
  • Mensajes: 5
Re: Error Expecting a( por punteros
« Respuesta #4 en: 14 de Septiembre de 2010, 02:22:31 »
Jajaja entendido y anotado! Que bueno ver fanáticos de House por aquí tmb  :P

Un saludo compañero!

Desconectado daniel27r

  • PIC10
  • *
  • Mensajes: 5
Los punteros se pierden
« Respuesta #5 en: 15 de Septiembre de 2010, 12:36:56 »
Se me complicó más el asunto así que mejor les explico desde el principio... Yo quiero hacer una cerradura electrónica, lo estoy simulando en ISIS de Proteus 7.4 y programando con el PCW 4.088. La idea es que si el usuario llegara a presionar el código correcto que yo defino como "123", el LCD desplegara el mensaje "CORRECTO" para confirmar. Suceden 2 problemas:

1) Cuando presiono el número 1 y luego otro número, el que sea, el programa se me devuelve a main, desplegando el mensaje "HOLA MUNDO", cosa que no debería pasar porque según el programa se debería ir a la etiqueta "comparar". Esto no sucede si presiono cualquier otro número primero. Por ejemplo, si digito en el teclado 213, el flujo del programa es el correcto.

2) Y mas importante... Aún si cambio el código correcto a 213 por ejemplo para no tener el problema anterior, no me reconoce que estoy digitando el código correcto, creo que tengo un problema con los IFs anidados.

El programa revisa el código digitado cuando presiono la tecla "=" del teclado en el Proteus, que yo llamo ENTER. Es ahí cuando se inicializa el puntero, se compara si el número digitado es igual al número que debería digitar, si es así, se incrementa el puntero y compara de nuevo hasta que todas las comparaciones sean correctas y se despliegue "CORRECTO" en el LCD.

Les escribo el código aquí y les adjunto el archivo del ISIS para que puedan simular el programa, junto con el "lcd_mod.c" que uso para manejar el LCD en vez del lcd.c



Aquí les va el código para que lo chequeen, igual está en el archivo Cerradura simple.c que les adjunté en el link:

Código: C
  1. #include <16F877A.h>                ///   libreria para el manejo del pic16f877a
  2. //#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT
  3. //ERROR SOLUCIONADO: *pnum=1; antes de break; en case 0 ocasiona que se devuelva
  4. //a HOLA MUNDO, hay que poner esa linea al principio de case 0
  5. #use delay(clock=4000000) //4MHz
  6. #byte port_a=0X05
  7. #byte port_b=0X06
  8. #byte port_c=0X07
  9. #byte port_d=0X08
  10. #byte port_e=0X09
  11. #org 0x1F00, 0x1FFF {}//para proteger el código
  12.  
  13.  
  14. #include <lcd_mod.c>  // Librería para el manejo del lcd para ver las conexiones
  15.                   // abran el archivo C:\Archivos de programa\PICC\Drivers\lcd.c
  16.                   // y ahi les muestra.
  17.  
  18. // As defined in the following structure the pin connection is as follows:
  19. //     D0  unusued
  20. //     D1  rw
  21. //     D2  rs
  22. //     D3  enable
  23. //     D5  D5
  24. //     D6  D6
  25. //     D7  D7
  26. //
  27. //   LCD pins D0-D3 are not used and PIC D3 is not used.
  28.  
  29. //#define use_portc_lcd TRUE
  30. int num1=0;          //tiene la direccion del dato de la tecla presionada
  31. int *pnum=&num1;    //puntero que direcciona donde apunta num1
  32. int x=0;          //corre el cursor del lcd con cada numero
  33.  
  34.  
  35. void data_av(){
  36. while(port_e=4){}    // Espere a que se termine de presionar la tecla
  37. while(port_e!=4){}   // Espere a que se presione una tecla
  38. return;
  39. }
  40.  
  41. void main(){
  42.  
  43. set_tris_a(0xFF);
  44. set_tris_b(0x0);
  45. set_tris_c(0xFF);
  46. set_tris_d(0x0);
  47. set_tris_e(0x4);
  48. port_e=0;
  49. port_b=0;
  50. x=0;              //inicializa posicion del cursor del lcd
  51.  
  52. lcd_init();  // Antes de usar el lcd,hay que inicializarlo
  53. lcd_putc(" HOLA MUNDO");
  54. delay_ms(1000);
  55. lcd_putc("\f"); //Borra el mensaje anterior
  56.      
  57.      
  58.       comparar:
  59.       data_av();
  60.       switch(port_c){
  61.      
  62.             case 0:{
  63.  //           *pnum=1;          
  64.             x++;              //correr cursor
  65.             pnum++;           //apunto a siguiente direccion
  66.             port_b=1;         //confirmar que numero se presiona
  67.             lcd_putc("1");
  68.             *pnum=1;
  69.             break;
  70.             }
  71.            
  72.            
  73.             case 1:{
  74.             x++;
  75.             pnum++;
  76.             port_b=2;
  77.             lcd_putc("2");
  78.             *pnum=2;
  79.             break;
  80.             }
  81.            
  82.             case 2:{
  83.             pnum++;
  84.             port_b=3;
  85.             lcd_putc("3");
  86.             *pnum=3;
  87.             break;
  88.             }
  89.            
  90.             case 4:{
  91.             pnum++;
  92.             port_b=4;
  93.             lcd_putc("4");
  94.             *pnum=4;
  95.             break;
  96.             }
  97.            
  98.             case 14:{       // caso ENTER
  99.             pnum = &num1;
  100.             pnum++;
  101.                if(*pnum==1){
  102.                pnum++;
  103.                      if(*pnum==2){
  104.                      pnum++;
  105.                               if(*pnum==3){  //Si se presiono el codigo
  106.                               port_b=255;    //123, prenda todo el port_b
  107.                               lcd_putc("\f");
  108.                               lcd_putc("CORRECTO");
  109.                               delay_ms(2000);
  110.                               lcd_putc("\f");
  111.                               port_b=0;
  112.                               break;
  113.                               }
  114.                                  else{
  115.                                  pnum=&num1;
  116.                                  }
  117.                         }
  118.                      else{
  119.                      pnum=&num1;
  120.                      }
  121.                }
  122.            
  123.                else{
  124.                pnum=&num1;
  125.                }
  126.             break;
  127.             }
  128.            
  129.             default:
  130.             port_b=0;
  131.             break;
  132.             }
  133.       port_e=0;
  134.       goto comparar;
  135.  
  136. }   // fin de programa

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Error Expecting a( por punteros
« Respuesta #6 en: 15 de Septiembre de 2010, 13:01:26 »
Que estas intentando hacer con el puntero? porque veo que apunta a una sola variable, pero haces ptr++, lo que pasaría a apuntar la siguiente dirección, y que no sabes que variable es  :?

Si quieres guardar el código presionado, deberías crear un buffer, char Teclas[5], y con el puntero comenzar apuntando al primer elemento, Ptr=&Teclas[0].

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado daniel27r

  • PIC10
  • *
  • Mensajes: 5
Re: Error Expecting a( por punteros
« Respuesta #7 en: 15 de Septiembre de 2010, 13:39:42 »
Demasiadas Gracias!!! En serio, ya me salió completamente! Si es que vieras que yo no estaba acostumbrado a trabajar en C con el PIC, solo en Ensamblador, y como ocupaba direccionamiento indirecto entonces pensé en usar los punteros, pero tienes razón, era un error de concepto mio, lo que debía usar desde el principio era un buffer! Jejeje


 

anything