私のプログラムにはクラスが含まれています。簡略化された形式は次のとおりです。
Units.h:
#define fullwidth 200
#define fullheight 200
class Units
{
public:
[...]
void MovingUp(Units* Detector[fullwidth][fullheight], Units Self);
[...]
}
入力として 2 つの引数を取る関数を定義します。「Units」オブジェクトのオブジェクト ポインターの配列と、特別に選択された「Units」オブジェクトです。
主な部分は次のとおりです。
#include "Units.h"
[...]
int i,j;
Units* DetectorField[fullwidth][fullheight];
Units Examples[20];
for (j=0;j<fullheight;j++)
{
for (i=0;i<fullwidth;i++)
{
DetectorField[i][j] = NULL;
}
}
「Units」の関数に必要な「Units」オブジェクト ポインターの配列を作成し、最初にこれらすべての値を NULL に設定します。
その後、ランダムに選択された 1 つのポインターを介してオブジェクトの関数を呼び出そうとします。明らかに、ポインターが NULL を参照している場合、呼び出しは不可能ですが、Visual C++ はプログラムを実行する前でもエラーを表示します。
DetectorField[12][12]->MovingUp(DetectorField,DetectorField[12][12]);
このバージョンでは、Visual C++ はコンパイル後に書き込みます。パラメーター 2 を 'Units *' から 'Units' に変換できません。もちろん、それ自体がポインターDetectorField
の配列であるためです。次に、次のように、それが指すオブジェクトを参照しようとします。
DetectorField[12][12]->MovingUp(DetectorField,&DetectorField[12][12]);
コンパイル後の MSVC 書き込み: パラメーター 2 を 'Units **' から 'Units' に変換できません
2番目のバージョンがオブジェクトではなくオブジェクトポインターのポインターを参照する理由は明確ではありません。また、正しい方法で関数呼び出しをどのように記述すればよいですか?