#c #arduino
#c #arduino
Вопрос:
Представьте себе этот очень надуманный пример: (Обратите внимание, что это для C со вкусом Arduino, а не для ANSI C):
typedef struct _node {
int value;
struct _node *next;
} node;
Используя это, я могу создать связанный список из двух узлов, построив список «назад»:
node nodeB = { 2, (node *)0 }; // end of list
node nodeA = { 1, amp;nodeB }; // A.next => B
Но вместо этого, что, если я хотел бы создать список с круговой связью? Это не сработает:
node nodeA = { 1, amp;nodeB };
node nodeB = { 2, amp;nodeA };
поскольку NodeB не объявляется в то время, когда NodeA хочет ссылаться на него.
Я мог бы создать связанный список во время выполнения (динамически распределять узлы, затем настраивать next
ссылки). Но есть ли способ получить действительное прямое объявление во время компиляции?
Комментарии:
1. Будет ли работать обычная прямая ссылка? Попробуйте вставить «внешний узел NodeB;» спереди.
2. @SamVarshavchik: Черт возьми, да, это работает. Я не пробовал этого, потому что страница ссылки на язык ( arduino.cc/en/Reference/HomePage ) не упоминается
extern
как языковая конструкция. Я приглашаю вас превратить ваш комментарий в ответ … 🙂3. На C (но не на C ) вы можете записать
node nodeB;
как прямое объявление4. Почему вы требуете, чтобы список с круговой связью был настроен во время компиляции? Простое присвоение формы
nodeA.next = amp;nodeB
(послеnodeA
того, как иnodeB
оба определены) — это не совсем большие затраты времени выполнения.5. Как я уже упоминал, это надуманный пример. Мой фактический вариант использования включает в себя объединение гораздо более сложных структур, и, учитывая ограничения Arduino, я бы хотел по возможности избегать динамического распределения.
Ответ №1:
Это выглядит как довольно обычная ситуация, когда прямое объявление будет работать:
extern node nodeB;
node nodeA = { 1, amp;nodeB };
node nodeB = { 2, amp;nodeA };
Комментарии:
1. Что, если им нужна внутренняя связь для обоих
2. Возможно, анонимное пространство имен, возможно:
class node { public: int x; }; namespace { extern node nodeb; }; namespace { node nodeb; };