根据另一个变量的内容打印一个变量

时间:2011-04-29 04:26:24

标签: c++ c

我有一个类似于下面的函数,它接受一个整数作为参数,并使用这个整数我想访问一个特定的变量。 当然,我可以使用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多个单独的元素,因此将它们全部组合成一个巨大的阵列变得有点不切实际。如果有可能,我正在寻找一种避免这种方法的解决方案,尽管我目前正在认真考虑它。

4 个答案:

答案 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 ] ...
}