C problem, left of '->' must point to class/struct/union/generic type?

12,305

Solution 1

Since your math_struct_ptr already contains the pointer declarator, you don't need to specify it at the point of use. Drop the *:

math_struct_ptr ptr;

Or write

struct math_struct *ptr;

Solution 2

math_struct_ptr* is a math_struct** - you're creating a pointer to a pointer with nested stars there. The advantage of your typedef is that you don't have to put a * after math_struct_ptr, so you can just leave that out

Solution 3

You typedef

 typedef struct math_struct* math_struct_ptr;

So if you use math_struct_ptr*, you get a pointer to a pointer. You probably just want math_struct_ptr in that case. I would not hide the pointer with typedef, but I see many people do that. I find it just confusing. It's probably a matter of taste.

Share:
12,305
Patrick
Author by

Patrick

Updated on June 05, 2022

Comments

  • Patrick
    Patrick almost 2 years

    Trying to understand why this doesn't work. I keep getting the following errors: left of '->nextNode' must point to class/struct/union/generic type
    (Also all the lines with a -> in the function new_math_struct)

    Header file

    #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 file

    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
    }
    

    The header for the C file just contains a reference to the struct header and the definitions of the functions. Language C.

  • jamesdlin
    jamesdlin almost 14 years
    It's more than a matter of taste. const math_struct_ptr and const math_struct* are two different things.