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 が指す文字列を名前とするファイルに、その名前でアクセスできなくなります。その名前を使用してそのファイルを開こうとすると、新しく作成されない限り失敗します。ファイルが開いている場合、remove 関数の動作は実装定義です。

于 2012-11-11T10:44:46.183 に答える