2012-03-21 9 views
3

これはとてもイライラです!なぜこれが起こっているのか分かりません。私はweirdDLL.cと呼ばれるファイルを持っている:DLLで正しい値を返さない関数

double five() { 
    return 5.0; 
} 

私はweirdTest.c

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

int main(int argc, char** argv) { 
    double f = five(); 
    if (f != 5.0) { 
     printf("Test failed with %f", f); 
     return 1; 
    } 
    return 0; 
} 

私は期待と呼ばれる別のファイルを持ってコンパイルし、DLL、コード内でリンクされたときに、そのweirdTestはエラーなしで終了します。私はコマンドでGCC(cygwinの)を使用してのWindows 7 64ビットでコンパイルしています:

gcc -c weirdDLL.c 
gcc -shared -o weirdDLL.dll weirdDLL.o 
gcc -o test weirdtest.c -L./ -l weirdDLL 
./test 

出力は次のとおりです。

Test failed with 0.000000 

ので、DLLが正しくリンクされつつあるように思えコンパイラは関数 "five"が不足していると不平を言うことはありません。また、私は、DLLコードにprintステートメントを置く、彼らは上手く表示されます。私は何を間違えたのですか?

+1

http://stackoverflow.com/questions/9780930/correct-answer-before-return-incorrect-after-return同じ問題があります。関数 'five()'の宣言/プロトタイプが必要です。 'main()'がそれを呼び出す前に、コンパイラは 'int'を返さないことを知っています。 –

+0

@Michael Burr:問題はありました、ありがとう! DLLは赤ちゃんだった。しかし、なぜコンパイラはintを期待していますか?関数プロトタイプはDLLコードで利用でき、戻り値もdoubleに代入しています。 – Mark

答えて

5

されているかどうかを確認する:

あなたはweirdTest.cで5つのプロトタイプを宣言しているようではないので、コンパイラはその関数の戻り値の型をintとして扱います。結果のintからdoubleへの変換は、元のdouble値を乱します。

+0

あなたの野生の推測は正しいようです:)しかし、@Michaelはあなたよりも速く_just_でした。それにもかかわらず、+1! –

+0

残念ながら、マイケルは答えとしてコメントを投稿しましたので、これを正しくマークします。ありがとう! – Mark

+0

私は、この物語の道徳は、物事がうまくいかないときは、コンパイラの警告を見て修正するべきだと思います。理由のために警告がそこにあります! – SecurityMatt

0

使用DUMPBIN(windwos)またはナノメートル(Linux)のDLL

からエクスポート機能をリストし、5は()だけで野生の推測エクスポートまたはない