TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Palomino86 en 07 de Diciembre de 2010, 04:50:23

Título: Manipulacion de cadenas en C18
Publicado por: Palomino86 en 07 de Diciembre de 2010, 04:50:23
Que tal foro;

Aqui de nuevo con dudas, ahora quiero preguntarles acerca de como utilizar funciones para la manipulacion de cadenas ya que cuento con poca si no es que nula experiencia acerca del tema.

Mi duda es la siguiente:

Supongamos que tengo una variable tipo long la cual puede tener una longitud variable, esta variable la quiero convertir a string y lo hago de la siguiente forma:

Código: [Seleccionar]
unsigned long Variable;
char cadena[20];

Variable=12345;
ltoa(Variable,cadena);

Entonces quisiera saber como puedo partir la cadena para obtener cada uno de sus elementos, tomando en cuenta que la longitud de la cadena me puede variar... para despues darle el procesamiento que desee....


Saludos :)
Título: Re: Manipulacion de cadenas en C18
Publicado por: Suky en 07 de Diciembre de 2010, 09:43:19
La cadena se creará:

cadena[0]='1';
cadena[1]='2';
cadena[2]='3';
cadena[3]='4';
cadena[4]='5';
cadena[5]='\0';


Entonces, puede buscar el carácter nulo '\0' que indica final de string, y el anterior es la unidad, y así sucesivamente....

Ayúdate haciendo debug, con proteus o con MPLAB, ayudan mucho cuando se quiere entender algunas cosas.


Saludos!
Título: Re: Manipulacion de cadenas en C18
Publicado por: RICHI777 en 07 de Diciembre de 2010, 10:28:09
Hola, para iterar por todos los elementos deberia ser algo asi:

Código: C
  1. int i, Largo;
  2.  
  3. Largo = strlen( Cadena );
  4.  
  5. for ( i = 0; i < Largo; i ++ )
  6. {
  7.    /* Cada elemento del array se accede con el subindice i */
  8. }


Saludos !
Título: Re: Manipulacion de cadenas en C18
Publicado por: Palomino86 en 07 de Diciembre de 2010, 14:59:22
A caray RICHI777, no te entendi la ultima parte jejejje

Código: [Seleccionar]
/* Cada elemento del array se accede con el subindice i */
Título: Re: Manipulacion de cadenas en C18
Publicado por: RICHI777 en 07 de Diciembre de 2010, 15:12:14
Hola, para iterar por todos los elementos deberia ser algo asi:

Código: C
  1. int i, Largo;
  2. unsigned long Variable;
  3. char cadena[20];
  4.  
  5. Variable=12345;
  6. ltoa(Variable,cadena);
  7.  
  8. Largo = strlen( cadena );
  9.  
  10. for ( i = 0; i < Largo; i ++ )
  11. {
  12.    /* Cada elemento del array se accede con el subindice i */
  13.    printf( "%c", cadena[ i ] );
  14. }



Saludos !
Título: Re: Manipulacion de cadenas en C18
Publicado por: Suky en 07 de Diciembre de 2010, 15:56:49
A caray RICHI777, no te entendi la ultima parte jejejje

Código: [Seleccionar]
/* Cada elemento del array se accede con el subindice i */

Estudia sobre string y array de variables. O arreglo de Variables.
Título: Re: Manipulacion de cadenas en C18
Publicado por: Palomino86 en 07 de Diciembre de 2010, 21:05:41
Tomando en cuenta el post de RICHI777, trate de separar individualmente los elementos de la cadena pero  creo que no obtuve el exito, ya que al hacer un debug me di cuenta que las variables se me desbordaban... o tal vez no es correcta la forma en la que lo estoy haciendo, ademas me marca un warning.....

Código: [Seleccionar]
Make: The target "C:\P_C18\LCD_SER\openuart.o" is up to date.
Make: The target "C:\P_C18\LCD_SER\readuart.o" is up to date.
Make: The target "C:\P_C18\LCD_SER\uartdata.o" is up to date.
Make: The target "C:\P_C18\LCD_SER\writuart.o" is up to date.
Make: The target "C:\P_C18\LCD_SER\getsuart.o" is up to date.
Make: The target "C:\P_C18\LCD_SER\putsuart.o" is up to date.
Make: The target "C:\P_C18\LCD_SER\lcd_serial.o" is up to date.
Make: The target "C:\P_C18\LCD_SER\LCD_SER.o" is out of date.
Executing: "C:\MCC18\bin\mcc18.exe" -p=18F4610  /i"C:\MCC18\h" "LCD_SER.c" -fo="C:\P_C18\LCD_SER\LCD_SER.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
C:\P_C18\LCD_SER\LCD_SER.c:47:Warning [2054] suspicious pointer conversion
Make: The target "C:\P_C18\LCD_SER\ftoa.o" is up to date.
Make: The target "C:\P_C18\LCD_SER\LCD_SER.cof" is out of date.
Executing: "C:\MCC18\bin\mplink.exe" /l"C:\MCC18\lib" /k"C:\MCC18\bin\LKR" "C:\MCC18\lkr\18f4610.lkr" "C:\P_C18\LCD_SER\openuart.o" "C:\P_C18\LCD_SER\readuart.o" "C:\P_C18\LCD_SER\uartdata.o" "C:\P_C18\LCD_SER\writuart.o" "C:\P_C18\LCD_SER\getsuart.o" "C:\P_C18\LCD_SER\putsuart.o" "C:\P_C18\LCD_SER\lcd_serial.o" "C:\P_C18\LCD_SER\LCD_SER.o" "C:\P_C18\LCD_SER\ftoa.o" /o"C:\P_C18\LCD_SER\LCD_SER.cof" /M"C:\P_C18\LCD_SER\LCD_SER.map" /W
MPLINK 4.30.01, Linker
Copyright (c) 2009 Microchip Technology Inc.
Errors    : 0

