2017-01-07 10 views
0

Читает C++ исходного кода, преобразования инфикса в суффиксе я использую Turbo C++не может преобразовать «Int» в «узел *»

#include <stdio.h> 
typedef struct node 
{ 
    float data; 
    struct node *next; 
} stack; 

void StackInitiate(stack **head) 
{ 
    //error 
    if(*head=(stack *)malloc(sizeof(stack))==NULL) 
     exit(1); 
    (*head)->next=NULL; 
} 

// Я получаю .. не может преобразовать ' int 'to' node * '...

может кто-нибудь сказать мне, почему так. и как его решить.

полный исходный код here

+3

Turbo C++ - я только время путешествую в 90-е? – Hogan

+0

Надеюсь, они не заставят вас использовать Turbo C++ на вашем месте учебы, и вы просто сбиты с толку ... – DeiDei

+0

Turbo C++ только касательно связан с языком C++, каким мы его знаем сегодня. Я добавил тег turboC++, и я бы рекомендовал удалить тег C++. –

ответ

3

Из-за operator precedence выражение

*head=(stack *)malloc(sizeof(stack))==NULL 

фактически эквивалентно

*head=((stack *)malloc(sizeof(stack))==NULL) 

То есть, вы задаете значение по сравнению с *head.

Вам нужно положить в свои собственные скобки, чтобы сделать это правильно:

(*head=(stack *)malloc(sizeof(stack)))==NULL 

Или еще лучше использовать оператор new который является то, что вы rreally должны использовать, чтобы выделить объект динамически в C++:

(*head=new stack)==NULL 
2

Из-за правил приоритета оператора, следующие:

if(*head=(stack *)malloc(sizeof(stack))==NULL) 

анализируется как

if(*head=((stack *)malloc(sizeof(stack))==NULL)) 

который присваивающей результат == NULL сравнению с *head.

Для сравнения нового значения *head обнулить вместо этого, использовать круглые скобки, чтобы изменить приоритет:

if((*head=(stack *)malloc(sizeof(stack)))==NULL) 

Или еще лучше, отделить задание от если условия:

*head = (stack *) malloc(sizeof(stack)); 
if(*head == NULL) 

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