这是关于C
编程语言。
我有大量的二维数组(大小不固定
)。考虑以下示例。
bool sym_a[][]={{...},{...},...}; //consider these are initialized properly
bool sym_b[][]={{...},{...},...};
...
bool sym_z[][]={{...},{...},...};
bool sym_0[][]={{...},{...},...};
bool sym_1[][]={{...},{...},...};
...
bool sym_9[][]={{...},{...},...};
...
请注意命名约定,所有名称都是相似的。只有数组名称的最后一个字符发生变化(如果它可以是多个字符更好,但这并不重要)。
好吧,现在我有了一个函数。它根据传递的参数选择这些二维数组之一。然后对选定的阵列执行一些任务。请注意,该任务是一项常见任务,仅更改选定的数组。
比如,根据我目前能想到的,是的,switch-case,我可以实现如下功能。
void doStuff(char letter){
switch(letter){
case 'a':
sym_a[0][0]=1; //just for demonstration :D
break;
case 'b':
sym_b[0][0]=1; //same thing, only the character 'a' changed to 'b'
break;
...
case 'z':
sym_z[0][0]=1;
break;
case '0':
sym_0[0][0]=1;
break;
case '1':
sym_1[0][0]=1;
break;
...
...
}
}
但一定有更好的方法。如果我有1000个这样的数组,那么我是否必须写1000个这样的情况?对于所有情况,内容都是完全相同的。变量名中只有一个字符会发生变化。
如果有字符串连接之类的东西就好了。
#define conc(a,b) a ## b
然后conc(sym_,a)
将代表sym_a
。但这不能直接应用在这里。因为我无法将确切的字母传递给 conc(a,b) 的右侧参数,所以只能传递包含所需字母的变量。
void doStuff(char letter){
conc(sym_,letter)[0][0]=1;
}
conc(sym_,letter)
给出 sym_letter
。但我需要将 sym_
与字符变量 letter
的内容连接起来。
例如,如果我调用 doStuff('b');
,则应给出 sym_b
,而不是 sym_letter
。
希望我的要求清楚。这件事看起来很简单,但我想不出办法摆脱它。请注意,二维数组的大小(行数/列数)不固定。否则我可以使用 3D 数组。
任何想法都值得赞赏。
最佳答案
您有大量的静态数组,因此您最终可能会使用大量的条件来访问它们,这可能是一个自然的扩展。
您可以定义一个额外的静态数组,将字符代码映射到数组。
static const struct {
char* lookup_code;
bool **array;
} char_code_lookup[] = {
{ .lookup_code = "a", sym_a },
{ .lookup_code = "b", sym_b },
/* ... */
{ .lookup_code = NULL, NULL }, /* Terminator */
};
然后,您的 doStuff
函数可以扫描数组,查找适当的查找代码以与静态定义的数组匹配。
通过一些宏魔法,您可以同时生成静态数组和静态查找数组以减少重复,但上面列出的方法可能更容易阅读。
或者,您可以使用 malloc
动态分配数组,同时在运行时创建数组时关联查找代码。
关于c++ - C 中的字符串连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15674325/