0

GameModelあるオブジェクトから別のオブジェクトに配列への参照を渡し、参照をPersonModel保存してから、GameModel内と同じようにPersonModel内でこの配列を操作したいのですが...

配列プロセスを渡すことについてひどい誤解があります。クラスPersonModelで、コンストラクターの参照によって配列を渡したいです(以下のコードブロックを参照)。しかし、マークされた行はコンパイルエラーをスローします

    PersonModel::PersonModel( int path[FieldSize::HEIGHT][FieldSize::WIDTH], int permissionLevel ) { 
        this->path = path; //<------ ERROR here:
        //PersonModel.cpp:14:22: error: incompatible types in assignment of 'int (*)[30]' to 'int [31][30]'

        this->permissionLevel = permissionLevel;
    }

これがヘッダーファイルですPersonModel.h

#ifndef PERSON_MODEL
#define PERSON_MODEL

#include "data/FieldSize.h"

namespace game{
    class IntPosition;
    class MotionDirection;

    class PersonModel {
        protected:
        int path[FieldSize::HEIGHT][FieldSize::WIDTH];
        int permissionLevel;

        public:
        PersonModel( int path[FieldSize::HEIGHT][FieldSize::WIDTH], int permissionLevel );
        void setMotionDirection ( MotionDirection* md);
        void step(long time);
        void reset(long time);
    };
}

#endif 

私が今見ているように、私はint path[FieldSize::HEIGHT][FieldSize::WIDTH];宣言をに変更することができますint (*path)[FieldSize::WIDTH];が、それははるかに混乱しています。

このトピックを理解するのを手伝ってください:通常の2D配列のように、配列に渡された参照を保存して後で操作するための適切な方法は何ですか。

アップデート:

この配列は、ビットマスクで表されるゲームフィールドタイルのプロパティのマップであるため、実際には読み取り専用です。クラスのカプセル化されたすべてのオブジェクトはGameModelこの配列を読み取る必要がありますが、私は間違いなくそれを複製したり、いくつかの機能を追加したりしたくありません。

Android-NDKだけのフレームワークはありません。

4

6 に答える 6

3

「Cでは配列とポインタは同じだ」と言われた人を信じるという古典的な罠に陥ったと思います。

私が最初にすることは、配列の型を定義することです。

typedef int PathArray[FieldSize::HEIGHT][FieldSize::WIDTH];

そうすれば、intの配列への参照とintへの参照の配列との間の混乱について心配する必要はありません。

PersonModelには、これらの1つへの参照が含まれています。

PathArray &path;

また、その参照であるため、コンストラクター本体ではなく、コンストラクター初期化リストで初期化する必要があります。

 PersonModel::PersonModel( PathArray &aPath, int aPermissionLevel ) :
   path(aPath),
   permissionLevel(aPermissionLevel)
 {
 }

もちろん、このような参照を保持するのは少し怖いので、ライフタイム管理をより堅牢にする代わりに、boost::shared_ptrなどの使用を検討することをお勧めします。

于 2012-10-14T19:12:40.877 に答える
2
  1. C ++の値型の場合のように、配列を割り当てることはできません。
  2. int path [x] [y]はint(*)[y]型に解決されます

考えられる解決策は次のとおりです。

  1. memcpy/copyを使用する
  2. std::arrayを使用する
于 2012-10-14T18:46:55.153 に答える
0

そのような配列に割り当てることはできません。ただし、配列の配列がある場合でも、配列が連続したメモリ領域であるという事実を使用し、たとえばmemcpy、配列をコピーするために使用できます。

memcpy(this->path, path, FieldSize::HEIGHT * FieldSize::WIDTH * sizeof(int));
于 2012-10-14T18:43:09.350 に答える
0

コードスニペットで述べたように配列を渡すことはできないため、2D配列へのポインタを渡す必要があります。STL配列型を使用することをお勧めします。確かに、std::arrayはC++'11標準であるため、古いコンパイラはそれをサポートしていない可能性があります。また、以前から存在しているベクトルを使用することもできます。

vector<vector<int>>path;

コンストラクターで2Dベクトルのサイズを変更する必要があります。インデックス作成は少しおかしいように見えます。

path[1].[1] ....

ベクトルを使用すると、参照によって渡すことができます。

于 2012-10-14T21:56:57.870 に答える
0

配列の名前は最初の要素へのポインタなので、試してみることができます

PersonModel( int (*path)[FieldSize::HEIGHT][FieldSize::WIDTH], int permissionLevel );
于 2013-12-28T23:31:33.493 に答える
-3

C ++では、配列のようなプリミティブ型に実装されていますが、配列には実装されintdoubleいません(配列はプリミティブ型ではありません)。したがって、配列を新しい配列に割り当てるために「=」を使用しないでください。代わりに、配列memcpyをコピーするために何かを使用する必要があります。memcpyメモリを別のメモリにコピーして、それを使用して配列を別のアレイにコピーできるようにします。

// memcpy( dst, src, size );
memcpy( this->path, path, FieldSize::HEIGHT * FieldSize * WEIGHT * sizeof(int) );
于 2012-10-14T18:45:46.097 に答える