1

さて、衝突テストを行う必要があります。この方法は最も簡単に思えましたが、私のコンパイラはそうではないと考えています。返信ありがとうございます。

C++ コード:

int sqrd(int num) { return (num*num); } //squares a number

bool checkColShip() {
  for(int x = 0;x < 10;x++) {
    double distance = 0; //use to be int tried to change it
    distance = abs( sqrt( sqrd((one.getXPos() - asteroid[x].getXPos()) +
                          sqrd((one.getYPos() - asteroid[x].getYPos()))
                   ); //include cmath
    distance -= 20;//ship radius
    distance -= 20;//asteroid radius
    if (distance<=0) return true;//collision true
  }
  //no collision
  return false;
}

コンパイラ エラー:

c:\documents and settings\all users\documents\c++ projects\learn sdl\learn sdl\main.cpp(702): error C2668: 'sqrt' : ambiguous call to overloaded function
c:\program files\microsoft visual studio 10.0\vc\include\math.h(589): could be 'long double sqrt(long double)'
c:\program files\microsoft visual studio 10.0\vc\include\math.h(541): or       'float sqrt(float)'
c:\program files\microsoft visual studio 10.0\vc\include\math.h(127): or       'double sqrt(double)'
while trying to match the argument list '(int)'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

PS私は通常コードをインデントしますが、初めてここに投稿すると、問題が発生し続けました。

4

4 に答える 4

5

エラーは、使用可能なsqrt()関数が 3 つあり、それを に渡すときに明らかな選択肢がないことを示していintます。

パラメータをキャストするか、キャストするfloatかを決定する必要があります。doublelong double

あなたの質問とは関係ありません-コードは常に実数で負でない数値を に渡しているsqrt()ため、平方根は常に実数で負ではありません。結果を に渡すabs()必要はありません。

于 2012-07-20T09:26:59.730 に答える
2

衝突の場合、平方根を実行する必要はありません。距離の二乗が衝突距離の二乗よりも小さいことを確認してください

int square(int value) {
    return value * value;
}

bool collide(Object ship, Object asteroid, int collision_distance) {
    int distance_squared = square(xdiff(ship, asteroid)) +
                           square(ydiff(ship, asteroid));
    return distance_squared < square(collision_distance);
}

実際に表示されたエラーは、 が をsqrd返し、 ;intsqrtとらないためです。int浮動小数点引数には 3 つの異なるバージョンがあります。コンパイラは最適な選択を知りませんでした。もちろん、最善の選択は、そもそも問題を回避することです。

于 2012-07-20T09:59:19.857 に答える
1

sqrtには「double」または少なくとも「long」が必要です。しかし、sqrdはintです。

于 2012-07-20T09:24:09.633 に答える
0

sqrt( sqrd((one.getXPos() - asteroid[x].getXPos()) は、tugrul が既に述べたように、ここでの問題です。

しかし、そもそも数秒前に二乗した数値の平方根を描きたいですか? 違いを int にキャストして、コンマを削除してみませんか?

それとも待って...これはピタゴラスの話ですよね?どちらの場合も、トゥグルルが正しいです。sqrt は long double または double でのみ機能します。したがって、sqrd が 'double' を返すようにすると、エラーはなくなります。

于 2012-07-20T09:31:12.793 に答える