TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Gorgonas en 03 de Noviembre de 2007, 00:33:48

Título: Como hacer esto en c
Publicado por: Gorgonas en 03 de Noviembre de 2007, 00:33:48
Bueno, me surgio una duda que no soy capaz de resolver, para mi que soy un novato en c es complicado, pero seguro que es sencillo para alguien que domine bien el c :D

La cuestion esque meto unos datos por un teclado y los saco por el lcd, pero quiero dejar esos datos registrados en una variable int, y no se como hacerlo, porque lo que yo voy poniendo en el lcd es una variable "c" que es un caracter. y quiero
concatenar esos numeros que pongo en el lcd atraves de la variable c en un solo int.
¿Alguna pista?
Título: Re: Como hacer esto en c
Publicado por: Nocturno en 03 de Noviembre de 2007, 02:33:29
En "C" un int y un char son lo mismo: un byte con una cifra. Se usan uno u otro en función sobre todo de lo que quieras hacer con ellos, pero puedes comprobar tú mismo como si haces c=c+1 te sube uno en el código ASCII sin ningún problema.

Si lo que quieres es convertir una cadena de caracteres en un entero, te sugiero que hagas lo siguiente:

Código: C++
  1. char c; // este se lee del teclado
  2. int num; // aquí dejaremos el resultado
  3.  
  4. while (...) {
  5.    ... capturamos c ...
  6.    num = num*10 + (c-0x30);
  7. }

Así, cuando salgas del bucle, te encontrarás el resultado en "num". Una advertencia: si quieres capturar una cifra superior a 255, tendrás que utilizar int16 num; en vez de lo que hay.
Título: Re: Como hacer esto en c
Publicado por: Modulay en 03 de Noviembre de 2007, 04:56:12
En "C" un int y un char son lo mismo

Ojo con esto,Manolo,que depende del compilador.En entornos de desarrollo para pc como devc++ o visual C los enteros son de 32 bits si no recuerdo mal
Título: Re: Como hacer esto en c
Publicado por: Nocturno en 03 de Noviembre de 2007, 05:02:50
Bueno, quizás me he pasado asumiendo hipótesis previas, pero daba por hecho que estábamos hablando de CCS.
Título: Re: Como hacer esto en c
Publicado por: BrunoF en 03 de Noviembre de 2007, 05:04:59
Modulay, creo que las comillas de Manolo al escribir "C" indicaban que se refería al CCS, o bien a los compiladores C existentes para PICs.

En cuanto a lo que decís de los lenguajes C, es verdad. Hubo durante muchos años problemas con eso. Para algunos compiladores los enteros eran de 16 bits, y para otros de 32 bits. Obviamente esto trajo dolores de cabeza a la hora de migrar código. Hace un tiempito, se estandarizó el tipo de dato. Ahora, en todas las versiones de C y C++, un entero es de 32 bits.

Saludos.
Título: Re: Como hacer esto en c
Publicado por: Modulay en 03 de Noviembre de 2007, 05:14:32
Me supuse que te referías a ccs,aunque por ejemplo c30 maneja enteros de 16 bits.
Título: Re: Como hacer esto en c
Publicado por: RedPic en 03 de Noviembre de 2007, 05:29:22
Por eso yo, que trabajo en CCS C, declaro mis variables como char, int1, int8, int16 o int32 a pesar de que este compilador admite int, long ... etc. Así siempre sé exactamente qué tipo de variable estoy utilizando y después me es fácil hacer las trasposiciones que necesite.

Incluso he hecho simulaciones de algún algoritmo completo en Delphi en las que declaraba las variables como int16_VAR1: integer; ó Int8_VAR2: integer; que después pasaba a CCS C y solo tenía que quitarles el guión bajo.  :mrgreen:

Título: Re: Como hacer esto en c
Publicado por: Modulay en 03 de Noviembre de 2007, 05:35:42
Pos eso, Manolo,que sólo quería puntualizar porque me pareció oportuno.
Por cierto.Yo solía usar siempre el "int" en ccs,hasta que descubrí el int1,int8,int16 y tal
Estos tipos ya estaban definidos desde el principio de los tiempos o vinieron con alguna versión?
Título: Re: Como hacer esto en c
Publicado por: vszener en 03 de Noviembre de 2007, 06:56:48
El int1 vino después creo recordar, los demás ya estaban definidos.


Suerte!!! ;)
Título: Re: Como hacer esto en c
Publicado por: Gorgonas en 04 de Noviembre de 2007, 15:47:33
No me funciona :s pongo un trozo de codigo por si veis lo que esoty haciendo mal.

Tengo esto por un lado:

      if ((escribenumero==1)&&((c=='0')|(c=='1')|(c=='2')|(c=='3')|(c=='4')|(c=='5')|(c=='6')|(c=='7')|(c=='8')|(c=='9')))
      {
         lcd_putc(c);
         buffer[contdigit]=c;
         contdigit++;
         
         if(contdigit==3)
         {
            escribenumero=0;
            cantcolor++;
            contdigit=0;
         }
      }
Es decir despues de poner los 3 digitos en el teclado ya tengo en la variable buffer los 3 digitos.

