2017-07-27 76 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