【问题标题】:C problem, left of '->' must point to class/struct/union/generic type?C问题,'->'左边必须指向类/结构/联合/泛型类型?
【发布时间】:2011-02-25 08:30:06
【问题描述】:

试图理解为什么这不起作用。我不断收到以下错误: '->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 文件的头文件只包含对结构头文件和函数定义的引用。 C语言。

【问题讨论】:

    标签: c function pointers input struct


    【解决方案1】:

    它们以 typedef 的方式解析,您将使用:

    struct math_struct * *
    

    而不是

    struct math_struct *
    

    直接使用 math_struct_ptr typedef 即可。

    【讨论】:

      【解决方案2】:

      你输入定义

       typedef struct math_struct* math_struct_ptr;
      

      所以如果你使用math_struct_ptr*,你会得到一个指向指针的指针。在这种情况下,您可能只想要math_struct_ptr。我不会用typedef 隐藏指针,但我看到很多人这样做。我觉得这很令人困惑。这可能是一个品味问题。

      【讨论】:

      • 这不仅仅是品味问题。 const math_struct_ptrconst math_struct* 是两个不同的东西。
      【解决方案3】:

      由于您的math_struct_ptr 已包含指针声明符,因此您无需在使用时指定它。删除*

      math_struct_ptr ptr;
      

      或者写

      struct math_struct *ptr;
      

      【讨论】:

        【解决方案4】:

        math_struct_ptr* 是一个 math_struct** - 您正在创建一个指向带有嵌套星号的指针的指针。您的 typedef 的优点是您不必在 math_struct_ptr 之后放置 *,因此您可以将其省略

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多