0

我正在使用数组实现来处理优先级队列。一切似乎工作正常,但我收到此错误:'remove' 的类型冲突我已经在其头文件中声明了该函数,我已经包含了头文件,但编译器仍然抱怨。我认为问题出在其他地方。

这是 pqueue.h:

    #ifndef PQUEUE_H
    #define PQUEUE_H
    //---------------

    #define HIGHP  0
    #define MEDP   1
    #define LOWP   2
    #define MAXEL 10

    #include <stddef.h>

    typedef struct message {
        char data[100];
        int priority;
    } message;

    typedef struct pQueue {
        struct message messages[10];
        int rear;
        int front;
        int size;
    } pQueue;

    void initPQueue(pQueue *pq);
    void add(pQueue *pq, char *data, int pri);
    char* remove(struct pQueue *pq);    // Error: conflicting types for: 'remove'
    int isEmpty(pQueue *pq);

    #endif

pqueue.c:

    #include "pqueue.h"
    #include <string.h>

    void initPQueue(pQueue *pq) {
        pq->front = 0;
        pq->rear = 0;
        pq->size = 0;
    }

    void add(pQueue *pq, char *data, int pri) {
        if (pq->size > MAXEL) {
            return; // NOTE: data is lost
        }
        message m;
        strcpy(m.data, data);
        m.priority = pri;

        if (isEmpty(pq)) {
            pq->messages[pq->rear] = m;
            pq->rear = (pq->rear % (MAXEL - 1)) + 1;
            return; // done
        }

        /**TODO: NEEDS REPAIR**/
        int i = 0;
        int j = 0;
        for (; i < pq->rear; i = (i % (MAXEL - 1)) + 1) {
            if (m.priority > pq->messages[i].priority) {
                // found element with higher or equal priority
                for (j = pq->rear - 1; j >= i; j = (j % (MAXEL - 1)) - 1) {
                    pq->messages[j] = pq->messages[j - 1];
                }
                    break;
            }
        }
        pq->messages[i] = m;
        /****/

        pq->size++;
    }

    char* remove(struct pQueue *pq) {
        if (isEmpty(pq)) {
            return NULL ;
        }
        pq->size--;
        return pq->messages[pq->front].data;
    }

    int isEmpty(pQueue *pq) {
        if (!pq->size) 
            return 1;

        return 0;
    }

有什么想法吗?

4

3 回答 3

2

int remove(const char *path)是标准函数。你需要为你的名字选择一个不同的名字。

于 2012-11-11T10:44:35.263 回答
2

为了回应其他人所说的,有一个标准功能。但除此之外,在 C 中,您应该始终在函数前面加上库的名称和它所操作的类型,以避免这些问题。例如,最好将您的函数命名为:

mylibrary_pqueue_remove

这将避免与标准库和其他人的代码发生命名冲突。

于 2012-11-11T10:46:13.013 回答
1

remove是一个保留标识符,你不能在你的程序中使用它,只要你包含<stdio.h>.

7.21.4.1remove功能

#include <stdio.h>
int remove(const char *filename);

remove函数导致名称为 filename 指向的字符串的文件不再可通过该名称访问。随后尝试使用该名称打开该文件将失败,除非它是重新创建的。如果文件打开,则删除函数的行为是实现定义的。

于 2012-11-11T10:44:46.183 回答