Subsistir

Tecnologia para ser consumida.
Informação para ser digerida.


Web Subsistir

Sobre o autor

Dalton Scavassa

Dalton Scavassa
Maringá, PR, BR

Arquivo

Feedburner   Atom 0.3 feed
Licença Creative Commons   Firefox
Linux Registered User   The Ubuntu Counter Project - user number # 4764
Blogger  

Fique sempre informado sobre as atualizações do Subsistir - Informe seu e-mail:


last.fm

Últimas músicas executadas:
Last.fm

Bandas mais ouvidas:
Last.fm ranking de músicas

 

Terça-feira, Agosto 22, 2006

Bug do Borland Turbo C


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á.

0 Comentários:

Faça um comentário

Creative Commons License © 1998-2006 Dalton Scavassa.
O conteúdo redigido pelo próprio é aqui publicado sob uma Licença Creative Commons.