2016-09-17 5 views
-1

например, которые работают:-значение требуется в качестве левого операнда назначения

#define DIR(n,d) (d==LEFT?n.left:n.right) 

struct node { 
struct node*left; 
struct node*right; 
int value; 
}; 

struct node n; 
n.left=malloc(sizeof(struct node)); 
n.right=malloc(sizeof(struct node)); 

DIR(n,d)->value=26; 

(d==1?n.left:n.right)->value=26; 

пример, который (не работает):

#define DIR(mem,d) d==LEFT?mem->left:mem->right 

или

#define DIR(mem,d) (d==LEFT?(*mem).left:(*mem).right) 

другой структура:

struct Node{ 
    char color; 
    int height; 
    Node* parent; 
    Node* left; 
    Node* right; 
    Container*data; 
}; 

В основной функции я сделать следующее:

Node*temp; 
Node*mem=malloc(sizeof(Node)); 
d=LEFT; 
temp=malloc(sizeof(Node)); 
DIR(mem,d) = temp; 

Ошибка: именующим требуется в качестве левого операнда назначения DIR (MEM, д) = темп;

спасибо.

+0

В сообщении об ошибке указано, что очистить. Значение LHS не является значением lvalue. Это происходит, когда вы слишком задумываетесь о макросах. Решение: не используйте такие макросы. Они не стоят хлопот, которые вы получаете при отладке и не оставляете печатать. Что случилось с 'mem-> left'? (FYI: 'p-> m' ** идентичен ** на' (* p) .m'. Не используйте последнюю (более типичную, менее ясную). – Olaf

+0

Итак, какой ответ будет? do? Как я мог получить доступ к элементу структуры во втором случае? –

+0

Чтобы улучшить ваш вопрос, удалите все, что «работает». Вам нужно только опубликовать то, что не работает. Существует около 4 строк соответствующей информации и куча У меня есть код: –

ответ

3

Тройная оператор не дает именующее выражение в C. Одним из вариантов является:

#define DIR(n,d) *((d)==LEFT?&(n).left:&(n).right) 

Обратите внимание, что вы должны все скобки использования параметров макроса.

+0

Спасибо. Я исправляю свой код. –

+1

Я действительно пробовал это, и он тоже не работает, теперь я пытаюсь получить доступ к чему-то не в структуре или объединении –

+1

@MM, вам нужно разыменовать пройденный указатель: '#define DIR (n, d) * ((d) == 2? & ((* N) .left): & ((* n) .right)) ' –