scanf : floating point formats not linked
Abnormal program termination
Atormentado com este bug sem solução? Sua vida de programador no TurboC fica tumultuada quando quer usar números não inteiros? Acha que a Borland é incompetente? Talvez tenha razão, mas…
SEUS PROBLEMAS ACABARAM!!!
Eu estava realmente encafifado com este famigerado problema. Ele ocorre às vezes quando executamos nosso programa e dá erro quando vai ler alguma variável do tipo float. Pesquisei e encontrei a explicação. Há não apenas uma, mas duas maneiras de dar um jeito para solucionar. Testei apenas uma: basta inserir o trecho a seguir no início do código-fonte do seu (outrora infeliz) programa:
extern unsigned _floatconvert; #pragma extref _floatconvert
Agradeçam por esta “mágica” ao cidadão Jeffrey Carlyle, que mantém um site de perguntas e respostas a respeito de programação para MS-DOS a partir de uma coleção de mensagens da antiga Usenet. O endereço deste achado: http://www.faqs.org/faqs/msdos-programmer-faq/part2/section-5.html
O que acontece, pelo que entendi, é que o Turbo C, tentando ser inteligente, não inclui na link-edição do programa (veja a definição disto na Wikipedia anglófona) a biblioteca de ponto flutuante a não ser que seja ostensivamente necessária (desinteligência artificial!), ou seja, apenas inclui a biblioteca se houver alguma função que explicitamente utilize ponto flutuante. Acontece que em certas situações ele não acerta em sua escolha, principalmente quando utilizamos %f em funções de entrada/saída como scanf e printf.
A solução acima, segundo o site supracitado, pode ser encontrada no arquivo README do Borland C++ 3.0. Contudo, bastaria incluir em seu código-fonte qualquer referência a uma função de ponto flutuante, sem chamar a mesma. A sugestão dada é:
static void forcefloat(float *p)
{
float f = *p;
forcefloat(&f);
}
Espero que isto seja de alguma ajuda eventualmente. Para mim, foi.
Artigo publicado originalmente no fórum do curso de Sistemas de Informação do Centro Universitário de Maringá.

Comentários