Página 1 de 1

String no CCS

MensagemEnviado: 20 Nov 2006 12:20
por elias
Tenho problemas em passar uma string como parametro para uma função. Passo a explicar:
Poderia fazer assim:

cpp code
void teste(chat *ptr)
{
int i;
for (i=0;i<10;i++)
fprintf(RS232,"%c",STR[i]);
}

void main()
{
char STR[20];

strcpy(STR,"Hello!");
teste(STR);
}


Mas a ideia é passar a string directamente assim:

cpp code
void main()
{
teste("Hello!");
}


mas dá erro. Alguem tem solução?

Obrigado.

MensagemEnviado: 20 Nov 2006 16:17
por Fábio Pereira
Não entendi o seu programa ...

Qual o propósito de se passar um ponteiro para char para a função teste se este ponteiro não é utilizado no corpo da função ???

Você está imprimindo sempre a string STR ...

Até +

MensagemEnviado: 20 Nov 2006 18:11
por elias
A função estáva mal...

cpp code
void teste(chat *ptr) 
{
int i;
for (i=0;i<10;i++)
fprintf(RS232,"%c",ptr[i]);
}

MensagemEnviado: 20 Nov 2006 18:20
por Fábio Pereira
Bom,

A sua função ainda continua escrita errada porque não existe tipo chat (a não ser que você tenha definido um com typedef).

De qualquer forma, se você nos disser qual a mensagem de erro que está sendo apresentada, ficaria mais fácil tentar te ajudar.

Até +

MensagemEnviado: 20 Nov 2006 18:56
por elias
Vou explicar melhor: Eu tenho um projecto em que utilizo a UART do PIC18F6722, em que tenho um menu de configurações que efectuo através do Hiperterminal. Envio um pedaço de codigo:

cpp code
......
sprintf(CMP,"%s","gps\r");
if (strcmp(STR,CMP)==0)
{
fprintf(RS232,"\n\rLat.: %s",Get_Latitude());
fprintf(RS232,"\n\rLong: %s",Get_Longitude());
}
sprintf(CMP,"%s","ro\r");
if (strcmp(STR,CMP)==0)
fprintf(RS232,"\n\rRO: %f",Ro());
sprintf(CMP,"%s","lts\r");
if (strcmp(STR,CMP)==0)
{
fprintf(RS232,"\n\rP. Atm: %f",Pressao_Atmosferica());
fprintf(RS232,"\n\rAltura: %f",Altura_Actual());
fprintf(RS232,"\n\rLitros: %f",Litros_Actuais());
}

.....

em que utilizo muitas vezes a função fprintf.

Mas como o novo projecto tem um FT245RL "USB-barramento paralelo do lado do PIC", tenho que efectuar uma função parecida com a fprintf, para não utilizar muitas vezes sprintf ou strcpy. Por isso a função teste:

cpp code
void teste(char *ptr)
{
int i;
for (i=0;ptr[i]!='\0';i++)
send_ft245(ptr[i]);
}

void main()
{
teste("Parametro de entrada!");
}

Mas não funciona, dá este erro:

Line 132(18,19): Attempt to create a pointer to a constant
1 Errors, 0 Warnings.


Assim já funciona:

cpp code
void main()
{
char CMP;
sprintf(CMP,"%s",("Parametro de entrada!");
teste(CMP);
}


É que o projecto tem muita interacção com o utilizador, por isso necessita de muitas funções "strcpy" ou "sprintf", onde eu quero poupar.

Se tiver outra maneira de fazer o mesmo, é sempre bém vinda....

Obrigado.

MensagemEnviado: 20 Nov 2006 21:38
por ric_vas
A função teste está esperando um ponteiro para uma variável do tipo char que encontra-se na RAM. Quando você escreve:

teste("Parametro de entrada!");

esta informação "Parametro de entrada!" é uma constante armazenada na Flash e não pode ser acessada pela função.

No manual do CCS existe esta dica que pode ajudar:

A (non-standard) feature has been added to the compiler to help get around the problems created by the fact that pointers cannot be created to constant strings. A function that has one CHAR parameter will accept a constant string where it is called. The compiler will generate a loop that will call the function once for each character in the string.

Example:

void lcd_putc(char c ) {
...
}


lcd_putc ("Hi There.");



Nunca usei. Acho que você terá que alterar o corpo da sua função teste() para funcionar.

Ric

MensagemEnviado: 21 Nov 2006 12:32
por elias
Testei, mas não funcionou.

Obigado pela ajuda :)

MensagemEnviado: 21 Nov 2006 14:13
por ric_vas
Com base no que mencionei do manual do CCS, você poderia tentar assim (para testar apenas):

void main()
{
send_ft245("Parametro de entrada!");
}

Pelo que diz o manual o compilador gera o código (loop) que chamará a função send_ft245 para cada um dos caracteres da string (desde que sua função send_ft245 contenha um único parâmetro do tipo char).

Ric

P.S. A versão do CCS de onde tirei essa info. é 3.182

MensagemEnviado: 21 Nov 2006 14:28
por barboza
Tente assim!

void teste(char *ptr)
{
while (*ptr)
send_ft245(*ptr++);
}

MensagemEnviado: 21 Nov 2006 16:27
por ric_vas
Fiz um pequeno teste. Minhas funções:

cpp code
send_ft245(char c)
{
putc(c); //Envio de caracter pela serial
}

void main(void)
{
send_ft245("teste 1");
send_ft245("teste 2");
send_ft245("teste 3");
}

E funcionou. Se serve para a sua aplicação já não sei.

Abraço,

Ric

MensagemEnviado: 21 Nov 2006 18:09
por elias
Funcionou, porque usou a função putc(c);

O que eu queria é mesmo:

cpp code
void teste(char dado)
{
output_F(DADO);
}

teste("Dados a Enviar!");


Será que envia os dados todos?

Vou experimentar o seguinte:

cpp code
void teste(char dado)
{
char STR[100];
int i;

sprintf(STR,"%s",dado);
for (i=0;STR[i]!='\0';i++)
output_F(STR[i]);
}


Assim só usava uma vez a função sprintf cada vez que chama-se a função teste.