//Usando un índice con arreglo (la más fácil)
if(arreglo[2]=='s')
//Es una s
//Usando otro apuntador de chars
char *apuntador;
apuntador = arreglo+2; //copia la dirección ram del tercer elemento de la cadena (letra s)
if(*apuntador == 's')
//Es una s
//Usando otro apuntador de chars
char *apuntador;
apuntador = &arreglo[2]; //copia la dirección ram del tercer elemento de la cadena (letra s)
if(*apuntador == 's')
//Es una schar cadena[30]; //Una cadena que podrá almacenar hasta 29 caracteres
cadena[0]='C';
cadena[1]='a';
cadena[2]='l';
cadena[3]='c';
cadena[4]='u';
cadena[5]='l';
cadena[6]='a';
cadena[7]=0x00;
cadena[8]='d';
cadena[9]='o';
cadena[10]='r';
cadena[11]='a';#USE DYNAMIC_MEMORY
...
char *cadena;
...
//Búscame ram para almacenar 30 chars consecutivos
cadena=(char *)malloc(30);
...
//Ya no voy a usar la cadena, deséchala
free(cadena);
char cadena[50]; //cada cadena tendrá 9 chars + 1 NULL = 10 chars
//primera palabra
sprintf(cadena,"perro");
//segunda
sprintf(cadena+10,"gato");
//tercera
sprintf(cadena+20,"ratón");
//cuarta
sprintf(cadena+30,"queso");
//quinta
sprintf(cadena+40,"leche");
//Define el tamaño de cadena en la multicadena
#define tamano 10
...
//primera
printf("%s \n", &cadena[0*tamano]);
//segunda
printf("%s \n", &cadena[1*tamano]);
//tercera
printf("%s \n", &cadena[2*tamano]);
//cuarta
printf("%s \n", &cadena[3*tamano]);
//quinta
printf("%s \n", &cadena[4*tamano]);
//verifica que el archivo sea un jpg válido
//.jpg, .JPG
char temporal[6];
bool jpg_valido=0;
j=0;
for(i=(strlen(filename)-4);i<strlen(filename);i++)
temporal[j++]=filename[i];
temporal[j]=0;
if(strcmp(temporal,".jpg")==0) jpg_valido=1;
if(strcmp(temporal,".JPG")==0) jpg_valido=1;
//.jpeg, .JPEG
j=0;
for(i=(strlen(filename)-5);i<strlen(filename);i++)
temporal[j++]=filename[i];
temporal[j]=0;
if(strcmp(temporal,".jpeg")==0) jpg_valido=1;
if(strcmp(temporal,".JPEG")==0) jpg_valido=1;Excelenteee!!!
Agregaría una cosita: que una vez declarado un array:
char arreglo[5];
Es ilegal intentar cargarle todos los caracteres juntos:
arreglo="casa";
Por eso recurres a hacer:
arreglo[0]='c';
arreglo[1]='a';
arreglo[2]='s';
arreglo[3]='a';
arreglo[4]=0x00;
Bueno, ya largué con una de las funciones, de a poco voy a ir explicando todas. Cualquier cosa q se me escape o me haya equivocado me lo hacen saber por favor.
Santi, creo q tu error esta acá:
for(i=(strlen(filename)-4);i<strlen(filename);i++)
deberia ser -3 no?
saludos!!!
Tenes razón, se me escapó el hecho de q filename[0] es el primer caracter jeje. Creo q el error es la definición de "temporal"
char temporal[4];
Deberia ser de tamaño 5, ya que ".jpg" son 5 caracteres incluyendo el nulo.
A todo esto, no es mas corto hacer un strstr(filename,".jpg");? jejeje. Lo voy a poner como ejemplo cuando haga en analisis de esa funcion ;)
saludos!
int i=0;
printf("i vale %u",i);
printf("i vale %u",++i);
printf("i vale %u",i);
i vale 0
i vale 1
i vale 1
int i=0;
printf("i vale %u",i);
printf("i vale %u",i++);
printf("i vale %u",i);
i vale 0
i vale 0
i vale 1
Corregido, gracias. Te ganaste una estrellita Güitre: (http://www.todopic.com.ar/foros/Themes/babylon/images/star.gif).
Jajaja, qué bueno que te gustó el regalo. Gera no lo quiso, le hizo 'fuchi' :DWoow woow woow... como q gera no lo quiso? no sabia q habia q ponerlo en la firma a modo de aceptacion jaja. Ya llevo bastante en el foro, pero no conocia esta costumbre jeje.
Buu, por dormilon me la gano el guitre de guitre jaja. Voy a resumir una función mas y a seguir estudiando :( jeje
saludos!!
CCS C Compiler Release of Principal Version 4.100
Wednesday 27 May, 2009
Version 4.100 Supports Microchip Technology's Enhanced Mid-Range Family of PIC16 MCU!
CCS announces the release of version 4.100 for all CCS C Compilers in June 2009. This release includes many new and exciting features, functionality and support.
CCS has improved string-handling functions to be optimized built-in functions that will accept any combination of constant and variable arguments. The new compiler also includes an optimized printf, including string compression for 7-bit ASCII strings on 14-bit opcode parts. Many printf strings will take half of the ROM space on most PIC® microcontrollers from Microchip Technology.
The newly added syntax extensions will allow the use of some standard operators, such as +, = and ==, directly on strings. Powerful syntax extensions also permit the use of strings in a switch statement, providing an easy to use and efficient string comparison.
Additionally, version 4.100 includes support for the enhanced Mid-range family of PIC® microcontrollers, including large arrays and built-in functions such as a context switch. The compiler includes a library for #USE TOUCH_PAD for capacitive touch-sensing. PIC® microcontrollers with the onboard mTouch™ module, such as the PIC16F727, will utilize internal features when available.
“CCS has always offered unique value to Microchip’s customers,” said Derek Carlson, vice president of Microchip’s Development Tools group. “We are pleased that the CCS C Compiler now supports our enhanced Mid-range PIC® microcontrollers The support is timely and welcome.”
Version 4.100 will be available to any customer on active maintenance.
Funcion: strcmp
Sintaxis: int strcmp(char *s1, char *s2);
Esta función recibe dos cadenas como parámetros y devuelve 0 si son iguales, un negativo si s1<s2 y un positivo si s1>s2.
Descripción:
Bueno, en la sintaxis ya expliqué bastante. La función básicamente sirve para saber si una cadena es igual a otra. Devolviendo 0 en este caso, y distinto de 0 si son distintas. Otro error común, es usar el operador == para saber si las cadenas son iguales:
if(string1==string2) MAL
Ejemplo:Código: C
#include<stdio.h> #include<string.h> void main() { char s1="hola mundo!"; //cuanta originalidad jaja else }
Comentarios:
Este ejemplo siempre va a dar negativo, salvo que pongamos como segundo parámetro de la función "hola mundo!". La única precaución que hay que tener al llamar a esta función, es que las cadenas tengan un terminador (NULL), si no puede haber un overflow.
---------------------------------------EN CONSTRUCCIÓN----------------------------------------
No olvidemos que CCS no es C estandar.
gracias amigo gera, efectivamente funciona ya los probe de las dos formas y funciona, en almacen valga la redundancia almaceno datos enviado desde la pc y funciona correctamente
char almacen[5][5]
strcpy(almacen[j],dato);
USART_activa_tx_nodo();
fprintf(nodo,"%s\r","dato agregado");
USART_activa_rx_nodo();
j++;
#include <16F628A.h>
#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD
#use delay(clock=20000000)
#use rs232(baud=19200, xmit=PIN_B2,rcv=PIN_B1,stream=esclavo)
char mensaje[10][5];
char men1[5]="hi\0";
char men2[5]="ho\0";
char men3[5]="la\0";
char men4[5]="co\0";
char men5[5]="mo\0";
char men6[5]="es\0";
char men7[5]="tas\0";
//rutina de interrupcion
#int_rda
void interrupt_service_rutine_rda(void)
{
}
void main(void) {
int i;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
port_b_pullups(False);
set_tris_b(0b00000010);
delay_ms(100);
enable_interrupts(global);
enable_interrupts(int_rda);
fprintf(esclavo,"%s","hi");
strcpy( mensaje,men1);
i++;
strcpy( mensaje,men2);
i++;
strcpy( mensaje,men3);
i++;
strcpy( mensaje,men4);
i++;
strcpy( mensaje,men5);
i++;
strcpy( mensaje,men6);
i++;
strcpy( mensaje,men7);
for(i=0;i<7;i++)
fprintf(esclavo,"%s",mensaje);
}
#include <16F877a.h>
#fuses HS,NOWDT,PUT,NOPROTECT,NOLVP,BROWNOUT
#use delay(clock=20000000)
#include <flex_lcd.c>
#define OFF 1
#byte portb=0x06
#use fast_io(b)
int direccion=0x80,linea_2=OFF,selector_mensajes=0,primer_error=0;
void seleccion_mensaje();
void handle_error();
main()
{
lcd_init();
output_low(portb);
set_tris_b(0xf0);
portb=0b00000000;
port_b_pullups(true);
enable_interrupts(global);
enable_interrupts(int_rb);
lcd_setcursor(0,0); //Esta función controla si es visible el cursor(1º parametro)y si se activa el parpadeo.
direccion=0x80;
while(1)
{
seleccion_mensaje();
delay_ms(150);
lcd_putc("\f");
direccion++;
lcd_gotoxy(direccion,linea_2);
if(direccion==0x8F)
{
direccion=0xC0;
}
if(direccion==0xCF)
{
direccion=0x80;
linea_2=OFF;
}
switch(restart_cause()) //Funcion aviso de reinicio por fallo alimentacion.
{
case NORMAL_POWER_UP:
handle_error();
break;
}
}
}
void seleccion_mensaje()
{
switch(selector_mensajes)
{
case 0:
lcd_putc("Anahi te amo");
break;
case 1:
lcd_putc("Te queria decir");
break;
case 2:
lcd_putc("que a pesar de");
break;
case 3:
lcd_putc("todo lo incha");
break;
case 4:
lcd_putc("que sos...");
break;
case 5:
lcd_putc("= te amo..");
break;
case 6:
lcd_putc("hehe");
break;
case 7:
lcd_putc("Yo Carlos..");
break;
default:
selector_mensajes=0;
break;
}
}
#int_rb
void rb_rsi()
{
if(!input(PIN_B4)){delay_ms(40);++selector_mensajes;direccion=0x80;}
output_low(portb);
}
void handle_error()
{
lcd_gotoxy(1,1);
printf(lcd_putc,"\fFallo en la alimentacion");
if(primer_error==1)
{
sleep(); //La idea es usar esto para congelar al pic y descongelarlo una vez reseteado y reparada la alimentación.
}
primer_error=1;
}
O sea que lo que quiero hacer es evitarme tener que escribir en cada case cada palabra por separado..como puedo escribir todo de una si quiero cambiar la leyenda ej. definir un array con un maximo de letras e ir partiendo la nota de forma q se imprima en pantalla 15 caracteres por vez, se puede hacer? no les pido q me hagan el trabajo pero si estan experimentados tirenme una idea de como podria hacerlo seria con strlen() y sprintf?..Gracias
const char mensaje1[]="Mucho amor, poca RAM."; //Guarda la cadena en la rom de programa
...
for(i=0; i<21; ++i)
lcd_putc(mensaje1[i]);
En ccs:
&cadena[i] = cadena + i ;-)#include <16F877a.h>
#use delay (CLOCK = 4000000)
#fuses XT,NOWDT,NOLVP
#use rs232 (baud=9600,xmit=pin_b6, rcv=pin_b7)
void main()
{
char cadena[50]; //cada cadena tendrá 9 chars + 1 NULL = 10 chars
//primera palabra
sprintf(cadena,"perro");
//segunda
sprintf(cadena+10,"gato");
//tercera
sprintf(cadena+20,"ratón");
//cuarta
sprintf(cadena+30,"queso");
//quinta
sprintf(cadena+40,"leche");
printf("%s \n", cadena);
//segunda
printf("%s \n", cadena+10);
//tercera
printf("%s \n", cadena+20);
//cuarta
printf("%s \n", cadena+30);
//quinta
printf("%s \n", cadena+40);
while(1);
}
Una preguntilla :mrgreen:
Los ejemplos que van a colocar son tomando en cuenta el C o van a estar dirijidos al CCS?
Ya que hay cosas que como saben son validas en C y no en CCS. :shock:
Saludos
char *destino;
...
destino = origen+3;
Magnífico tutorial Santiago, muchas gracias
Muy bueno lo de cadenas con punteros. Gracias
for(;;){
unsigned char activar[]="*1234";
unsigned char codigos[6];
unsigned char i,c;
while(estado==0x04){ //Hasta que no sea igual no seguimos
for(i=0;i<5;i++){
while(c==0); //Hasta que no se oprima alguna tecla ..está por interrupción
codigos[i]=c;
c=0; //reiniciamos c
}
if(strcmp(codigos,activar)==0){ //Comparamos
lcd_putc("\fEs Igual");
delay_ms(1800);
estado=0x05; //Es igual , salimos
}else{
lcd_putc("\fNo es Igual");
estado=0x04;} unsigned char codigos[6]="\0";
for(i=0;i<5;i++){
while(c==0); //Hasta que no se oprima alguna tecla ..está por interrupción
codigos[i]=c;
c=0; //reiniciamos c
}
codigos[5]=0;char opc_menu[7][15]={"Estado","Tipo de onda","Amplitud","Frecuencia","Periodo","Duty cicle","Apagar"};
----------
char opc_onda[7][15]={"Rampa","Triangular","Cuadrada","Senoidal","Atras","",""};
for(i=0;i<=7;i++)
{
strcpy(opc_menu[i],opc_onda[i]);
}
Reemplazar el texto de un arreglo de char? No, con strcpy...También podes cargar directamente el string:
strcpy(opc_menu[0],"Rampa");
Saludos!
int i;
int mi_array[200]={};
for(i=0;i<=199;i++)
{
mi_array[i]=2*sin(i);
}
Quería agradecer por el magnífico tutorial, me la pasé varias horas (sino días) tratando de averiguar de donde venia el 'error' de no poder asignarle valores a una matriz char (en la que almaceno datos para un menú) una vez ya en la mitad del programa... Y eso pasa cuando en la facultad te dicen que estas programando en C (y en realidad es el C++) sumandose a eso algunas incongruencias o cositas raras que suele hacer el amigo CCS :D
Pregunto: ¿Hay alguna forma mas correcta o elegante de hacer esto?:Código: [Seleccionar]char opc_menu[7][15]={"Estado","Tipo de onda","Amplitud","Frecuencia","Periodo","Duty cicle","Apagar"};
----------
char opc_onda[7][15]={"Rampa","Triangular","Cuadrada","Senoidal","Atras","",""};
for(i=0;i<=7;i++)
{
strcpy(opc_menu[i],opc_onda[i]);
}
#include "string.h"
memcpy(opc_menu, opc_onda, 7*15);
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int menu;
int opcion;
const char strings[2][7][15] =
{
{"Estado", "Tipo de onda", "Amplitud", "Frecuencia", "Periodo", "Duty cicle", "Apagar"}, //Accede aquí con menu
{"Rampa", "Triangular", "Cuadrada", "Senoidal", "Atras", "", ""} //Y acá con opción
};
for(menu = 0; menu < 2; ++menu)
for(opcion = 0; opcion < 7; ++opcion)
printf("\"%s\"\n", &strings[menu][opcion][0]);
system("PAUSE");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE_AR(type, object) (sizeof(type) * sizeof(object))
#define MAX_ELEMS_PER_LIST (7)
#define MAX_CHARS_PER_STRING (15)
int main(int argc, char *argv[])
{
const char strings[][MAX_ELEMS_PER_LIST][MAX_CHARS_PER_STRING] =
{
{"Estado", "Tipo de onda", "Amplitud", "Frecuencia", "Periodo", "Duty cycle", "Apagar"},
{"Rampa", "Triangular", "Cuadrada", "Senoidal", "Atras", "", ""}
};
char opc_menu[][MAX_CHARS_PER_STRING]={"Estado", "Tipo de onda", "Amplitud", "Frecuencia", "Periodo", "Duty cycle", "Apagar"};
char opc_onda[][MAX_CHARS_PER_STRING]={"Rampa", "Triangular", "Cuadrada", "Senoidal", "Atras", "", ""};
int menu;
int opcion;
for(menu = 0; menu < (SIZE_AR(char, strings) / MAX_CHARS_PER_STRING / MAX_ELEMS_PER_LIST); ++menu)
for(opcion = 0; opcion < MAX_ELEMS_PER_LIST; ++opcion)
printf("\"%s\"\n", &strings[menu][opcion][0]);
printf("\n");
memcpy(opc_menu, opc_onda, SIZE_AR(char, opc_onda));
for(opcion = 0; opcion < (SIZE_AR(char, opc_menu) / MAX_CHARS_PER_STRING); ++opcion)
printf("\"%s\"\n", &opc_menu[opcion][0]);
printf("\n");
printf("Tamanio de opc_menu en bytes [%u]\n", SIZE_AR(char, opc_menu));
printf("Tamanio de opc_onda en bytes [%u]\n", SIZE_AR(char, opc_onda));
printf("Tamanio de strings en bytes [%u]\n", SIZE_AR(char, strings));
printf("\n");
printf("Tamanio de strings[x] en elementos [%u]\n", (SIZE_AR(char, strings) / MAX_ELEMS_PER_LIST / MAX_CHARS_PER_STRING));
printf("Tamanio de strings[][x] en elementos [%u]\n", MAX_ELEMS_PER_LIST);
printf("Tamanio de opc_menu[] en elementos [%u]\n", (SIZE_AR(char, opc_menu) / MAX_CHARS_PER_STRING));
system("PAUSE");
return 0;
}"Estado"
"Tipo de onda"
"Amplitud"
"Frecuencia"
"Periodo"
"Duty cycle"
"Apagar"
"Rampa"
"Triangular"
"Cuadrada"
"Senoidal"
"Atras"
""
""
"Rampa"
"Triangular"
"Cuadrada"
"Senoidal"
"Atras"
""
""
Tamanio de opc_menu en bytes [105]
Tamanio de opc_onda en bytes [105]
Tamanio de strings en bytes [210]
Tamanio de strings[x] en elementos [2]
Tamanio de strings[][x] en elementos [7]
Tamanio de opc_menu[] en elementos [7]
Presione una tecla para continuar . . .
Hola :)
Sí, te propongo ésta:Código: [Seleccionar]#include "string.h"
memcpy(opc_menu, opc_onda, 7*15);
Copia 7*15 bytes desde el apuntador opc_onda hacia el apuntador opc_menu.
Es raro lo que pides porque perderías lo que había en opc_menu y si es un microcontrolador, también estarías desperdiciando un poquito de ROM ;-)
Te sugiero esto...Código: [Seleccionar]#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int menu;
int opcion;
const char strings[2][7][15] =
{
{"Estado", "Tipo de onda", "Amplitud", "Frecuencia", "Periodo", "Duty cicle", "Apagar"}, //Accede aquí con menu
{"Rampa", "Triangular", "Cuadrada", "Senoidal", "Atras", "", ""} //Y acá con opción
};
for(menu = 0; menu < 2; ++menu)
for(opcion = 0; opcion < 7; ++opcion)
printf("\"%s\"\n", &strings[menu][opcion][0]);
system("PAUSE");
return 0;
}
#define SIZE_AR(type, object) (sizeof(type) * sizeof(object))for(menu = 0; menu < (SIZE_AR(char, strings) / MAX_CHARS_PER_STRING / MAX_ELEMS_PER_LIST); ++menu)memcpy(opc_menu, opc_onda, SIZE_AR(char, opc_onda)); for(opcion = 0; opcion < (SIZE_AR(char, opc_menu) / MAX_CHARS_PER_STRING); ++opcion)#define SIZE_AR(type, object) (sizeof(type) * sizeof(object))(SIZE_AR(char, strings) / MAX_CHARS_PER_STRING / MAX_ELEMS_PER_LIST)(sizeof(char) * sizeof(strings)) / 15 / 7(1 * 210) / 15 / 7 memcpy(opc_menu, opc_onda, SIZE_AR(char, opc_onda));:shock:
jeje lo intentaré explicar brevemente... :mrgreen:Código: [Seleccionar]#define SIZE_AR(type, object) (sizeof(type) * sizeof(object))
Cada vez que el compilador encuentre la palabra SIZE_AR seguida de dos parámetros, sustituirá todo por (sizeof(type) * sizeof(object))
sizeof(type) equivaldrá al tamaño en bytes del tipo de dato que le pases. Si le pasas char, valdrá 1.
sizeof(object) equivaldrá al tamaño de elementos que el objeto tenga, si es un arreglo. Si es una variable normal, devolverá su tamaño en bytes.Código: [Seleccionar](SIZE_AR(char, strings) / MAX_CHARS_PER_STRING / MAX_ELEMS_PER_LIST)
Esto equivale a:Código: [Seleccionar](sizeof(char) * sizeof(strings)) / 15 / 7
que a su vez equivale a:Código: [Seleccionar](1 * 210) / 15 / 7Código: [Seleccionar]memcpy(opc_menu, opc_onda, SIZE_AR(char, opc_onda));
Esa te queda de tarea googlearla.
Y tu última pregunta se explica con lo anterior.
El #define es una instrucción al preprocesador (lo que corre antes del compilador) para que reemplace texto que tú pones por el que el define ordena.
Si yo hago
#define GATO "miau"
entonces
printf(GATO);
se suustituirá por
printf("miau");
al empezar la compilación. :mrgreen:
(SIZE_AR(char, strings) / MAX_CHARS_PER_STRING / MAX_ELEMS_PER_LIST)(1 * 210) / 15 / 7for(menu = 0; menu < (SIZE_AR(char, strings) / MAX_CHARS_PER_STRING / MAX_ELEMS_PER_LIST); ++menu)El operador / funciona como división. ;-)