まず、変数 "a"と "b"はポインタです。あなたのコード: layer-> tileGids = new int [a] [b] は問題の根本原因です。
私はここであなたの意図を推測しようとしています。あなたがしようとしているのは、レイヤーのサイズグリッド(mapSize.Width、mapSize.height)を参照する2次元配列です。 layer.tileGids [x] [y]を使用して、グリッド内の各「セル」を参照することができます。
実際に2次元配列を作成しようとする場合は、2つの方法があります。
方法1:
class Layer {
int ** tileGids; // NOTE the "**" to indicate tileGids is a pointer to pointer i.e. 2D array.
}
はそれを初期化するには:
int value = layer.tileGids[x][y] // where 0 <= x < width and 0 <= y < height
このデータの割り当てを解除するには:
int width = map->mapSize.width;
int height = map->mapSize.height;
layer.tileGids = new int*[width]; // NOTE the "int*" to indicate tileGids is a new array of pointers to int.
for (int i = 0; i < width; i++) // Initialize each element in layer.tileGids[] to be a pointer to int.
{
layer.tileGids[i] = new int[height];
}
は、今あなたが使ってlayer.tileGidsのアイテムにアクセスすることができますあなたがそれをどのように割り当てるかと同様に、あなたはdealloc
for (int i = 0; i < width; i++)
{
delete [] layer.tileGids[i]; // Deallocate each row.
}
delete [] layer.tileGids; // Deallocate "array" to the pointers itself.
方法2:
次に別の簡単、より少ない厄介な方法は、(ポインタを避ける)C++ベクトルクラスを使用することで、各「行」における各動的に割り当てられた配列を食べました。
#include <vector>
class Layer {
vector<vector<int> > tileGids; // Note the space at "<int> >".
}
を初期化するには:あなたは、以下の変更を加える必要があるベクターを用いて、第二の方法のために、あなたが持っていないことを
int value = layer.tileGids[x][y]; // Where 0 <= x < width and 0 <= y < height
注:
int width = map->mapSize.width;
int height = map->mapSize.height;
layer.tileGids = vector<vector<int> >(width, vector<int>(height, 0)); // Initialize all entries to 0.
が要素にアクセスするにはベクトルが自動的に世話をするため、最初のメソッドで必要とされるようなメモリクリーンアップを行う必要があります。しかし、ベクトルが動的に成長することができる、つまりアイテムを追加することができるので、固定サイズの配列を持つ安全性が失われます。つまり、ベクトルメソッドを使用すると誤ってグリッドのサイズを大きくすることができます。しかし、上記の最初の方法を使用して初期化した場合、エラーが発生し、何かが間違っていることがすぐにわかります。
-1。これをコンパイルしようとするとどうなりますか?コンパイラからエラーが出るのか、それを実行するときに問題がありますか?どんな症状が現れているか教えてください。 –
私の悪い回答には申し訳ありません:P私はそれを削除:) –
また、定義する前に 'size'を使用しました。あなたのコードには多くの改善が必要です。 –