C 结构的typedef似乎没有在头文件中通过?
头文件中的一些struct-typedef声明似乎没有进入我的实现文件,这让我遇到了一些问题 具体来说,我定义了以下类型:类型、值、整数、字符串和浮点。它们都是以完全相同的方式从结构名称中定义的类型。我正在编写一个非正式的C 结构的typedef似乎没有在头文件中通过?,c,gcc,typedef,struct,C,Gcc,Typedef,Struct,头文件中的一些struct-typedef声明似乎没有进入我的实现文件,这让我遇到了一些问题 具体来说,我定义了以下类型:类型、值、整数、字符串和浮点。它们都是以完全相同的方式从结构名称中定义的类型。我正在编写一个非正式的hashCode函数来补充我正在设计的引用所有这些数据类型的哈希表。类型和值可以正常工作,但Integer/Float/String不能正常工作,我不知道为什么 很抱歉,这个问题有点复杂,但我会尽量不提供太多或太少的信息,也许这对这里的专家来说不会太困难。:-) 我将从hash
hashCode
函数来补充我正在设计的引用所有这些数据类型的哈希表。类型和值可以正常工作,但Integer/Float/String不能正常工作,我不知道为什么
很抱歉,这个问题有点复杂,但我会尽量不提供太多或太少的信息,也许这对这里的专家来说不会太困难。:-)
我将从hashCode函数开始(请不要批评它有多糟糕,我知道它不太好,我真的不在乎):
int hashCode(ST_HashSymbol*hash,值*v)
{
类型*t=v->Type;
开关(类型(t->名称))
{
大小写整数:
整数*i=(整数*)v->innerValue;
返回i->值%hash->容量;
案例浮动:
{
Float*f=(Float*)v->innerValue;
float val=f->value;
长l=0l;
如果(val 2&&j=0;--j)
{
如果(val>=pow(2,j-22))
{
val-=pow(2,j-22);
l |=1个容量;
}
大小写字符串:
字符串*s=(字符串*)v->innerValue;
char*str=s->value;
int-total=0;
char*c;
对于(c=str;*c!='\0';++c)
{
总数+=*c;
}
返回总%hash->capacity;
违约:
返回-1;
}
}
摘录自定义所有类型的“type.h”头文件。值得注意的是,我还尝试将typedef和struct定义合并为一个语句,但这也不起作用:
typedef struct _t Type;
typedef struct _v Value;
struct _t {
char *name;
struct _t *widerType;
};
struct _v {
Type *type;
void *innerValue;
};
Type *type(int);
int whichType(char *);
Type *getType(char *);
/**************************/
/* Actual ("inner") types */
/**************************/
typedef struct _str String;
typedef struct _int Integer;
typedef struct _fl Float;
struct _str {
int length;
char *value;
};
struct _int {
int value;
};
struct _fl {
float value;
};
类型定义结构类型;
类型定义结构值;
结构{
字符*名称;
结构_t*widerType;
};
结构{
类型*类型;
void*内部值;
};
类型*类型(int);
整型(字符*);
类型*getType(char*);
/**************************/
/*实际(“内部”)类型*/
/**************************/
typedef结构_str字符串;
typedef struct_int Integer;
类型定义结构_flfloat;
结构{
整数长度;
字符*值;
};
结构_int{
int值;
};
结构层{
浮动值;
};
当我运行make时,我得到以下信息:
[kparting@dhcp-10-25-247-130 eq]$ make
gcc -o eq -Wall -g parser.c eq.c error.c hash.c symbols.c type.c -lm
hash.c: In function ‘hashCode’:
hash.c:33: error: expected expression before ‘Integer’
hash.c:34: error: ‘i’ undeclared (first use in this function)
hash.c:34: error: (Each undeclared identifier is reported only once
hash.c:34: error: for each function it appears in.)
hash.c:37: error: expected expression before ‘Float’
hash.c:38: error: ‘f’ undeclared (first use in this function)
hash.c:69: error: expected expression before ‘String’
hash.c:70: error: ‘s’ undeclared (first use in this function)
make: *** [eq] Error 1
[kparting@dhcp-10-25-247-130均衡器]$make
gcc-o eq-Wall-g parser.c eq.c error.c hash.c symbols.c type.c-lm
hash.c:在函数“hashCode”中:
hash.c:33:错误:“Integer”之前应为表达式
hash.c:34:错误:“i”未声明(此函数首次使用)
hash.c:34:error:(每个未声明的标识符只报告一次
hash.c:34:错误:对于它出现在中的每个函数。)
hash.c:37:错误:“Float”之前应为表达式
hash.c:38:错误:“f”未声明(此函数首次使用)
hash.c:69:错误:“String”之前应为表达式
hash.c:70:错误:“s”未声明(此函数首次使用)
make:**[eq]错误1
如前所述,Type*和Value*是有效的数据类型,但其他三种不是。whichType
和Type
函数不使用其他三种数据类型中的任何一种
提前感谢您的帮助。我确信这与头文件中结构的位置有关,也可能与gcc本身有关(但可能性很小)。在C中,您只能在块的开头声明变量。您的行:
Integer *i = (Integer *)v->innerValue;
尝试声明变量i,但它不在块的开头。只需打开块即可修复此问题:
case INTEGER:
{
Integer *i = (Integer *)v->innerValue;
return i->value % hash->capacity;
}
…与另一个
情况类似。在C中,只能在块的开头声明变量。行:
Integer *i = (Integer *)v->innerValue;
尝试声明变量i,但它不在块的开头。只需打开块即可修复此问题:
case INTEGER:
{
Integer *i = (Integer *)v->innerValue;
return i->value % hash->capacity;
}
…对于另一个案例
s.您不能在案例块内声明变量
事实上,这并不完全正确。应该可以帮助您澄清问题。您不能在case块中声明变量
事实上,这并不完全正确。应该可以帮助你澄清问题。这不是你问题的答案,但我很确定你会想在你的案例块末尾插入“break”。你的标题中包含了,对吗?他们都记着:看起来他每一个都用return
,所以break代码>是不必要的。很抱歉,FLOAT case被错误地复制了。我是从shell窗口复制的,而不是像我应该的那样从GUI文本编辑器复制的。---它少了几行。@Nick Bedford:是的,即使对我来说,这也是一个太基本的错误。无论如何,我已经接受了一个答案,但为了后代,我确实修复了问题的代码。:-)谢谢,e每个人,谢谢你的帮助。这不是你问题的答案,但我很确定你会想在你的案例块的末尾插入“break”。你已经包含了你的标题,对吗?他们都记得:看起来他用一个返回来完成每一个,所以break
是没有必要的。浮动案例是复制错误的埃德,对不起。我是从一个shell窗口复制,而不是像我应该的那样从GUI文本编辑器复制。---它少了几行。@Nick Bedford:是的,即使对我来说,这也是一个太基本的错误。无论如何,我已经接受了一个答案,但为了后代,我确实修复了问题的代码。:-)谢谢大家,谢谢你们的帮助。真的吗?我从来没有这样做过以前有麻烦吗