Problema al concatenar en PIC C de CCS

Hola a todos. Estoy teniendo un problema en el compilador de CCS con el PIC16F877A.
Estoy usando este código para concatenar enteros en C y no funciona bien.
Sólo funciona cuando los números a concatenar son de 1 dígito, pero si son de dos o más, ya no.
Lo curioso es que lo pruebo con otros compiladores de C (no de PIC) y me funciona.

Muchas gracias.

PHP:
int concat(int x, int y) {
     
int temp = y;
    // while (y != 0) {
         x = x*10;
        y =y/10;
     //}
     return x + temp;
 }
 int aux=0; 
 int x=8;
 int y= 9;
 aux= concat(x,y);
    
     
       lcd_gotoxy(1,2);          
       printf(lcd_putc,"%u";,aux);
 
Última edición por un moderador:
Prueba cambiando el tamaño de las variables...

PHP:
int8 concat(int8 x, int8 y) {

int8 temp = y;
// while (y != 0) {
x = x*10;
y =y/10;
//}
return x + temp;
}
int8 aux=0; 
int8 x=8;
int8 y= 9;
aux= concat(x,y);


lcd_gotoxy(1,2); 
print8f(lcd_putc,"%u",aux);
 
no se que quieres hacer
digo tienes un etenero que contiene un 5
y tienes un segundo entero que tiene 8

y cuando los quieres concatenar que se conviertan en 58

es simple

char numero1;
char numero2;
char *cadena;
char valor;

numero1=4;
numero2=5;


sprintf(cadena,"%d,%d",numero1,numero2); //ahora cadena contiene la cadena 45

printf(putc_lcd,"%s",cadena); //imprimira 45 como string
valor=atoi(cadena); //valor obtendra el valor de cadena

printf(putc_lcd,"%d",valor);//imprimira el valor numerico de la convercion del string a numerico.


si no le entendiste

¡pongase a estudiar!
 
Yo para concatenar utilizo una funcion parecida a esta:

int16 cf16(int16 r){
if(r>99){ return 1000; } //mayor d 99
else { if(r>9){ return 100; } //mayor d 9..... de 10 a 99 se multiplica 100
else { if(r>0){ return 10; } else return 1; } }

dato1=103
data2=56

resultado=(data2*cf16(dato1))+dato1;

similar ira bien pero fallara con un numero mayor a 999

Saludos
 
muchas gracias a todos por sus respuestas pero no funcionan, les recuerdo que el problema es con numero de dos o mas cifras . Gracias



Muchas gracias Albert0 , he podido gracias a tu respuesta.
 
Última edición:
Me alegro eugy pero una cosa el ultimo "if(r>0){ + todo contenido }" Me parece que esta mal. Todo debe acabar en un "else { return 10 } //minimo " el cero tan bien es un digito.

Yo realmente utilizo una funcion para que me devuelva el nº de digitos a intencion de manejar el X de lcd_gotoxy(X,y); para poner un numero tras otro en el LCD
 
Albert0, estoy teniendo problemas con el 0 es verdad. Por ejemplo cuando quiero formar el 1034 me forma el 1340. Pero no entendí tu ultima respuesta. Ademas que si pongo tres números iguales seguidos me da cualquier numero . Gracias.
 
Última edición:
Realiza la concatenación de la siguiente forma:
PHP:
#include <16f877a.h>
#use     delay(crystal = 4MHz)
#include <lcd.c>
#include <stdlib.h>

int16 numero1;
int16 numero2;
int8 cadena[10];
int32 valor;

void main (void)
{
   numero1 = 123;
   numero2 = 456;

   lcd_init();

   sprintf(cadena,"%lu%lu",numero1,numero2); // Concatenar los números dentro del arreglo "cadena[]"

   printf(lcd_putc,"\f%s",cadena);           // Imprimir la cadena concatenada.
   valor = atof(cadena);                     // Convertir la cadena a entero. (Importante usar ATOF aunque no coincidan los tipos)
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%lu",valor);             // Imprimir el resultado como entero.
   
   while (true);
}
 
D@rkbytes, muchas gracias . Mi problema es que quiero que los numeros ingresen por el puerto serial y eso complica las cosas. Como quedaría la función para mas de dos nuemros?
 
Esa rutina es para más de dos dígitos, posiblemente 4 y 4.
Si los quieres ingresar por el puerto serial, debes recibir la cadena con "gets(string)" y usando la interrupción RDA.
 
problemas con el 0
No esto es raro sigue abiendo un problema con el 0 pero a partir de 1 todo deberia funcionar as probado a hacer esto:

dato1=1034
data2=56

resultado=(data2*cf16(dato1))+dato1;


Código:
int16 cf16(int16 r){ 
if(r>999){ retrun 10000; }//esto deberia baler para 1034 //4-ceros 4-digitos 
//ten en cuenta que 1034 es el nº de la derecha y 56 X 10000 el de la izquierda
//deberia quedar 561034


if(r>99){ return 1000; } //mayor d 99
else { if(r>9){ return 100; } //mayor d 9..... de 10 a 99 se multiplica 100
else { if(r>0){ return 10; } else return 1; } }//quizas no sea mala idea que debuelba un 1 en caso de 0
//no se si no lo arreglas aqui tiene que ser antes o despues, a mi ahora no se me ocurre otra cosa y //ultimamente no e hecho nada pero recuerda a Bart Simson "multiplicate X 0" no puede funcionar

y todo es sucesivo if(r>99999) //para cifras de 5 digitos
Ahora hacerlo a si puede ser lento si las cifras tienden a ser menores a 100 pero pueden llegar a mas de 6 cifras-digitos Mejor empezar a preguntar desde menores
if(r<9){ retrun 10; }//aqui vuelve a cascar algo devolver 0 por si solo no va a valer a menos que el //resto del programa tenga en cuenta esto
else if(r<99){ retrun 100; }
else if(r<999){ retrun 1000; .......sucesivo



Este metodo es muy sencillo y parece valer para un numero de 9 cifras int8 cadena[10];

sprintf(cadena,"%lu%lu",numero1,numero2); // Concatenar los números dentro del arreglo "cadena[]"
valor = atof(cadena); // Convertir la cadena a entero.
//si fuese el caso me quedaria con el

pero pregunta a parte que es "gets(string)" puede pasar una cadena de caracteres con el SPI de comunicacion serie es lo unico que e utilizado y solo numeros. Yo si paso numeros mayores a int8
utilizo make8 o make16 en lo mas sencillo
¿Con gets(string) Tiene en cuenta la comunicacion serie los caracteres vacios o 0 "los que no son necesario pasar"?
 
Última edición:
Atrás
Arriba