我有一个类似于下面的函数,它接受一个整数作为参数,并使用这个整数我想访问一个特定的变量。 当然,我可以使用case / switch语句,或者if / else,但是这太脏了,我猜测必须有某种形式的优雅解决方案。
static unsigned char frame1[] = {...};
static unsigned char frame2[] = {...};
/*...*/
static unsigned char frame30[] = {...};
int select_frame(int frame_number){
/* How can I use frame_number to select the correct frame variable without case/switch, if at all? */
}
我觉得可能有一个stringstream方法(或类似的),虽然我不确定。 有什么建议?我很高兴看到C或C ++中的解决方案。
编辑:我觉得我应该注意到这些阵列中的大多数将包含500多个单独的元素,因此将它们全部组合成一个巨大的阵列变得有点不切实际。如果有可能,我正在寻找一种避免这种方法的解决方案,尽管我目前正在认真考虑它。答案 0 :(得分:4)
如果你想根据一个整数访问其中一个帧,那么只需将帧放入一个数组中:
static unsigned char* frames[30];
frames[0] = (unsigned char*)strdup("first frame's char");
frames[1] = (unsigned char*)strdup("second frame's char");
然后你可以直接有效地索引到帧[i]。
在C ++中,一种更灵活的方法是使用std::vector<std::string>
(只要你的数字是连续的)或甚至是std::map<int, std::string>
(如果你有数字有间隙,或想要插入/在运行期间经常擦除单个元素。
编辑:辅助函数,用于从现有的无符号字符数组创建字符串文字源代码(可能需要进行调整):
void f(std::ostream& os, unsigned char* p)
{
os << '"';
for ( ; *p; ++p)
{
if (*p < ' ' || *p >= 127)
os << '\\' << std::setw(3) << std::setfill('0') << std::oct << *p;
else if (*p == '\\')
os << "\\\\";
else
os << *p;
}
os << '"';
}
然后只需调用f(frame1); F(帧2);等...
答案 1 :(得分:0)
我认为在C或C ++中不可能。如果可以,为什么不拥有
static unsigned char frame[30][]
答案 2 :(得分:0)
您可以使用2D数组并使其成为单个frames
数组变量。或者,如果您可以使用char
数组,则可以使用std::string
。
static string frames[30] = { "frame1 string", "frame2 string", ..., "frame30 string" };
int select_frame (int frame_number)
{
string &check = frames[frame_number];
}
答案 3 :(得分:0)
如果您的C编译器符合C99,并且数组是在外部定义的 函数,复合文字如下可能符合目的。
static unsigned char *frames[] = {
(unsigned char[]){ 1, 2, ... },
(unsigned char[]){ 3, 4, ... },
...
};
int select_frame(int frame_number){
... frames[ frame_number ] ...
}