2011-02-23 10 views
1

まずはこれは私の最初の質問stackoverflowです。私は宿題を完成しようとしていますが、何が間違っているのか分かりません。C++奇妙なエラー "intから 'int(__cdecl *)(float、float)への変換なし" "

2回目の関数を実行しようとすると「intから__cdecl *(float、float)に変換されません」というエラーが発生します。この関数は0、-1、または+1のいずれかを返すと仮定され、それはif/else文で使用されます。ここで私が参照しているコードの塊だ

...

#include <iostream> 
using namespace std; 


////this function returns a -1 if the left pan has a weight more than the right, a 0 if the weights of the two pans are equal, and a +1 if the right pan has a greater weight than the left 
int weigh(float leftpan, float rightpan) 
{ 
//compare the pan weights, return value 
} 


float findOddRock(float r1, float r2, float r3, float r4, float r5, float r6, float r7) 
{ 
    //first weigh 
    float first_leftpan = r1 + r2; 
    float first_rightpan = r3 + r4; 

    weigh(first_leftpan, first_rightpan); 
    if(weigh == 0){ 
     cout << "this program is working so far"; 
     float second_leftpan = r5; //this brings up an error for some reason 
     float second_rightpan = r6; 
     weigh(second_leftpan, second_rightpan); 


//here's where I get the error, no conversion from 'int' to 'int (__cdecl *)(float,float)' 
     if(weigh == 0){ //be careful here, changed from second_weigh to weigh 
      float third_leftpan = r5; 
      float third_rightpan = r7; 
      weigh(third_leftpan, third_rightpan); 
} 

// 
int main() 
{ 
//find the light rock 
findOddRock(2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 1.0); 
} 

答えて

0

いただきました!これでアップ:

if(weigh == 0) 

は、なぜあなたは0に機能を比較していますか?私はあなたが本当にやるためのものだと思い

if(0 == weigh(blah, blah)) 

次はあなたが少なくとも重量で石を見つけようとしているあなたのロジックの問題

を解決することでした。 使用する必要があるのはソートです。あなたはこのCのことを初めて知っているので、this article

floatの配列をソートする関数を作成します。最下位要素(または昇順配列の1番目の要素)は奇妙な石です。

1

問題はここにある:

if(weigh == 0) 

あなたがゼロに機能weighを比較しようとするのではなく、戻り値を含む変数を比較しています。あなたは0に関数の戻り値を比較するよう

+0

私はアドバイスを受け取りましたが、今度はプログラムが実行されますが、findOddRockは含まれている文字列を返しません。いずれかの文字列を返さない関数の問題は何ですか? – Charli

3

はルックス:

weigh(first_leftpan, first_rightpan); 
    if(weigh == 0){ 

はやってみてください:

if(weigh(first_leftpan, first_rightpan) == 0){ 

また機能weightはそのanything..fix戻っていません。

==の2つの浮動小数点数を比較しようとしている場合は、浮動小数点の不正確さが警告されます。

+0

私はそこに全体の重量関数を入れていませんでしたが、簡潔にするために値を返すように設定しました。 編集:浮動小数点の不正確さについては、どういうことがありますか? – Charli

+0

@Charliあなたはfloatとintを比較しています。これは、小数点以下のものが比較で考慮されないことを意味します。あなたがしたいことは、浮動変数を浮動小数点数と比較することです。 – Reno

+0

関数を何かに戻すように関数を変更するにはどうすればよいですか?私はストリングを返すだけで、どの岩が奇妙で、どのような重さであるのかを言っています。 – Charli

0

ゼロ

に あなたは(左辺値として関数の名前)関数のアドレスを比較しようとしている(0 ==量る)場合は、あなたが持っているよう== 0は、真なることはありません量ると定義された重量。

私は、これはあなたが望むものであると信じて:

int型の結果=比較

(weigh == 0) 

機能を比較している(結果は== 0)

+0

これは機能のアドレスではない。 'int(* func)(float、float)= weigh;'は関数のアドレスです。 – Marlon

0

場合(first_leftpan、first_rightpan) を量ります整数へのポインタ。最初のインスタンスではなく2番目のインスタンスにエラーが表示される理由は、コンパイラの成果物です。私はあなたが最初に似たようなエラーが表示されるエラーを与える行をコメントアウトすると、かなり確信しています。 (コンパイラによっては0をポインタに暗黙的に変換して比較を許可するかもしれませんが、おそらく閉じ括弧がないためにエラーが表示されることがありますか?)

それに関係なく、計量の呼び出しの結果、戻り値を取得して比較に使用する必要があります。

2

上記のすべての人は正しいですが、エラーメッセージがあなたに伝えていることについて話しましょう。

weighは、すでに知っているように、floatを2つ受け取り、intを返す関数です。

So.あなたがweighを呼び出すことから得られる値はintです。だからあなたの基本的な考え方は正しいです。

でも、if(weigh == 0)と書いたとき、あなたは本物の部分である()を残しました。それは、関数を呼び出すためのC/C++の構文です。 weighは、関数の名前であり、関数の名前は「アドレス」と同じです。引数が、その関数の完全な名前を含める++ C/Cの関数の完全な名前は、本当にint

  • は二つの引数(float, float)
  • を取って戻っ

    • C形式の関数_cdecl
    • です

      と記号weighは、その機能のアドレスであり、複雑な理由から、あなたがまだ見ていないと想像して、フルタイプのweighint(_cdecl*)(float,float)に変更します。

      だから何のエラーメッセージが言っていることは、整数の比較は2つのintの間でなければなりません」ですが、あなたが私を与えたことは2つのfloatの引数を持つintや関数のアドレスであるintを返す。私は」理解するのはあまりにも愚かです」

    +0

    これは本当に役に立ちます。どうもありがとうございます! – Charli

    関連する問題