Autor Tema: Extraer numeros de un long  (Leído 3253 veces)

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

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Extraer numeros de un long
« en: 08 de Septiembre de 2013, 06:39:13 »
Hola,

Tengo una duda sobre como extraer numero a numero el valor de un long en C (en concreto XC8).

Ejemplo:

- si tengo un long llamado valor con el valor 12345678

unsigned long valor = 12345678;

- y por otro lado tengo un array de 8 numeros num[8]

int num[8];

- ¿Como puedo hacerlo para conseguir los siguiente?:

num[0] = 1
num[1] = 2
num[2] = 3
num[3] = 4
num[4] = 5
num[5] = 6
num[6] = 7
num[7] = 8

- Una vez conseguid esto, tengo que manipular cada num[] y volver a regresarlo al long valor.


La idea es editar el valor del long numero por numero y luego volver a guardarlo en el long.

¿Alguna idea?

BitPIC

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Extraer numeros de un long
« Respuesta #1 en: 08 de Septiembre de 2013, 07:49:21 »
Prueba esto:

Código: [Seleccionar]
unsigned long valor = 123456789;
unsigned char num[9];
unsigned long aux = 100000000;
unsigned char i;

for(i=9;i>0;i--){

num[i-1] = valor/aux;
valor -= num[i-1]*aux;
aux /= 10;

}

aux = 100000000;

for(i=9;i>0;i--){

valor += num[i-1]*aux;
aux /= 10;

}

Un saludo.
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Extraer numeros de un long
« Respuesta #2 en: 08 de Septiembre de 2013, 11:38:29 »
Prueba esto:

Código: [Seleccionar]
unsigned long valor = 123456789;
unsigned char num[9];
unsigned long aux = 100000000;
unsigned char i;

for(i=9;i>0;i--){

num[i-1] = valor/aux;
valor -= num[i-1]*aux;
aux /= 10;

}

aux = 100000000;

for(i=9;i>0;i--){

valor += num[i-1]*aux;
aux /= 10;

}

Un saludo.

Gracias manwenwe,

Me ha ido casi bien, me falla la segunda parte, en lugar de 12345678 me aparece 12370572

He modificado un poco el codigo, aquí esta:

Código: [Seleccionar]
    char cursor;
    int num[8];
    int i = 0;
    unsigned long valor = 12345678;
    unsigned long valor_temp = 0;
    unsigned long aux = 100000000;

    valor_temp = valor;

    for(i=0;i<8;i++){
num[i] = valor_temp/aux;
valor_temp -= num[i]*aux;
aux /= 10;
    }

    LCD_goto(0,0);
    for(i=0;i<9;i++){
        printf("%i",num[i+1]);
    }

    aux = 10000000;
    valor_temp = 0;

    for(i=0;i<8;i++){
valor_temp += num[i+1]*aux;
aux /= 10;
    }

    LCD_goto(0,1);
    printf("%08lu",valor_temp);
   
    while(BOT_ENTER){;}
    pantalla = 0;
BitPIC

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Extraer numeros de un long
« Respuesta #3 en: 08 de Septiembre de 2013, 15:54:00 »


Como no sea que XC8 "castea" distinto a C18... no lo entiendo.

Tampoco entiendo porqué cargas el array empezando por 'i' y restauras el long empenzando por 'i+1'...
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Extraer numeros de un long
« Respuesta #4 en: 08 de Septiembre de 2013, 16:32:02 »
Pues si, empiezo a sospechar del XC8, hace cosas raras, por ejemplo lo que tu indicas el i+1, si no lo pongo en lugar de 12345678 me aparece 01234567.

También estoy teniendo problemas con el LCD. Tengo una librería que me va perfecta con un 18F4550 y en cambio ahora con este micro me hace cosas raras, como dejar de funcionar el LCD, quitarle una linea de código que no tiene nada que ver con el LCD y volver a funcionar, o por ejemplo poner que aparezca el cursor del LCD y que aparezca pero se borre todo lo que hay en el LCD... no se que esta pasando, como digo esta misma librería la estoy usando en otras aplicaciones y no tengo problemas.

Con lo del array, yo antes de pedir ayuda había hecho algo parecido a lo que me has dicho tu, pero no me funcionaba por muy claro que estuviese el código, pero no iba o hacia cosas que no he llegado a comprender.

Seguro que al finas será problema de que he hecho algo mal, pero mientras lo encuentro sospecho del XC8.

Mañana le daré más vueltas al código a ver que esta pasando. Era una aplicación sencilla y se me esta complicando...  :?

Gracias por la ayuda.
BitPIC

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Extraer numeros de un long
« Respuesta #5 en: 08 de Septiembre de 2013, 16:33:48 »
Por cierto, tu código lo había modificado por que no me acababa de ir del todo bien... seguramente sea por eso que me esta causando problemas en mi código o el XC8 y no consigo ver.
BitPIC

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Extraer numeros de un long
« Respuesta #6 en: 08 de Septiembre de 2013, 16:40:46 »
bitpic:

