2017-07-27 2 views
0

私は武器とその添付ファイルを保持している多次元配列を作るしようとしています同カテゴリーへAK47はアサルトライフルで、このG18はマシンガンです。の3D文字のサイズを取得します*アレイ

char ***WEAPONS[7] = { ASSAULTRIFLES, SUBMACHINEGUNS, LIGHTMACHINEGUNS, SNIPERS, PISTOLS, MACHINEGUNS, SHOTGUNS }; 

武器にアクセス:

char **MACHINEGUNS[4] = { G18, TMP, RAFFICA, PP2000 }; 

だから今はそうは次のように私は、カテゴリを保持する必要があります別の配列を作成した武器をソートしていますので、は次のようにだから私は、カテゴリをrepresnt 2D配列を作成しましたlike

char *weapon = WEAPONS[assaultrifle][ak47][0]; // assaultrifle & ak47 are enum mebers 

は完璧に機能します。私が直面している問題は、行と列のサイズを取得できないということです。 F.e.私は自分のしているどのように多くの武器のクラスを知りたい場合、私はどうなる:私は7を与える

sizeof(WEAPONS) 

私は私が行うがいくつあるかassaultrifles知りたい場合は、次の

sizeof(WEAPONS[assaultrifles]) 

しかし、ここです

:私はこれを行う場合、それは4 aswellを返し

char **ASSAULTRIFLES[9] = { AK47, M16A4, M4A1, FN2000, ACR, FAMAS, FAL, SCARH, TAR21 }; 

:問題は:assaultrifleの配列サイズが9であるが、これは私に4を与えます10

sizeof(WEAPONS[assaultrifles][ak47]) 

でも、ak47の配列サイズは39です。それがなぜ機能しないのか、どのように達成できたのでしょうか?事前に感謝し、長いテキストを申し訳ありません!

+0

[3人のプログラマー](http://wiki.c2.com/?ThreeStarProgrammer)にしないでください。'std :: string'、' std :: vector'、オブジェクトと参照を代わりに使用してください。 – NathanOliver

+0

@ NathanOliverプロジェクトはゲーム用で、すべてのゲームの入力はchar *で、.c_str()はある時点でingame文字列をミックスするので、charを使うことができます。また、まだベクトルを使用する方法は、私は素晴らしいことができる例を与えることができます:) – SupaDupa

+0

実際には、ポインタサイズをバイトで取得しているので、あなたは常に4になっています。 – DimChtz

答えて

2

CまたはC++では、実行時に配列の「サイズを取得する」ということはありません。コンパイル時にそのサイズがわかっているので、sizeofで配列のサイズ([<size>]と宣言されている)を得ることができます。

  • 用途:あなたはsizeofのポインタを取得するとき、あなたは文字通りあなたが4を取得し、なぜあなたは、実行時に、ベクトルの大きさを知りたい場合は、典型的な選択肢であるとする、かかるポインタバイトどのように多くなっていますstd::vectorおよびSTL containersが一般的である。あなたがそれについて調べることができる100万のチュートリアルとサンプルがあります。
  • 生の配列(または配列へのポインタ)を格納する代わりに、配列へのポインタとサイズを含む単純なstructまたはclassを格納します。これはちょうどあなた自身のローリングのようなものですが、限定されたstd::vectorであり、必要に応じてメモリを正しく解放するように注意しなければならないので、それは素晴らしい選択です。
  • 他の汚れたCのようなトリックは、すべての配列の最後にNULL/nullptrを追加した後、サイズを見つけるたびにそれが届くまで繰り返します。非効率的でエラーを起こしやすい。

したがって、要は、std::vectorまたは他の容器を使用してください。

+0

答えてくれてありがとう、私は現在std :: vector :: – SupaDupa

関連する問題