0

我几乎完成了我的代码,但它给了我这个错误:' curtemp: undeclared identifier'。和' prevtemp: undeclared identifier'和' missing ';' before type'(最后一个错误在“float curtemp = current->temp;”行。我不知道我的代码有什么问题。我试图从双向链表中删除一些元素,当该元素内部的温度比前一个元素的温度高 5 或低 5。

这是我的 .c 文件:

void remove_error(Dlist *list){

    DlistElmt *current;

    current = list->head; 
    //initializes ints for comparison
    float curtemp = current->temp;
    float prevtemp = current->temp;
    //now moves current to next data
    current = current -> next;

    //begins while loop for comparison of data
    while(current != NULL){
        curtemp = current -> temp;

        if((curtemp >= (prevtemp +5)) || (curtemp <= (prevtemp-5))){
            //removes current from the list
            dlist_remove(list, current);

            current = current->next;

        }
    }

 }

这是我的结构元素文件:

typedef struct DlistElmt_ {

    int hour;
    int min;
    float temp;

    struct DlistElmt_ *prev;
    struct DlistElmt_ *next;

 } DlistElmt;
4

3 回答 3

0

我的猜测是你没有包含DlistElmt定义的文件,但是你已经包含了 DlistElmt 的声明,所以编译器知道有一个 DlistElmt 东西,所以你可以使用指向它的指针,但是当你尝试对 DlistElmt 的内容做一些事情时编译器不能用它做任何事情。

于 2012-10-10T01:54:55.130 回答
0

对于 C89 或 C90,预计变量必须在块(函数或局部块)的开头声明。但是,对于 C99,此限制不适用。因此,很可能,上述 Karthik T & japreiss 的建议必须适用。

您可以尝试仅将浮点变量的声明移动到函数的开头并稍后分配它们。

于 2012-10-10T01:35:09.257 回答
0

您的代码不是 ISO 标准 C89,我怀疑您有 C89 编译器(如 Visual C)。您必须重新编码一些行:

DlistElmt *current; 
float curtemp, prevtem;

current = list->head;  
//initializes ints for comparison 
curtemp = prevtemp = current->temp; 

做到这一点。

它是gccC89 扩展、C99 标准,也是 C++ 功能,允许在块中间而不是仅在顶部进行声明。当他们遇到“纯”ISO C89 编译器时,这让许多人感到困惑。

您的逻辑中似乎也缺少某些东西。 prevtemp一旦设置就永远不会更新。如果prev意味着以前,我猜你想在循环内:

prevtem = curtemp;
curtemp = current -> temp;          

在这种情况下,您的一些初始化步骤是多余的。考虑阅读 Gries 的“编程科学”以了解如何避免这些错误。

于 2012-10-10T01:48:17.760 回答