No he trabajado todavía con los compiladores nuevos. De hecho me acabo de enterar que XC8 compila para todos los micros de 8 bits, lo cual era un punto flojo de Microchip y me alegra mucho, porque nunca he trabajado con CCS ni Hi-Tech.

Es muy probable que hayan modificado los compiladores ya que los de antes eran versiones antiguas de GCC. Lee bien el capitulo de "tipos de datos" y el de "conversiones", si existen ambos, del manual del compilador.

A las malas fuerza el casting que eso siempre funciona. Por ejemplo:

valor += ((long)num[i-1])*aux;

Suerte!!!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado electroipod

  • PIC16
  • ***
  • Mensajes: 166
Re: Extraer numeros de un long
« Respuesta #7 en: 09 de Septiembre de 2013, 01:43:36 »
Quizas podrias usar la funcion ltoa() para convertirlo a asccii y luego usar la funcion atol() para hacer lo contrario, como esto:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char buff[7];
    long i=123456,
           j;
    ltoa(i,buff,10);
    printf("%c\n",buff[0]);
    printf("%c\n",buff[1]);
    printf("%c\n",buff[2]);
    printf("%c\n",buff[3]);
    printf("%c\n",buff[4]);
    printf("%c\n",buff[5]);
j=atol(buff);
printf("Cadena:%s,Convertido a tipo long:%ld",buff,j);

    return 0;
}
salida:
1
2
3
4
5
6
Cadena:123456,Convertido a tipo long:123456

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Extraer numeros de un long
« Respuesta #8 en: 09 de Septiembre de 2013, 19:05:01 »
Quizas podrias usar la funcion ltoa() para convertirlo a asccii y luego usar la funcion atol() para hacer lo contrario, como esto:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char buff[7];
    long i=123456,
           j;
    ltoa(i,buff,10);
    printf("%c\n",buff[0]);
    printf("%c\n",buff[1]);
    printf("%c\n",buff[2]);
    printf("%c\n",buff[3]);
    printf("%c\n",buff[4]);
    printf("%c\n",buff[5]);
j=atol(buff);
printf("Cadena:%s,Convertido a tipo long:%ld",buff,j);

    return 0;
}
salida:
1
2
3
4
5
6
Cadena:123456,Convertido a tipo long:123456

Gracias electroipod, has dado en el clavo.

Ahora me va perfecto.

Tengo que decir que también tenía un error en la librería del LCD. Ahora esta funcionando todo correctamente.

Un saludo.
BitPIC

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Extraer numeros de un long
« Respuesta #9 en: 10 de Septiembre de 2013, 16:20:19 »
 ((:-))

Siempre mejor utilizar las librerías ANSI C.
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Extraer numeros de un long
« Respuesta #10 en: 11 de Septiembre de 2013, 12:15:12 »
Me ha surgido otra cosa:

Quiero mostrar el numero en 8 dígitos, por ejemplo si el valor del long es 123 quiero mostrar 00000123, normalmente para esto, si no me equivoco, se utiliza de la siguiente manera printf("%08x",valor); donde x y valor dependen del tipo de variable que quieras mostrar.

La cuestión es que si lo hago el display no me muestra nada, se queda en blanco. Si le quito el 0 del "%08x" si que funciona pero sin mostrar los 0 de delante.

¿Estoy haciendo algo mal?

Por otro lado, convierto el long a ascii con el ltoa() y a los valores del array que no sean un numero los renumero a 0 para obtener el 00000123, el problema es que en lugar de mostrar este valor me muestra 12300123.

Parece como si me mostrase primero el valor en la posicion 0 del LCD y luego al final con el formato que debería ser.

El código que tengo es el siguiente, en el lo que intento hacer es escribir en la primera lina del LCD "ProgNum." y en la segunda la variable "valor" que es un unsigned long en formato "%08s". Como veis primero lo paso a ascii con el ltoa() y asigno "0" en ascii en las posiciones que estén vacias del array num:

Código: [Seleccionar]
   
    char pos_cursor = 0;
    char i = 0;
    char num[8];

    ultoa(num,valor,10);

   
    for(i=0;i<8;i++){
        if( num[i] > '9' || num[i] < '0'){
            num[i] = '0';
        }
    }
   
    LCD_goto(0,0);
    printf("ProgNum.");

    LCD_cursor(ON,ON);
    LCD_goto(0,1);
    printf("%8s",num);
    delay_ms(1000);


Como veis en lugar de "%08s" pongo "%8s" porque si lo pongo con el 0 delante el LCD se me queda en blanco. Esto lo intento solventar en el bucle for().

Veis algo raro o que este haciendo mal para que en lugar de mostrar el valor como 00000123 me muestre 12300123?

Tengo que decir que más alante en el programa vuelvo a pasar el array a unsigned long y si muestro el unsigned long me lo muestra bien "123"
BitPIC