TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: dongustavo en 24 de Agosto de 2013, 12:45:12

Título: string como parámetro
Publicado por: dongustavo en 24 de Agosto de 2013, 12:45:12
Hola,


- uso un PIC18
- compilador XC18

Tengo esta función:

void MLCD_WriteString(unsigned char * string)
{
while(*string)
  {
  MLCD_WriteChar(*string++);
  }
}



Si la llamo así funciona OK:
byte tempCHAR[3];


tempCHAR[0]='4';
tempCHAR[1]=0;
MLCD_WriteString(tempCHAR);

Si la llamo así no funciona:

MLCD_WriteString("4");   //Warning [2054] suspicious pointer conversion



Necesito poder pasarle a la función tanto variables en RAM como tempCHAR como "variables" en ROM como "4"...


Comentarios bienvenidos...

Saludos!






Título: Re: string como parámetro
Publicado por: planeta9999 en 24 de Agosto de 2013, 13:23:25
Tu función espera un puntero, no puedes pasarle un valor fijo o una variable.
Otra cosa son las matrices, yo suelo pasarlas como un puntero al primer elemento de la matriz, pero si te compila y funciona poniendo solo el nombre de la matriz, supongo que es equivalente.


Prueba algo así:
const unsigned char variable ="4";
MLCD_WriteString (&variable);

De esta manera estás pasando un puntero, que apunta a la variable estática "variable" almacenada en flash, que contiene el valor "4", prueba con comillas simples o dobles, ahora mismo no recuerdo si funciona con una u otra o ambas. Si le quitas el "const" será una variable en RAM.


PD: corrijo, es "const" y no "static" para que la variable esté almacenada en flash.
Yo no he utilizado el "const", porque cuando he necesitado guardar algo en flash, ha sido en una dirección concreta, y entonces he utlizado algo como esto:
unsigned int __attribute__ ((space(prog), address(0x9D005010))) Reservada_1 = 0xFFFFFFFF; // Direccion reservada para usos varios

Título: Re: string como parámetro
Publicado por: RICHI777 en 24 de Agosto de 2013, 13:38:41
Para mi esta correcta la forma de llamarlo.

Citar
MLCD_WriteString("4");   //Warning [2054] suspicious pointer conversion

El warning seguramente será porque el C string esta definido como char a secas osea signedado.

Código: C
  1. MLCD_WriteString(( unsigned char * ) "4");

De esta manera el warning posiblemente desaparezca.

Pero esto ni implique que funcione, podría ser ( no soy un experto en arquitectura PIC ) que tenga que ver con el tema de acceder a datos en Flash ...

Saludos !
Título: Re: string como parámetro
Publicado por: AngelGris en 24 de Agosto de 2013, 14:28:21
Hola,


- uso un PIC18
- compilador XC18

Tengo esta función:

void MLCD_WriteString(unsigned char * string)
{
while(*string)
  {
  MLCD_WriteChar(*string++);
  }
}



Si la llamo así funciona OK:
byte tempCHAR[3];


tempCHAR[0]='4';
tempCHAR[1]=0;
MLCD_WriteString(tempCHAR);

Si la llamo así no funciona:

MLCD_WriteString("4");   //Warning [2054] suspicious pointer conversion



Necesito poder pasarle a la función tanto variables en RAM como tempCHAR como "variables" en ROM como "4"...


Comentarios bienvenidos...

Saludos!




  Podría decirse que tengo una función que cumple una tarea similar, pero está definida de manera diferente y me permite pasarle ambos tipos de parámetro.
  La utilizaba anteriormente con HiTech C y ahora la estoy utilizando con XC8 sin problemas.

Código: C
  1. void WriteStrLcd (const char *palabra)
  2.   {
  3.     while (*palabra)
  4.       WriteByteLcd ((*palabra++),1);
  5.   }

  Observa que en la definición dice "const char *palabra" como si fuera un puntero a una constante. De todas maneras permite llamarla de las siguientes maneras sin ningún problema.

Código: C
  1. unsigned char frecuenciatxt[16];
  2. WriteStrLcd("   Generador   ");
  3. itoa(frecuenciatxt, alfa, 10);
  4. WriteStrLcd(frecuenciatxt);
Título: Re: string como parámetro
Publicado por: Suky en 24 de Agosto de 2013, 16:48:57
Podes probar con el cast que indica RICHI777, y sino hace otra función como indica AngelGris.  ;-)