这是关于C
编程语言。
我有大量的2D数组(sizes are not fixed
)。请考虑以下示例。
bool sym_a[][]={{...},{...},...}; //consider these are initialized properly
bool sym_b[][]={{...},{...},...};
...
bool sym_z[][]={{...},{...},...};
bool sym_0[][]={{...},{...},...};
bool sym_1[][]={{...},{...},...};
...
bool sym_9[][]={{...},{...},...};
...
注意命名约定,所有名称都相似。只有数组名称的最后一个字符会发生变化(如果它可以是多个字符,那就更好了,但这并不重要。)
好的,现在我有了一个功能。它根据传递的参数选择其中一个2D数组。然后使用所选数组执行一些任务。请注意,任务是常见任务,只有所选数组才会更改。
例如,根据我目前的想法,是的,切换案例,我可以实现如下的功能。
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
。
希望我的要求清楚。这件事看起来很简单,但我想不出办法摆脱这个。请注意,2D阵列的大小(行/列数)不固定。否则我可以使用3D阵列。
任何想法都表示赞赏。
答案 0 :(得分:1)
你有大量的静态数组,所以它可能是一个自然的扩展,你最终会有大量的条件来访问它们。
您可以定义一个将字符代码映射到数组的附加静态数组。
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
动态分配数组,同时在运行时创建数组时关联查找代码。
答案 1 :(得分:1)
这样的事情有帮助吗? [抱歉,如果这里有一些C ++。 ]
bool** sym_a;
bool** sym_b ;
bool** sym_z;
bool** sym_0;
bool** sym_1;
bool** sym_9 ;
unsigned lowestEntry = 'a';
unsigned highestEntry = '9';
const unsigned numEntries = highestEntry - lowestEntry;
size_t size = sizeof(bool**)* numEntries;
bool*** lookup = (bool***)malloc(size);
#define conc(a,b) a ## b
#define index(a) #a[0]-'a'
#define add(a) lookup[index(a)] = conc(sym_,a)
void init()
{
memset(lookup, 0, size);
add(a);
add(b);
add(z);
add(9);
add(k); // does not compile, sym_k not defined.
}
bool** findSymbolTable(char val)
{
return lookup[val - lowestEntry];
}
答案 2 :(得分:1)
分配一个大的int数组并将其分配给其他变量。
例如
int data [2600];
对于sym_b,将为sym_a提供前100个整数,依此类推。您将能够在这些数组中存储8 * 100 * 4个布尔值。
现在访问sym_p [x] [y]你会说你有总R行和C列:
int * start = data +(ASCIValue(p) - ASCIValue(a))* 100;
你必须从头开始读/写位号(C * x + y)。