Página 1 de 1

Converter Double para String

MensagemEnviado: 12 Mar 2008 16:50
por Junior_C
Olá, preciso mostrar o valor de um double em um LCD mas não estou conseguindo, tentei usar a função Sprintf mas não funciona com o double, será que estou fazendo algo errado? segue abaixo um trecho do código


void main(void) {
double teste_float;
char teste_str[200];
teste_float =12.01;

while(1){
(void)sprintf(teste_str,"teste=%f\n",teste_float);

saida1 = 1;

while(1){
}

}
}


Após executar a função sprintf a string teste_str fica assim "teste=" estou utilizando o codewarrior 5.1 e o mcu 9s08gt16.

Se alguem souber o que está errado, ou conheça outra função por favor me ajude, obrigado a todos.

MensagemEnviado: 12 Mar 2008 17:26
por Fábio Pereira
Se não estou enganado, o código de formatação para double é %g ou %e ...

T+

MensagemEnviado: 12 Mar 2008 20:52
por Junior_C
Obrigado pela dica, mas já havia testado antes com %e, %g mas não funcionu tb

MensagemEnviado: 13 Mar 2008 07:56
por Junior_C
Descobri o que estava acontecendo, era uma configuração do compilador, estava configurado para não oferecer suporte aos tipos doule e float.

MensagemEnviado: 13 Mar 2008 08:53
por Kremer
Haja flash !!!

Sugestão:

Quantas casa decimais vc precisa no LCD? Para economizar memoria pelo menos com o sprintf (que é um gastão de flash), multiplique seu valor por 10^numero de casas decimais e trunque o valor para um long. Depois faça a sua propria int_to_ascii (ou use o sprintf para inteiro) e escalone o ponto decimal na string resultante.
So pra se ter uma ideia, em um projetinho meu com o QG8 que tem 8K de flash e 512 bytes de RAM coloquei uma serie de coisas como filtro digital em ponto fixo, bootloader, e todo um set de comandos, além de reservar uma página inteira para emular EEPROM. Se eu tivesse usado sprintf nesse projeto nunca teria conseguido colocar tudo que eu precisava.
Até usei ela no começo (só para inteiros) e em um certo ponto vi que não daria. Neste ponto, por exemplo, o programa com o sprintf estava em 5555 bytes ocupados na flash, e sem o sprintf ocupava apenas 3661 bytes. Uma bela redução...

MensagemEnviado: 13 Mar 2008 09:06
por Ander_sil
Eu já usei o sprintf no keil para formatar uma string para o LCD dessa maneira:

Código: Selecionar todos
sprintf((char*)time,"%02d:%02d:%02d",hora,min,seg);   
LCD_printf(time,LINHA2,CENTRO);   // Envio a hora para o LCD


Note que converto de int para char na própria função do sprintf.

falou!

MensagemEnviado: 13 Mar 2008 09:13
por Ander_sil
Realmente usando o sprintf, printf e etc... aumentou em pelo menos 2K no programa que fiz pro 8051.

MensagemEnviado: 14 Mar 2008 14:44
por Junior_C
Realmente usando o sprintf aumentou em 5,5k o código gerado e só tenho 4,5k disponivel, alguem tem algum exemplo de float to string sem usar o sprintf?

MensagemEnviado: 14 Mar 2008 19:26
por Fábio Pereira
Float para ASCII ?

Pode se preparar para estudar...

Um documento que já li e que trata disso é a AN575 da Microchip. Esta AN mostra a conversão de float IEE754 para inteiro (é claro que é em assembly de PIC).

Obviamente que depois você ainda terá de converter o inteiro para ASCII mas isso é bem fácil.

T+

MensagemEnviado: 14 Mar 2008 22:42
por CCandido
usei sprintf gasta muita memoria, axo que toda vez que chama ele
gera outra rotina, entao evite mas, se for usa chame ele um vez so em uma funçao axo que diminui bastante.

meu_sprintf (......);

void meu_sprintf (......){

(void) sprintf(blablabla ); 1 vez so
}

MensagemEnviado: 15 Mar 2008 09:09
por Maia
Olá,
Quando a memória é pouca eu uso essa função:

Código: Selecionar todos
void print_val(double v)  /* 0 <= V < 999.9995 */
{
     unsigned long ll;
   neg = 0;
   if (v < 0){
        neg = 1;
        v *= -1.0;
   }     
   v*=2000; 
   ll = (long)v; 
   ll++; 
   ll>>=1; 
   st[5] = ll % 10;
   ll = ll / 10; 
   st[4] = ll % 10;
   ll = ll / 10; 
   st[3] = ll % 10;
   ll = ll / 10; 
   st[2] = ll % 10;
   ll = ll / 10; 
   st[1] = ll % 10;
   ll = ll / 10; 
   st[0] = ll % 10; 
   if (!st[0])  {
      if (!st[1])     
         st[1]=0xF0;   
      st[0]=0xF0; 
   } 
   st[7] = 0;
   st[7] = st[5] + '0';
   st[6] = st[4] + '0';
   st[5] = st[3] + '0';
   st[4] = '.';
   st[3] = st[2] + '0';
   st[2] = st[1] + '0'; 
   st[1] = st[0] + '0'; 
   if (neg == 1)
      st[0] = '-';
   else
      st[0] = ' ';    
}   


Abraços,
Maia

MensagemEnviado: 15 Mar 2008 11:42
por Fábio Pereira
CCandido escreveu:usei sprintf gasta muita memoria, axo que toda vez que chama ele
gera outra rotina, entao evite mas, se for usa chame ele um vez so em uma funçao axo que diminui bastante.

meu_sprintf (......);

void meu_sprintf (......){

(void) sprintf(blablabla ); 1 vez so
}


De onde você tirou isso Ccandido?

A não ser que a função sprintf esteja definida como inline, o compilador insere somente uma chamada para a função e não o código da função completa...

T+

MensagemEnviado: 17 Mar 2008 20:32
por Junior_C
Obrigado a todos pelas dicas, mas não teve jeito acabei usando o sprintf mesmo e tive que troca o mcu por um de 32k.