2017-07-27 79 views
0

我試圖做一個多維數組,持有武器及其附件: 我有很多陣列是這樣的:獲取3D字符的大小*陣列

char *G18[19] = { "glock_mp", "glock_akimbo_mp", "glock_eotech_mp", "glock_fmj_mp", "glock_reflex_mp", "glock_silencer_mp", "glock_xmags_mp", "glock_akimbo_fmj_mp", "glock_akimbo_silencer_mp", "glock_akimbo_xmags_mp", "glock_eotech_fmj_mp", 
     "glock_eotech_silencer_mp", "glock_eotech_xmags_mp", "glock_fmj_reflex_mp", "glock_fmj_silencer_mp", "glock_fmj_xmags_mp", "glock_reflex_silencer_mp", "glock_reflex_xmags_mp", "glock_silencer_xmags_mp" }; 

但所有武器不屬於同一類別,fe AK47是一個突擊步槍,而這個G18是機槍。所以我創建二維數組,其represnt一類,像這樣:

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

所以現在我有武器分類我創造了另一個數組,應持有的類別,例如:

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

訪問武器像

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

工作得很好。我面臨的問題是我無法獲得行和列的大小。 F.E.如果我想知道有多少武器類的都是我會做:

sizeof(WEAPONS) 

這給了我7.如果我想知道有多少assaultrifles有我做的:

sizeof(WEAPONS[assaultrifles]) 

但這裏的問題:這給了我4雖然assaultrifle的數組大小爲9:

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

返回4藏漢如果我這樣做:

sizeof(WEAPONS[assaultrifles][ak47]) 

即使ak47的數組大小是39.任何想法爲什麼它不工作,我怎麼能實現這個?預先感謝,並對長文本感到抱歉!

+0

請不要成爲[三星程序員](http://wiki.c2.com/?ThreeStarProgrammer)。使用諸如'std :: string','std :: vector'以及對象和引用。 – NathanOliver

+0

@NathanOliver我只能使用char(不要問它就是這樣,因爲這個項目是爲了一個遊戲而且所有的遊戲輸入都在char *和.c_str()中混合了遊戲中的字符串)。還idk如何使用向量,所以如果你能給我一個很好的例子:) – SupaDupa

+0

你總是得到4,因爲你實際上得到的指針大小以字節爲單位。 – DimChtz

回答

2

在C或C++中,運行時不存在「獲取數組大小」的情況。您可以使用sizeof獲取數組的大小(使用[<size>]聲明),因爲它的大小在編譯時已知。當你得到sizeof一個指針,你是從字面上瞭解有多少字節的指針發生,這就是爲什麼你會得到4.如果你想知道在運行時的矢量的大小,典型的選項包括:

  • 使用一般情況下爲std::vectorSTL containers。有一百萬個教程和例子可以查看。
  • 不是存儲原始數組(或指向數組的指針),而是存儲包含指向數組的指針和大小的簡單struct s或class es。這有點像滾動你自己的,有限的std::vector,你必須小心在必要時正確釋放內存等,所以我不知道這是一個很好的選擇。
  • 一些其他類似於C的技巧,比如在每個數組的末尾添加NULL/nullptr,然後遍歷整個事物,直到每次需要查找大小時都到達它。效率低下且容易出錯。

因此,是的,總之,使用std::vector或其他容器。

+0

謝謝你的答案,我目前正在如何使用std :: vector :) – SupaDupa