MP2HEX 4.30.01, COFF to HEX File Converter
Copyright (c) 2009 Microchip Technology Inc.
Errors    : 0

Loaded C:\P_C18\LCD_SER\LCD_SER.cof.
BUILD SUCCEEDED: Tue Dec 07 16:57:57 2010

Código: [Seleccionar]
#include <p18f4610.h>

#include <delays.h> //Libreria para los retardos
#include <stdlib.h> //Libreria para conversiones a string
#include <stdio.h>
#include <sw_uart.h>
#include <string.h>
#include <math.h>
#include "./Include/lcd_serial.h"
#include "./Include/ftoa.h"


#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=PORTBE
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTB=OFF,WRTC=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF

float numero,numero_x;
unsigned char numero_1,numero_2,numero_3,numero_4,Datos[20];
unsigned long num_5,num_4,num_3,num_2,num_1,numero_completo;
char cadena[20],cad[2],cadena_2[20],cadena_x[20],x[20];
unsigned int i,Largo;

void main(void)
{
ADCON1=15;
    OpenUART();

Delay_ms(200);
ClearLCD();
HomeLCD();

Datos[0]=0; Datos[1]=0; Datos[2]=0;
Datos[3]=0; Datos[4]=0; Datos[5]=0;
Datos[6]=0;

numero_completo=1234560;
ltoa(numero_completo,cadena);

Largo=strlen(cadena);

for(i=0;i<Largo;i++)
{
Datos[i]=atoi(cadena[i]);
}

Tomare en cuenta tu consejo Suky y me pondre a investigar mas sobre cadenas, aunque creo que en el compilador C18 faltan algunas funciones para el manejo de strings que ordinariamente vienen en otros compilaodres o se les ha moficado su nombre......

Saludos
Título: Re: Manipulacion de cadenas en C18
Publicado por: Palomino86 en 07 de Diciembre de 2010, 23:04:21
Me puse a checar como partir una cadena en cada uno de sus elementos..... y encontre una funcion llamada "substr" (Substring), la cual va adquiriendo cada uno de los caracteres a partir de su posicion. Pero C18 no cuenta con ella, entonces queria saber si hay alguna funcion parecida en c18 que me realice lo mismo....

Saludos
Título: Re: Manipulacion de cadenas en C18
Publicado por: Palomino86 en 09 de Diciembre de 2010, 14:13:26
Que tal;

Cual es la forma correcta de realizar una funcion que me devuelva una cadena tipo char....


Porque he estado intentando y no me sale


Saludos
Título: Re: Manipulacion de cadenas en C18
Publicado por: Palomino86 en 09 de Diciembre de 2010, 14:52:36
En mi codigo estoy haciendo algo asi:

Código: [Seleccionar]
strcpy(Cad->Cientos,NULL);
Cientos(Digitos[2],Cad->Cientos,Digitos[1],Digitos[0]);

e hice una funcion de esta manera:

Código: [Seleccionar]
char *Cientos(unsigned char Digito,char *cadena,unsigned char Digito_1,unsigned char Digito_2)
{
char cad[20];

strcpy(cadena,NULL);
strcpy(cad,NULL);

switch(Digito)
{
case 1:
if((Digito_1==0)&&(Digito_2==0))
{
cad[0]='C';cad[1]='I';cad[2]='E';cad[3]='N';
}
else
{
cad[0]='C';cad[1]='I';cad[2]='E';cad[3]='N';cad[4]='T';cad[5]='O';
}
break;
case 2:
cad[0]='D';cad[1]='O';cad[2]='S';cad[3]='C';cad[4]='I';cad[5]='E';cad[6]='N';cad[7]='T';cad[8]='O';cad[9]='S';
break;
case 3:
cad[0]='T';cad[1]='R';cad[2]='E';cad[3]='S';cad[4]='C';cad[5]='I';cad[6]='E';cad[7]='N';cad[8]='T';cad[9]='O';cad[10]='S';
break;
case 4:
cad[0]='C';cad[1]='U';cad[2]='A';cad[3]='T';cad[4]='R';cad[5]='O';cad[6]='C';cad[7]='I';cad[8]='E';cad[9]='N';cad[10]='T';cad[11]='O';cad[12]='S';
break;
case 5:
cad[0]='Q';cad[1]='U';cad[2]='I';cad[3]='N';cad[4]='I';cad[5]='E';cad[6]='N';cad[7]='T';cad[8]='O';cad[9]='S';
break;
case 6:
cad[0]='S';cad[1]='E';cad[2]='I';cad[3]='S';cad[4]='C';cad[5]='I';cad[6]='E';cad[7]='N';cad[8]='T';cad[9]='O';cad[10]='S';
break;
case 7:
cad[0]='S';cad[1]='E';cad[2]='T';cad[3]='E';cad[4]='C';cad[5]='I';cad[6]='E';cad[7]='N';cad[8]='T';cad[9]='O';cad[10]='S';
break;
case 8:
cad[0]='O';cad[1]='C';cad[2]='H';cad[3]='O';cad[4]='C';cad[5]='I';cad[6]='E';cad[7]='N';cad[8]='T';cad[9]='O';cad[10]='S';
break;
case 9:
cad[0]='N';cad[1]='O';cad[2]='V';cad[3]='E';cad[4]='C';cad[5]='I';cad[6]='E';cad[7]='N';cad[8]='T';cad[9]='O';cad[10]='S';
break;
}

strcat(cadena,cad);
return cadena;
}

Me imprime lo que le pido y aparte me arroja algo de basura... alguien tiene idea de porque me pasa eso...

Saludos