Как использовать переменную для (частичного) имени переменной? (С) - PullRequest
1 голос
/ 14 октября 2010

Допустим, у меня есть функция

 void do_work (foo?);

?представляет 0 или 1, который будет значением переменной

 int bar = 0;

Есть также переменные

 int foo0 = 0;
 int foo1 = 0;

Я пытаюсь ввести значение одной переменной в имядругая переменная, чтобы функция получала полное имя любой переменной в зависимости от предшествующей логики.

Как я могу это сделать?

(В этой ситуации меня не волнует хорошее или плохоепрактика.)

Ответы [ 8 ]

4 голосов
/ 14 октября 2010

C не работает так, как вы, возможно, думаете. Вы не можете динамически ссылаться на имя переменной во время выполнения, к которой вы привыкли в других языках.

Тем не менее, имя аргументов функции не имеет значения.

void do_work(int arg)
{
} 

Вам не нужно сопоставлять имя arg с foo0 или foo1. Теперь вы можете передать любую переменную в функцию:

int foo0, foo1;

if (some_condition)
  do_work(foo0);
else
  do_work(foo1);

Теперь функция do_work будет работать с копией переданной переменной. Таким образом, если вы измените значение переменной внутри функции, она останется неизменной за пределами функции. Вы можете изменить это, вернув новое значение:

int do_work(int arg)
{
  return arg + 1;
}

foo0 = do_work(foo0);

Наконец, похоже, что вы хотите использовать массив:

int foo[2]; // create two ints: foo[0] and foo[1]

do_work(foo[0]);

int i = 1;
do_work(foo[i]);
4 голосов
/ 14 октября 2010

По специальному запросу @dreamlax:

1) объявить эти переменные как

__declspec( dllexport ) static int foo1;
__declspec( dllexport ) static int foo2;

2) Используйте HANDLE this_module = GetModuleHandle(NULL); для получения текущего модуля

3) Получить имя нужной переменной:

char vname[100];
sprintf(vname, "foo%d", bar);

4) Найдите это:

int* fooX = (int*)GetProcAddress(this_module, vname);

5) И, наконец, вы можете использовать его:

  do_work(fooX);  // or *fooX, as you like
3 голосов
/ 14 октября 2010

Используйте вместо этого массив или указатель.Вы получите к нему доступ, например, foo[ind].

2 голосов
/ 14 октября 2010

Используйте массив:

int foo[2] = {0, 0};

, а затем вы можете набрать

do_work(foo[bar]);
1 голос
/ 14 октября 2010

Чтобы сохранить исходные переменные foo1 и foo2, вы можете установить массив с указателями на эти местоположения и читать / записывать переменные через указатели в массиве.

Т.е.

int *fooArray[2];
fooArray[0] = &foo0;
fooArray[1] = &foo1;

... тогда вы можете вызвать свою функцию с помощью:

do_work(*fooArray[bar]);
0 голосов
/ 14 октября 2010

Вот плохая идея для вас:

#define foo0 foo[0]
#define foo1 foo[1]
#define foobar foo[bar]

int foo[2];
int bar;
0 голосов
/ 14 октября 2010

Поскольку вы говорите, что вас не интересует хорошая или плохая практика, вы можете реализовать желаемое поведение, не вводя никаких новых переменных:

if (bar == 0)
    do_work(foo0);
else if (bar == 1)
    do_work(foo1);
else
    puts("Uh oh, unexpected bar value!");
0 голосов
/ 14 октября 2010

массивы предназначены для хранения значений однородных типов данных, и никто не будет использовать foo0, foo1 для этого вида требований

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...