Autor Tema: Posible sintaxis  (Leído 1421 veces)

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

Desconectado rfjhh

  • PIC10
  • *
  • Mensajes: 14
Posible sintaxis
« en: 08 de Febrero de 2016, 14:52:36 »
Tengo el siguiente programa y me marca dos errores:
Error 45 Line 45(12,13): Subscript out of range
Error 45 Line 46(12,13): Subscript out of range

#include<16f887.h>
#use delay(clock = 4MHz)
#use standard_io(D)
#fuses INTRC, NOWDT, NOBROWNOUT, NOLVP
#include<LCD.c>
#define use_portd_lcd TRUE

void despliega(char sec, char dyr)
{
   lcd_gotoxy(2, 1);
   printf(lcd_putc, "%s", sec);
   lcd_gotoxy(2, 9);
   printf(lcd_putc, "%s" dyr);
}

void main()
{
   int8 vel, vela = 0, n_pas, n_pasa = 0, paso;
   int16 t_int;
   char secu[8], dire[4];
   float t;
   setup_adc(ADC_CLOCK_INTERNAL);
   SETUP_ADC_PORTS(sAN0|sAN1);
   lcd_init();
   lcd_gotoxy(1, 1);
   printf(lcd_putc, "Pasos");
   for(;;)
   {
      set_adc_channel(0);
      vel = READ_ADC();
      set_adc_channel(1);
      n_pas = READ_ADC();
      if((n_pas != n_pasa) || (vel != vela))
      {
         n_pasa = n_pas;
         vela = vel;
         t = 1.0-(1.57086614*(vel - 255.0));
         t_int = t;            // Parte entera de t
                 
      }
      paso = input_c() & 0x3f;
      switch(paso)
      {
         case 1:
         secu[8] = "Simple";
         dire[4] = "Der";

         despliega(secu, dire);
         //rut(0,
      }
   }
}
 
Me podrían orientar porfa???


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Posible sintaxis
« Respuesta #1 en: 08 de Febrero de 2016, 15:04:13 »
Si... no podes hacer eso.. En realidad varias cosas no podes hacer.

En caso que los string sean fijos:

Lo que podes hacer es crear string antes (al comienzo) y usarlos.

Código: C
  1. const char Derecha[8] = "derecha";
  2. const char Izquierda[10] = "izquierda";

Observa que el indice es 1 lugar mas que la cantidad de letras, esto es por que ademas al final se pone el caracter nulo '\0'

Y de ahi llamar a :
Código: C
  1. despliega(Derecha,Izquierda);

Pero despliega tambien posee un error. Lo que estas pasando es una referencia ( puntero ) al array. Entonces deberia ser asi:

Código: C
  1. void despliega(char *sec, char *dyr)
  2. {
  3.    lcd_gotoxy(2, 1);
  4.    printf(lcd_putc, "%s", sec);
  5.    lcd_gotoxy(2, 9);
  6.    printf(lcd_putc, "%s" dyr);
  7. }

Eso en el caso de que los string sean "dinamicos":

Crear un buffer tal que pueda tener las palabras que vamos a usar:

Código: C
  1. char buff1[15];   // 14 caracteres
  2. char buff2[15];   // 14 caracteres

usar sprintf:

Código: C
  1. sprintf(buff1,"derecha");

Código: C
  1. i=8;
  2. sprintf(buff1,"Derecha: %d",i);  // Quedaria "Derecha: 8"

Finalmente llamar a despliega, pero arreglando el problema que tenes ( que le arregle antes)

------------------------------------------

Pone un delay de unos 2 ms despues de cada set_adc_channel().

------------------------------------------

 if((n_pas != n_pasa) || (vel != vela))

La comparacion es EXACTA, en un ADC de 10 bits, es muy complejo que sea exacta la comparacion, ademas casi siempre el ultimo bit varia por el ruido. Quedando un par de opciones.

O comparas en un rango, 30 mas y 30 menos por ejemplo. o podes achicar esa comparacion si ademas promedias los resultados del ADC. Es decir tomar varias muestras sumarlas y dividirlas para que sea un numero mas estable ( si hace esto intenta que sean multiplo de 2, 8,16,32,64). Y tampoco te olvides que vas a necesitar una variable que pueda tener toda esa cantidad de datos.

------------------------------------------