y luego para ponerlos en la variable numero pongo;

 for( p=0 ; p<3 ; p++ )
     {
     rojo = rojo*10 + (buffer[p]-0x30);
     }
          buffer[0]=125; 
          lcd_putc(rojo);
          lcd_putc(buffer[0]);
          lcd_putc(buffer[1]);
          lcd_putc(buffer[2]);
Si escribo por el teclado 125, me pone un caracter correspondiente a la variable rojo(que deberia ser el de 125)
el caracter correspondiente a 125(que lo coloke en el buffer[0]) que no coincide con el anterior :S  y luego un 2 y  5.

No se que puedo estar haciendo mal... :(
Título: Re: Como hacer esto en c
Publicado por: Nocturno en 04 de Noviembre de 2007, 15:53:21
Cambia esto:
lcd_putc(rojo);

Por esto:
printf ("%u",rojo);

a ver si lo ves mejor
Título: Re: Como hacer esto en c
Publicado por: Gorgonas en 04 de Noviembre de 2007, 15:59:46
Pongo en el teclado 125 y me devuelve 213 en el hiperterminal :S
Edito me ponia 213 al tener puesto  for( p=0 ; p<4 ; p++ )

lo puse bien  for( p=0 ; p<3 ; p++ )
y me devuelve 253
Título: Re: Como hacer esto en c
Publicado por: Nocturno en 04 de Noviembre de 2007, 17:29:35
Estás multiplicando una vez más de lo necesario, pon:

for( p=0 ; p<2 ; p++ )
Título: Re: Como hacer esto en c
Publicado por: Modulay en 04 de Noviembre de 2007, 19:58:14
¿No sería mas facil que lo hicieras así?

rojo = 100*(buffer[0]-0x30) + 10*(buffer[1]-0x30) + (buffer[2]-0x30);
Título: Re: Como hacer esto en c
Publicado por: Gorgonas en 04 de Noviembre de 2007, 21:35:08
Pues tienes razon Modulay asi es mas facil, pero lo mas curioso es que como has puesto tu me funciona y usando el bucle while o for no :S  Ya me dolia la cabeza de probar cosas, voy a usar este metodo que para mi caso de 3 digitos me vale.
Aunque me kedo fastidiado porque a mi entender el bucle hace lo mismo :D Aunke no es problema del bucle porque si pongo esto

Rojo=Rojo*10+Buffer[0]-48;
Rojo=Rojo*10+Buffer[1]-48;
Rojo=Rojo*10+Buffer[2]-48;
me sigue dando un valor mal, alguien ve la difrencia entre lo anterior y esto?

rojo = 100*(buffer[0]-0x30) + 10*(buffer[1]-0x30) + (buffer[2]-0x30);

Yo lo calculo y me da lo mismo pero parece que al compilador no :S que locura...
Título: Re: Como hacer esto en c
Publicado por: jfh900 en 04 de Noviembre de 2007, 21:43:32
No es lo mismo. Yo lo pondría como:

Rojo  =  100*(Buffer[0]-48);
Rojo+=   10*(Buffer[1]-48);
Rojo+=        (Buffer[2]-48);

Un saludo
Título: Re: Como hacer esto en c
Publicado por: Modulay en 04 de Noviembre de 2007, 21:53:17
Tu bucle no funciona porque está mal implementado

int dig = 0;

for (p=2; p>=0; p--)
   {
   rojo = rojo + (10^p)*(buffer[dig]-0x30);
   dig ++;
   }

Buffer[0] hay que multiplicarlo por 100 (centenas) y buffer[1] multiplica por 10 (decenas)...buffer[2] debe acumular sin modificarse.
Lo que tu haces es multiplicar en cada iteración el contenido de rojo por 10,además de sumar el contenido del buffer


saludo
Título: Re: Como hacer esto en c
Publicado por: Gorgonas en 04 de Noviembre de 2007, 22:03:49
Bueno gracias a todos por ayudar, al final yendo de fuera hacia dentro descubri la raiz del problema. El problema era que aunque yo ponia la variable rojo=0 al definirla, en las pruebas para ver como pasar el char a int, antes que nocturno me dijera el metodo, deje perdida una linea de codigo que me modificaba el valor de la variable rojo siendo distinta de cero.
Por eso que todos los metodo tipo Rojo=Rojo*10+Buffer[0]-48; donde se presuponia que rojo era 0 al principio no funcionaban. Si el metodo que propuso modulay o lo que puso jhf900 donde el valor de la variable rojo no importaba.

GRACIAS A TODOS ;)
Título: Re: Como hacer esto en c
Publicado por: Nocturno en 05 de Noviembre de 2007, 02:54:12
Menos mal que lo has resuelto. A veces las cosas sencillas son las que más lata dan.

Lo que tu haces es multiplicar en cada iteración el contenido de rojo por 10,además de sumar el contenido del buffer
Eso era correcto, José. En cada iteración multiplicas por 10 lo que haya (mueves un dígito a la izquierda) y sumas un nuevo valor en unidades.
Título: Re: Como hacer esto en c
Publicado por: Modulay en 05 de Noviembre de 2007, 11:09:44
Pos es verdad.
Al final la culpa fue.......del cha cha cha :mrgreen: