TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: palermo en 03 de Junio de 2006, 22:52:02

Título: esta funcion no me recibe constantes
Publicado por: palermo en 03 de Junio de 2006, 22:52:02
Hola muchachos !!!

...,tengo un inconveniente con la siguiente funcion:
Código: [Seleccionar]
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:
Código: [Seleccionar]
char nom[]="palermo";
escribirTexto(nom,0);

...,pero si intento hacer lo siguiente:
Código: [Seleccionar]
char conts nom[]="palermo";
escribirTexto(nom,0);

...,o hacer:
Código: [Seleccionar]
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 !!!
Título: Re: esta funcion no me recibe constantes
Publicado por: djpalas en 04 de Junio de 2006, 06:04:31
Buenas compañero!!

Podrias hacer una sobrecarga de funciones y no tendría que darte fallos. Más o menos podria ser así:

Código: [Seleccionar]

/*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  :-)
Título: Re: esta funcion no me recibe constantes
Publicado por: kain589 en 04 de Junio de 2006, 06:10:42
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
Título: Re: esta funcion no me recibe constantes
Publicado por: palermo en 04 de Junio de 2006, 11:49:50
kain... asi lo tengo en el programa y funciona perfectamente.

dj... nada, asi me dice q tambien esta mal escrito.
Título: Re: esta funcion no me recibe constantes
Publicado por: jfh900 en 04 de Junio de 2006, 11:57:44
Este compilador no admite sobrecarga de funciones.

Un saludo
Título: Re: esta funcion no me recibe constantes
Publicado por: palermo en 06 de Junio de 2006, 02:19:33
muchachos, cabie un poco as cosas, pero sigo teniendo el mismo problema:
Código: [Seleccionar]
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?
Título: Re: esta funcion no me recibe constantes
Publicado por: djpalas en 06 de Junio de 2006, 12:05:38
Buenas!!
Prueba con este código a ver si te vale, no lo puedo comprobar porque no tengo el CCS instalado.

Código: [Seleccionar]
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?

Título: Re: esta funcion no me recibe constantes
Publicado por: jfh900 en 06 de Junio de 2006, 12:27:35
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.
Título: Re: esta funcion no me recibe constantes
Publicado por: djpalas en 06 de Junio de 2006, 19:11:32

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
Citar
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
========================
Código: [Seleccionar]
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.
Título: Re: esta funcion no me recibe constantes
Publicado por: palermo en 07 de Junio de 2006, 01:23:19
amigos, ay dice claramente q:
Citar
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 !!!");