Defini un default: para el switch, para cuando ningun caso sea el correcto. Y por lo que veo:

paso = input_c() & 0x3f;

Tendrias 64 opciones ahi.. Ya que tenes 6 bits.
« Última modificación: 08 de Febrero de 2016, 15:09:56 por KILLERJC »

Desconectado rfjhh

  • PIC10
  • *
  • Mensajes: 14
Re:Posible sintaxis
« Respuesta #2 en: 08 de Febrero de 2016, 22:32:39 »
Gracias por tus sugerencias.
Solo cambié:
char secu[8], dire[4]
por:
char secu[10], dire[10]
y funcionó!!!!!!!! :-/
 

Desconectado rfjhh

  • PIC10
  • *
  • Mensajes: 14
Re:Posible sintaxis
« Respuesta #3 en: 08 de Febrero de 2016, 22:43:28 »
Ya no me marcó error, pero no despliega lo que quiero. Completé el Switch:
#include<16f887.h>
#use delay(clock = 4MHz)
#use standard_io(D)
#fuses INTRC, NOWDT, NOBROWNOUT, NOLVP
#include<LCD.c>
#define use_portd_lcd TRUE

void despliega(char sec, char dyr)
{
   lcd_gotoxy(2, 1);
   printf(lcd_putc, "%s", sec);
   lcd_gotoxy(2, 9);
   printf(lcd_putc, "%s" dyr);
}

void rut(int8 dyr, char vector[], int8 h, int8 n_pas, int16 t)
{
}

void main()
{
   int8 vel, vela = 0, n_pas, n_pasa = 0, paso;
   int16 t_int;
   char secu[10], dire[10];
   float t;
   char upc[4]={1, 2 ,4 , 8};
   char upm[8]={1, 3, 2, 6, 4, 12, 8, 9};
   char udp[4]={9, 3, 6, 12};
   setup_adc(ADC_CLOCK_INTERNAL);
   SETUP_ADC_PORTS(sAN0|sAN1);
   lcd_init();
   lcd_gotoxy(1, 1);
   printf(lcd_putc, "Pasos");
   for(;;)
   {
      set_adc_channel(0);
      vel = READ_ADC();
      set_adc_channel(1);
      n_pas = READ_ADC();
      if((n_pas != n_pasa) || (vel != vela))
      {
         n_pasa = n_pas;
         vela = vel;
         t = 1.0-(1.57086614*(vel - 255.0));
         t_int = t;            // Parte entera de t
                 
      }
      paso = input_c() & 0x3f;
      switch(paso)
      {
         case 1:
         secu[8] = "Simple";
         dire[4] = "Der";
         despliega(secu, dire);
         rut(0, upc, 4, n_pas, t_int);
         break;
         case 2:
         secu[8] = "Simple";
         dire[4] = "Izq";
         despliega(secu, dire);
         rut(1, upc, 4, n_pas, t_int);
         break;
         case 4:
         secu[8] = "Medio";
         dire[4] = "Der";
         despliega(secu, dire);
         rut(0, upm, 8, n_pas, t_int);
         break;
         case 8:
         secu[8] = "Medio";
         dire[4] = "Izq";
         despliega(secu, dire);
         rut(1, upm, 8, n_pas, t_int);
         break;
         case 16:
         secu[8] = "Par D.";
         dire[4] = "Der";
         despliega(secu, dire);
         rut(0, udp, 4, n_pas, t_int);
         break;
         case 32:
         secu[8] = "Par D.";
         dire[4] = "Izq";
         despliega(secu, dire);
         rut(1, udp, 4, n_pas, t_int);
         break;
         default:
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Elige una opcion");
         break;
      }
      delay_ms(500);
   }
}

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re:Posible sintaxis
« Respuesta #4 en: 09 de Febrero de 2016, 08:57:54 »
Amigo esto en CCS deberia darte error:
Citar
switch(paso)
      {
         case 1:
         secu[8] = "Simple";  //  incorrecto en C
         dire[4] = "Der";
      //  incorrecto en C
         despliega(secu, dire);
         //rut(0,
      }
Aunque la version de tu  ccs no te de error, eso no es correcto y por eso estas teniendo problemas.
Para asignar un string puedes hacerlo al momento de crearlo asi:

char secu[]= "Simple";
char dire[] = " Der";
o utilizando strcpy

Saludos


 

anything