Похоже, вы хотите передать параметры по имени. Предполагая, что это так, на ум приходят два подхода.
Если имена набора действительно имена односимвольных как 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).
Если вы время смарт-код обезьяны и используя значимые имена для наборов, вы можете использовать таблицу поиска, индексированный по характеру строки, что-то вроде следующего:
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
};
You то может искать эту таблицу для каждого входа:
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
получить наборы as-is и заставить вызывающую функцию выполнять поиск, так как вызывающая функция знает, ведется ли она путем ввода пользователем.
Не могли бы вы предоставить кому-то свой код? –
Если я правильно понимаю, вы хотите сделать что-то вроде: 'sscanf ("% c% c% c ", & c0, & c1, &c2); if (c0 == 'A' && c1 == 'D' && c2 == 'R ') func (A, D, R); '? – mtijanic