Autor Tema: Como hacer esto en c  (Leído 3935 veces)

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

Desconectado Gorgonas

  • PIC12
  • **
  • Mensajes: 81
Como hacer esto en c
« 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?

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Como hacer esto en c
« Respuesta #1 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.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Como hacer esto en c
« Respuesta #2 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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Como hacer esto en c
« Respuesta #3 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.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Como hacer esto en c
« Respuesta #4 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Como hacer esto en c
« Respuesta #5 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.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Como hacer esto en c
« Respuesta #6 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:

« Última modificación: 03 de Noviembre de 2007, 06:22:10 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Como hacer esto en c
« Respuesta #7 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?

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Como hacer esto en c
« Respuesta #8 en: 03 de Noviembre de 2007, 06:56:48 »
El int1 vino después creo recordar, los demás ya estaban definidos.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Gorgonas

  • PIC12
  • **
  • Mensajes: 81
Re: Como hacer esto en c
« Respuesta #9 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... :(

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Como hacer esto en c
« Respuesta #10 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

Desconectado Gorgonas

  • PIC12
  • **
  • Mensajes: 81
Re: Como hacer esto en c
« Respuesta #11 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
« Última modificación: 04 de Noviembre de 2007, 16:02:55 por Gorgonas »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Como hacer esto en c
« Respuesta #12 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++ )

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Como hacer esto en c
« Respuesta #13 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);

Desconectado Gorgonas

  • PIC12
  • **
  • Mensajes: 81
Re: Como hacer esto en c
« Respuesta #14 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...