2012-01-11 22 views
3

私は浮動小数点型の変数を含む構造体を持っています。私は、構造体へのポインタを使用して値を読み取ろうとしています。ここでは、コードがあります:ポインタを使用して構造体値を読み取る

struct mas { 
    float m; 
}; 

int main(void) 
{ 
    struct mas *ms; 
    ms=(struct mas*)malloc(sizeof(struct mas)); 
    scanf("%f",&(ms->m)); 
    printf("%f",ms->m); 
    return 0; 
} 

しかし、プログラムを実行するには、次のエラーが発生します。

scanf floating point formats not linked 

使用コンパイラは、Windows PC上のBorlandのTurbo C++(3.0)です。なぜこれはそうですか?

+3

'malloc'の戻り値をキャストする必要はありません。 –

+0

私は、Visual Studio Expressのような最新のコンパイラ(TC++ 3は20歳です)を入手する方が良いと思います。 –

+0

はこのStackOverflowの質問への答えをご覧ください。 http://stackoverflow.com/questions/6223453/how-to-enable-linking-floating-point-library-in-turboc –

答えて

5

これが役に立つかもしれません:記事からhttp://www.faqs.org/faqs/msdos-programmer-faq/part2/section-5.html

また

Borland's compilers try to be smart and not link in the floating- point (f-p) library unless you need it. Alas, they all get the decision wrong. ... (To force them to link it) define this function somewhere in a source file but don't call it:

static void forcefloat(float *p) 
{ 
    float f = *p; 
    forcefloat(&f); 
} 

If you have Borland C++ 3.0, the README file documents a slightly less ugly work-around. Insert these statements in your program:

extern unsigned _floatconvert; 
#pragma extref _floatconvert 
+0

は、以前のMS-DOS時代に640KBのmem制限ですが、最近では... –

1

私は下にこのコードをコンパイルして実行することができていますGCC 4.2.1:

#include <stdlib.h> 
#include <stdio.h> 

struct mas{ 
    float m; 
}; 

int main() 
{ 
    struct mas *ms; 
    ms=malloc(sizeof(struct mas)); 
    scanf("%f",&(ms->m)); 
    printf("%f\n",ms->m); 
    return 0; 
} 

#includeステートメントはありませんか?結果をmalloc()にキャストする必要はないと思います。

3

Why is this so..

古くて役に立たないコンパイラにはa bugがあるので、浮動小数点演算を適切に処理する新しいものにアップグレードします。

GCCの最新バージョンをお勧めします。また、マイクロソフトのVisual C++ Expressパッケージを無償でダウンロードすることもできます。このパッケージは、コンパイラをワールドクラスのIDEにバンドルしています。

+0

よく説明されて、素晴らしい提案です。 – Fletch