2016-04-28 8 views
1

私はこのような二重の機能を持っている:私は値を受信し、それを印刷し、別の関数でdouble関数からの戻り値がintになるのはなぜですか?

double f(){ 
    double value=0.1234; 
    return value; 
} 

を。

printf("%f",f()); 

0.1234という値が表示されていますが、代わりに0が表示されます。私はこのようなタイプにキャストした場合 :

printf("%f",(double)f()); 

を-147923499.34のような非常に奇妙な値が印刷されます。

いくつかのチェック(printofof)の後、f()の戻り値は4バイトで、double型は8バイトであることがわかりました。

この根本的な理由は何ですか?関数から正しいdouble値を返すにはどうすればよいですか?

+8

[正常に動作するようです](http://ideone.com/IaZyOU)。あなたのエラーを示す最小限のコンパイル可能なプログラムを投稿してください。 –

+10

'f()'を呼び出したときに、プロトタイプを持っていなかったかもしれません。 –

+0

@ Alfie:これは優先順位の仕組みではなく、少なくとも2つの理由でコンパイルされていない場合です。 –

答えて

9

f()という名前のプロトタイプが範囲外にあるようです。 C89では、コンパイラはfintを返すと仮定してこれに反応します。 fの実装が実際にintを返さない場合、その動作は未定義です。

C++では、C99以降、このコードでは警告が必要です。コンパイラの出力を確認し、警告メッセージに注意することをお勧めします。警告メッセージがない場合は、警告レベルを上げてください。

プロトタイプ書き、コードを修正するには、次の関数を呼び出す前に

double f(void); 

を。関数を呼び出すコードと関数を実装するコードの両方に含まれるヘッダーファイルにプロトタイプを配置するのは正常です。コンパイラは呼び出しと実装の不一致を検出します。

+0

ヘッドファイルでプロトタイプを宣言した後、この問題は解決されました。そして私は質問のC++タグを削除しました。 – Akr

+1

@Akr Cool。あなたのプログラムの他の場所に似たようなエラーがある場合に備えて、コードの修正されていないバージョンに対してコンパイラの警告が出ていることを確認することをお勧めします –