我刚刚开始编写我的代码,因为它没有编译而且我不知道原因并不重要,它说:Error: argument of type "HNode *" is incompatible with parameter type "HNode *"
就行了: getSL(root->left);
。我真的不明白为什么会这样。我正在使用Visual Studio 2012进行编译。
我的代码(是的,没有完成):
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char chr;
struct HNode *left, *right;
} HNode;
typedef struct {
char chr;
int counter;
} Symbol;
int main()
{
}
Symbol * getSL(HNode * root)
{
Symbol * s;
if(!root) return NULL;
if((!(root->left)) && (!(root->right)))
{
}
else
{
getSL(root->left);
}
}
你能向我解释一下我做错了什么以及如何解决这个问题?
答案 0 :(得分:3)
使用这样的前瞻声明:
struct HNode; //forward declaration
typedef struct HNode{ //note the struct tag here
char chr;
struct HNode *left, *right;
} HNode;
答案 1 :(得分:1)
为名为HNode
的结构创建一个typedef。在该结构中,您有一个指向struct HNode
的指针。
typedef struct {
char chr;
struct HNode *left, *right;
} HNode;
类型struct HNode
和HNode
的类型不同。 struct HNode
是一个不完整的结构(编译器不知道)。如果您这样做,您的代码将是相同的:
typedef struct {
char chr;
struct Something *left, *right;
} HNode;
在上面的示例中,struct HNode
根本不存在。
解决此问题的一种简单方法是单独创建struct和typedef。
typedef struct HNode_s HNode ;
struct HNode_s{
char chr;
HNode *left, *right;
} ;
答案 2 :(得分:1)
您输入HNode
的结构实际上没有名称(您只说struct
,而不是struct HNode
),并且在定义期间,typedef尚不存在,所以你最终创建了两个不同的结构,一个名为HNode
,一个名称定义为HNode
。
您可以通过预先声明结构,然后在其定义中正确命名它来避免这种情况。
struct HNode; // declare the named struct (not needed with C++ compiler)
typedef struct HNode { // define the named struct
char chr;
struct HNode *left, *right;
} HNode; // typedef to a shorter name