Проблема C, слева от '->' должна указывать на класс / структуру / объединение / универсальный тип? - PullRequest
2 голосов
/ 29 мая 2010

Пытаясь понять, почему это не работает. Я продолжаю получать следующие ошибки: Слева от '-> nextNode' должен указываться класс / структура / объединение / универсальный тип
(Также все строки с -> в функции new_math_struct)

Заголовочный файл

#ifndef MSTRUCT_H
#define MSTRUCT_H

    #define PLUS 0
    #define MINUS 1
    #define DIVIDE 2
    #define MULTIPLY 3
    #define NUMBER 4

    typedef struct math_struct
    {
        int type_of_value; 
        int value;
        int sum;
        int is_used;
        struct math_struct* nextNode;
    } ;

    typedef struct math_struct* math_struct_ptr;
#endif

C файл

int get_input(math_struct_ptr* startNode)
{
    /* character, input by the user */ 
    char input_ch; 
    char* input_ptr;

    math_struct_ptr* ptr;
    math_struct_ptr* previousNode;

    input_ptr = &input_ch;
    previousNode = startNode;

    /* as long as input is not ok */ 
    while (1)
    {             
        input_ch = get_input_character();
        if (input_ch == ',') // Carrage return
            return 1;
        else if (input_ch == '.') // Illegal character
            return 0;


        if (input_ch == '+')
            ptr = new_math_struct(PLUS, 0);
        else if (input_ch == '-')
            ptr = new_math_struct(MINUS, 0);
        else if (input_ch == '/')
            ptr = new_math_struct(DIVIDE, 0);
        else if (input_ch == '*')
            ptr = new_math_struct(MULTIPLY, 0);
        else
            ptr = new_math_struct(NUMBER, atoi(input_ptr));

        if (startNode == NULL)
        {
            startNode = previousNode = ptr;
        }
        else
        {
            previousNode->nextNode = ptr;
            previousNode = ptr;
        }
    } 
    return 0;
}

math_struct_ptr* new_math_struct(int symbol, int value)
{
    math_struct_ptr* ptr;
    ptr = (math_struct_ptr*)malloc(sizeof(math_struct_ptr));
    ptr->type_of_value = symbol;
    ptr->value = value;
    ptr->sum = 0;
    ptr->is_used = 0;    
    return ptr;
}

char get_input_character()
{
    /* character, input by the user */ 
    char input_ch; 

    /* get the character */ 
    scanf("%c", &input_ch);     

    if (input_ch == '+' || input_ch == '-' || input_ch == '*' || input_ch == '/' || input_ch == ')')
        return input_ch; // A special character
    else if (input_ch == '\n')
        return ','; // A carrage return
    else if (input_ch < '0' || input_ch > '9')
        return '.'; // Not a number          
    else
        return input_ch; // Number
}

Заголовок для файла C просто содержит ссылку на заголовок структуры и определения функций. Язык С.

Ответы [ 4 ]

6 голосов
/ 29 мая 2010

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

math_struct_ptr ptr;

Или напишите

struct math_struct *ptr;
2 голосов
/ 29 мая 2010

math_struct_ptr * является math_struct ** - вы создаете указатель на указатель с вложенными звездами там. Преимущество вашего typedef в том, что вам не нужно ставить * после math_struct_ptr, так что вы можете просто пропустить это

1 голос
/ 29 мая 2010

Вы вводите определение

 typedef struct math_struct* math_struct_ptr;

Итак, если вы используете math_struct_ptr*, вы получите указатель на указатель. Вы, вероятно, просто хотите math_struct_ptr в этом случае. Я бы не стал прятать указатель с typedef, но я вижу, что многие люди делают это. Я нахожу это просто запутанным. Это, наверное, дело вкуса.

0 голосов
/ 29 мая 2010

Как вы разрешаете typedef, вы будете использовать:

struct math_struct * *

вместо

struct math_struct *

Просто используйте определение типа math_struct_ptr напрямую.

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