根据输入向函数发送参数

时间:2015-05-12 15:21:38

标签: c function input parameters

我有一个简单的typedef(typedef int set [4])和它的创作。 我有一个函数,它将这个typedef中的3个作为参数。

现在,我希望根据输入使用参数调用函数。 例如,如果输入是A,D,R(假设已经创建了那些),那么该函数将被称为func(A,D,R)。

我曾尝试使用swich来匹配char,然后发送适当的参数,但它太乱了,我尝试了其他一些东西,但我无法在输入和对象名称之间建立联系。

我顺便把它写在C语言中。 任何帮助都是apreciated

2 个答案:

答案 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)

听起来你想要按名称传递参数。假设情况如此,我想到了两种方法。

如果您的设置名称确实是单个字符名称,例如ADR等,则可以构建一个由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按原样接收集合并让调用函数执行查找,因为调用函数知道它是否由用户输入驱动。