2

次のような構造を作成しました。

typedef struct {
  float real, img;
} cmplx;

そして次のように関数を作成しました:

void input(cmplx *a){
  scanf("%f + %f i", &a->real, &a->img); }

main から次のように関数を呼び出しました。

cmplx a;
input(&a);

scanfに達すると実行が停止します。float を int に置き換えれば、問題は解決します。この振る舞いは何ですか?私の問題に float を使用する方法はありますか?

プログラムは、MS-WINDOWS XP の Turbo C でコンパイルされました。

4

2 に答える 2

2

プログラムの実行が停止するというエラーメッセージを知らずに答えるのは難しいですが、「コンパイラに浮動小数点ライブラリをリンクするように伝えるために記述できるコードはありますか」というコメントから、この問題である可能性があると思われます。

「浮動小数点形式がリンクされていません」は、Borland ランタイム エラーです (Borland C または C++、Turbo C または C++)。Borland のコンパイラは賢く、必要でない限り浮動小数点 (fp) ライブラリにリンクしないように努めています。悲しいかな、彼らは皆、決定を間違っています。よくあるケースの 1 つは、fp 関数をまったく呼び出さずに、scanf() または printf() 呼び出しに %f またはその他の fp 形式がある場合です。解決策は、fp 関数を呼び出すか、少なくともリンクに存在するように強制することです。

これを行うには、この関数をソース ファイルのどこかに定義しますが、呼び出さないでください。

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

リンクに含まれるモジュール内にある限り、メイン プログラムと一緒にモジュール内にある必要はありません。

Borland C++ 3.0 を使用している場合は、README ファイルに、多少見栄えの悪い回避策が記載されています。プログラムに次のステートメントを挿入します。

extern unsigned _floatconvert;
#pragma extref _floatconvert

この回避策または最新のコンパイラを使用すると、問題が解決する可能性があります。

于 2013-02-04T03:59:22.203 に答える
1

問題は、TurboCのような古いCコンパイラを使用することです。これは、私にとっては正常に機能するためです(私は、DevC ++を使用しています)。同様の問題については、このディスカッションを確認してください。

于 2013-02-04T02:46:57.590 に答える