Как составить имя переменной в одну строку, как часть вызова структуры? - PullRequest
0 голосов
/ 17 апреля 2019

Я понятия не имею, выполнимо ли то, что я пытаюсь сделать.Я довольно новичок в C.

У меня есть структура, которая содержит указатель на другую структуру, которая содержит еще один указатель на другую структуру.Последняя структура содержит два указателя на структуры, называемые «leadToCw» и «leadToCcW».У меня также есть глобальная строковая переменная dir, которая может измениться с Cw на Ccw в любой момент времени.Это выглядит примерно так:

#define concat(a,b) a##b
String dir = "Ccw"; // or "Cw"

struct Intersection {
    struct Sector *incoming;
}

struct Sector {
    struct Sector *leadingToCcw;
    struct Sector *leadingToCw;
};

Теперь, что я хочу, это вызвать LeadToCcw или LeadToCw в зависимости от строки "dir", так что вывод будет выглядеть следующим образом:

Intersection->incoming->leadingToCcw

Я пробовал что-то вроде этого:

Intersection->incomming->(dir == "Ccw" ? concat(leadingTo, Ccw) : concat(leadingTo, Cw))

но я получаю эту ошибку:

error: expected unqualified-id before '(' token

Я не знаю, стоит ли упоминать, но это для Arduinoпроект :-) Я надеюсь, что кто-то может мне помочь, или пнуть меня в задницу и сказать мне, что это невозможно!

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Нет ничего похожего на String в C. Вы можете использовать char * вместо этого, как показано ниже

char *dir = "Ccw";

if (strcmp(dir, "Ccw") == 0)
{
// Do whatever you want to do with Intersection->incomming->leadingToCcw
}
else if (strcmp(dir, "Cw") == 0)
{
// Do whatever you want to do with Intersection->incomming->leadingToCw
}
0 голосов
/ 17 апреля 2019

Почему бы не использовать обычные условия?

dir == "Ccw"? Intersection->incomming->leadingToCcw : Intersection->incomming->leadingToCw
...