【发布时间】:2010-12-05 05:11:14
【问题描述】:
我在头文件中的一些结构 typedef 声明似乎没有通过我的实现文件时遇到一些问题。
具体来说,我定义了以下类型:Type、Value、Integer、String 和 Float。它们都是以完全相同的方式从结构名称中定义的。我正在编写一个非正式的hashCode 函数来补充我正在设计的引用所有这些数据类型的哈希表。 Type 和 Value 可以正常工作,但 Integer/Float/String 不能正常工作,我不知道为什么。
抱歉,这个问题有点牵扯,但我会尽量不要提供太多或太少的信息,也许这对这里的专家来说不会太难。 :-)
我将从 hashCode 函数开始(请不要对我说它有多糟糕,我知道它并不是那么好,我真的不在乎):
int hashCode(ST_HashSymbol *hash, Value *v)
{
类型 *t = v->type;
开关 (whichType(t->name))
{
案例整数:
整数 *i = (整数 *)v->innerValue;
返回 i->value % 哈希->容量;
案例浮动:
{
浮点 *f = (浮点 *)v->innerValue;
浮动 val = f-> 值;
长 l = 0l;
如果 (val 2 && j = 0; --j)
{
if (val >= pow(2, j - 22))
{
val -= pow(2, j - 22);
l |= 1 个容量;
}
案例字符串:
字符串 *s = (字符串 *)v->innerValue;
字符 *str = s-> 值;
整数 = 0;
字符 *c;
for (c = str; *c != '\0'; ++c)
{
总计 += *c;
}
返回总 % 哈希-> 容量;
默认:
返回-1;
}
}
摘自“type.h”头文件,它定义了所有类型。值得注意的是,我也尝试过将 typedef 和 struct 定义组合为一个语句,但这也不起作用:
typedef struct _t 类型; typedef struct _v 值; 结构 _t { 字符*名称; 结构 _t *widerType; }; 结构 _v { 类型 *类型; 无效*内部值; }; 类型 *type(int); int whichType(char *); 输入 *getType(char *); /******************************/ /* 实际(“内部”)类型 */ /******************************/ typedef struct _str 字符串; typedef struct _int 整数; typedef struct _fl 浮点数; 结构 _str { 整数长度; 字符 * 值; }; 结构 _int { 整数值; }; 结构 _fl { 浮点值; };当我运行 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:在函数“hashCode”中: hash.c:33:错误:“整数”之前的预期表达式 hash.c:34: error: ‘i’ undeclared (first use in this function) hash.c:34: error: (每个未声明的标识符只报告一次 hash.c:34:错误:对于它出现的每个函数。) hash.c:37:错误:'Float'之前的预期表达式 hash.c:38: error: ‘f’ undeclared (first use in this function) hash.c:69:错误:“字符串”之前的预期表达式 hash.c:70: error: ‘s’ undeclared (第一次在这个函数中使用) make: *** [eq] 错误 1
正如我所提到的,Type * 和 Value * 是有效的数据类型,但其他三个不是。 whichType 和 type 函数不使用其他三种数据类型中的任何一种。
提前感谢您的帮助。我相当确定这与头文件中结构的位置有关,或者可能(但极不可能)gcc 本身。
【问题讨论】:
-
不是你的问题的答案,但我很确定你会想要在你的案例块的末尾插入'break'。
-
你有
#included你的标题,对吧? -
theycallmemorty:看起来他每个人都用
return完成,所以break不是必需的。 -
FLOAT 案例被错误复制,抱歉。我正在从 shell 窗口复制,而不是像我应该的那样使用 GUI 文本编辑器。 -_- 它缺少几行。 @Nick Bedford:是的,即使对我来说,这也是一个过于初级的错误。
-
无论如何,我已经接受了答案,但为了后代,我确实修复了问题的代码。 :-) 谢谢大家,你们的帮助。