我有一个简单的typedef(typedef int set [4])和它的创作。 我有一个函数,它将这个typedef中的3个作为参数。
现在,我希望根据输入使用参数调用函数。 例如,如果输入是A,D,R(假设已经创建了那些),那么该函数将被称为func(A,D,R)。
我曾尝试使用swich来匹配char,然后发送适当的参数,但它太乱了,我尝试了其他一些东西,但我无法在输入和对象名称之间建立联系。
我顺便把它写在C语言中。 任何帮助都是apreciated
答案 0 :(得分:1)
如果我正确理解了这个问题,那么您有要转换为具有该名称的变量的字符.. 'A'
成为set A
?
滚动这个假设,这是一种方法:
#include <assert.h>
set func(set x, set y, set z);
// Global definitions for all set variables.
struct sets {
set A;
set B;
set C;
...
set Z;
} allSets;
set callFuncForParams(char c1, char c2, char c3)
{
set *x, *y, *z;
// Make sure the input is legal
assert(c1 >= 'A' && c1 <= 'Z');
assert(c2 >= 'A' && c2 <= 'Z');
assert(c3 >= 'A' && c3 <= 'Z');
x = (set *)&allSets + c1 - 'A';
y = (set *)&allSets + c2 - 'A';
z = (set *)&allSets + c3 - 'A';
return func(*x, *y, *z);
}
另一种方法,如果你不将所有字母都作为变量,特别有用的方法是创建一个struct { char c; set s; }
数组,然后通过该数组找到你的变量。您可以使用宏和#运算符来生成该数组。
答案 1 :(得分:0)
听起来你想要按名称传递参数。假设情况如此,我想到了两种方法。
如果您的设置名称确实是单个字符名称,例如A
,D
,R
等,则可以构建一个由set
指针编制的数组。字符:
set *sets[128]; // will result in a lot of unused sets, but
// indexing is fast and dead easy
sets['A'] = &A;
sets['D'] = &D;
sets['R'] = &R;
...
char s1, s2, s3;
scanf( " %c %c %c", &s1, &s2, &s3 ); // Note a complete lack of error checking
func( *sets[s1], *sets[s2], *sets[s3] ); // You *will* want to validate your inputs
如果你不想浪费相当多的空间,你可以做类似
的事情set *sets[26]; // just uppercase letters
int base = 'A';
sets['A'-base] = &A;
sets['D'-base] = &D;
sets['R'-base] = &R;
...
scanf( " %c %c %c", &s1, &s2, &s3 ); // Again, absolutely no error checking
func( *sets[s1-base], *sets[s2-base], *sets[s3-base] ); // You have been warned
这假定您使用的编码中所有大写字母都是连续的(ASCII或UTF-8)。
如果你是一个聪明的代码猴并且为你的集合使用有意义的名称,你可以使用一个由字符 string 索引的查找表,类似于以下内容:
set foo, bar, bletch...;
struct lut_entry {
char *name;
set *data;
};
struct lut_entry lut[] = {
{"foo", &foo},
{"bar", &bar},
{"bletch", &bletch},
...
{ NULL, NULL } // sentinel value
};
然后,您可以在此表中搜索每个输入:
set *lookup( const char *name, struct lut_entry *lut )
{
struct lut_entry *cur = lut;
while ( cur->name && strcmp( cur->name, name ) )
cur++;
return cur->data;
}
你打电话给:
scanf( "%s %s %s", name1, name2, name3 );
set *s1 = lookup( name1, lut );
set *s2 = lookup( name2, lut );
set *s3 = lookup( name3, lut );
if ( s1 && s2 && s3 )
func( *s1, *s2, *s3 ); // note dereference operations!
else
// one or more of name1, name2, and name3 are invalid
// handle as appropriate
根据您管理的套件数量以及此应用程序的速度至关重要,您可能需要查看比无序线性阵列搜索更复杂的内容,但它不值得努力,如果它不到十几个左右。
为什么我没有将名称传递给func
并让它完成所有查找工作?你绝对可以做到这一点,但这意味着func
必须通过全局变量与调用者共享状态,我尽量避免使用它,这意味着func
总是必须进行查询,无论您是否想要它。最好让func
按原样接收集合并让调用函数执行查找,因为调用函数知道它是否由用户输入驱动。