TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: palermo en 03 de Junio de 2006, 22:52:02
-
Hola muchachos !!!
...,tengo un inconveniente con la siguiente funcion:
void escribirTexto(char text[], EEPROM_ADDRESS dir){
int tam=0,i=0;
tam=strlen(text);
for(i=0; i<tam; i++){
WRITE_EXT_EEPROM( dir++, text[i] );
}
WRITE_EXT_EEPROM( dir++, finCadena );
}
si la llamo de la siguiente manera, el compilador me dice q todo esta bien y funciona correctamente:
char nom[]="palermo";
escribirTexto(nom,0);
...,pero si intento hacer lo siguiente:
char conts nom[]="palermo";
escribirTexto(nom,0);
...,o hacer:
escribirTexto("palermo",0);
el compilador ccs me dice q hay un error y q a esa funcion no se le pueden
pasar datos constantes sino solo se le pueden pasar variables.
mi pregunta es:
¿como modifico la funcion para q tambien pueda recibir constantes?
GRACIAS !!!
-
Buenas compañero!!
Podrias hacer una sobrecarga de funciones y no tendría que darte fallos. Más o menos podria ser así:
/*Prototipo de funciones*/
void escribirTexto (char *, EEPROM_ADDRESS);
void escribirTexto (char conts *, EEPROM_ADDRESS);
/*Funciones*/
void escribirTexto(char text[], EEPROM_ADDRESS dir){
int tam=0,i=0;
tam=strlen(text);
for(i=0; i<tam; i++){
WRITE_EXT_EEPROM( dir++, text[i] );
}
WRITE_EXT_EEPROM( dir++, finCadena );
}
void escribirTexto(char conts text[], EEPROM_ADDRESS dir){
int tam=0,i=0;
tam=strlen(text);
for(i=0; i<tam; i++){
WRITE_EXT_EEPROM( dir++, text[i] );
}
WRITE_EXT_EEPROM( dir++, finCadena );
}
Ahora mismo no tengo el CCS para comprobarlo, porque ultimamente utilizo Keil para los Infineon C515-L.
saludos y espero que te sirva :-)
-
Saludos! ¿Es asi como lo tienes en el programa? es que esta mal escrito, aunque no se si sera al ponerlo aqui
char const nom[]="palermo";
He estado mirando en el manual de CCs y especifica la longitud ademas, si no te va intentalo poniendo la longitud a ver que pasa
-
kain... asi lo tengo en el programa y funciona perfectamente.
dj... nada, asi me dice q tambien esta mal escrito.
-
Este compilador no admite sobrecarga de funciones.
Un saludo
-
muchachos, cabie un poco as cosas, pero sigo teniendo el mismo problema:
void escribirTexto(char text[], EEPROM_ADDRESS dir){
int tam=0,i=0;
tam=strlen(text);
for(i=0; i<tam; i++){
WRITE_EXT_EEPROM( dir++, text[i] );
}
WRITE_EXT_EEPROM( dir++, finCadena );
return;
}
void escribirTexto2(char const texto2[], EEPROM_ADDRESS dir){
escribirTexto(texto2,dir);
return;
}
void holaMundo(){
escribirTexto2("Hola mundo",0); //Aqui me dice el compilador q es una mala expresion
return;
}
¿compañeros, q esta pasando?
...,lo unico q quiero es poder hacer un metodo q pueda recibir una constante
como parametro para mandarle a escribir un texto en una memoria...
¿eso es mucho pedirle al compilador?
-
Buenas!!
Prueba con este código a ver si te vale, no lo puedo comprobar porque no tengo el CCS instalado.
void escribirTexto(char texto[], EEPROM_ADDRESS dir){
int tam=0,i=0;
tam=strlen(texto);
for(i=0; i<tam; i++){
WRITE_EXT_EEPROM( dir++, texto[i] );
}
WRITE_EXT_EEPROM( dir++, finCadena );
return;
}
void escribirTexto2(char const texto[], EEPROM_ADDRESS dir){
int tam=0,i=0;
tam=strlen(texto);
for(i=0; i<tam; i++){
WRITE_EXT_EEPROM( dir++, texto[i] );
}
WRITE_EXT_EEPROM( dir++, finCadena );
return;
}
void holaMundo(){
escribirTexto2("Hola mundo",0); //Aqui me dice el compilador q es una mala expresion
return;
}
Pero una duda, finCadena la tienes declarada como una constante o una variable global, no?
-
Pues no sirve, ya que todo parámetro pasado a una función se pasa mediante una variable interna, y los valores constantes por definición se pasan por valor, con lo que el compilador no lo admite.
Un saludo.
-
Pues no sirve, ya que todo parámetro pasado a una función se pasa mediante una variable interna, y los valores constantes por definición se pasan por valor, con lo que el compilador no lo admite.
Un saludo.
Me puesto a mirar el manual de programación del CCS (Apartado 7 DEFINICION DE FUNCIONES) cito textualmente
Una característica no muy corriente, se ha añadido al compilador para ayudar a evitar los
problemas creados por el hecho de que no pueden crearse punteros a constantes de cadenas.
Una función que tiene un parámetro de tipo char aceptará una constante de cadena. El
compilador generará un bucle que llama a la función una vez para cada carácter de la cadena.
Por lo que podrias probar este código
========================
void escribirTexto(char texto[], EEPROM_ADDRESS dir){
int tam=0,i=0;
tam=strlen(texto);
for(i=0; i<tam; i++){
WRITE_EXT_EEPROM( dir++, texto[i] );
}
WRITE_EXT_EEPROM( dir++, finCadena );
return;
}
void escribirTexto2(char texto, EEPROM_ADDRESS dir){
WRITE_EXT_EEPROM( dir++, texto);
}
void holaMundo(){
escribirTexto2("Hola mundo",0); //Aqui me dice el compilador q es una mala expresion
return;
}
La función void escribirTexto2(char texto, EEPROM_ADDRESS dir) segun lo anterior el propio compilador creara un bucle para enviar caracter a caracter.
Espero que te pueda servir de ayuda.
-
amigos, ay dice claramente q:
El compilador generará un bucle que llama a la función una vez para cada carácter de la cadena.
y asi no sirve...
-------------------------------------------
me imagino q ya todos conecen la tipica funcion:
printf("Hola mundo !!!");
...,si se dan cuanta, lo q se le manda es una constante de texto y el compiador no
pone problema para nada.
...,bueno, asi mismo, es lo unico q yo quiero hacer. Es solo una funcion q
reciba una constante de texto como parametro:
escribirTexto("Hola mundo !!!");
-------------------------------------------
muchachos, yo pense q era comun q los q programaban pic's en c
en algun momento de su vida, habian echo uso de una funcion
con estas caracteristicas...
¿acaso no es normal q una funcion pueda recibir un texto constante como paramtro?
...asi como: printf("hola mundo !!!");