3

ポインタに問題があります。基本的に、以下のリンクリストキューとして機能する構造体がありPcbます。

struct pcb {
    pid_t pid;             // system process ID
    char * args[MAXARGS];  // program name and args
    int arrivaltime;
    int remainingcputime;
    struct pcb * next;     // links for Pcb handlers
    int priority, memalloc, res1, res2, res3, res4, status;
};
typedef struct pcb Pcb;
typedef Pcb * PcbPtr;

Pcbこれで、ポインタをとしてtypedefしたことがわかります。PcbPtrつまりPcbPtr、ポインタは正しいですか?次に、優先度に応じて、キューに
を追加するためにこれらの関数を実装しました。PcbPtr

PcbPtr enqPcb(PcbPtr headofQ, PcbPtr process){
    PcbPtr c = headofQ;
    if (!headofQ) {
        headofQ = process;
        return headofQ;
    }
    while (c->next) {
        c = c->next;
    }
    c->next = process;
    return headofQ;
}

void priEnq(PcbPtr f1, PcbPtr f2, PcbPtr f3, PcbPtr a) {
    int pri = a->priority;
    if (pri == 3)
        enqPcb(f3, a);
    else if(pri == 2)
        enqPcb(f2, a);
    else 
        enqPcb(f1, a);
    return;
}

しかし、それは私が指しているオブジェクトを変更していません(つまりheadf1この場合:)

PcbPtr headi;
PcbPtr headf1; //priority 1
PcbPtr headf2; //priority 2
PcbPtr headf3; //priority 3
...
priEnq(headf1, headf2, headf3, headi);

つまり、別のオブジェクトをパラメータとして渡しているかのようです。を使用しない場合はpriEnq()、リストに追加されます。

私が間違っていることについて何か考えはありますか?どんな助けでも大歓迎です

解決済み:

PcbPtr enqPcb(PcbPtr *headofQ, PcbPtr process){
    PcbPtr c = *headofQ;
    PcbPtr d = c;
    if (!*headofQ) {
        *headofQ = process;
        return *headofQ;
    }
    while (c->next) {
        c = c->next;
    }
    c->next = process;
    return headofQ;
}

void priEnq(PcbPtr *f1, PcbPtr *f2, PcbPtr *f3, PcbPtr a) {
    int pri = a->priority;
    if (pri == 3)
        enqPcb(f3, a);
    else if(pri == 2)
        enqPcb(f2, a);
    else 
        enqPcb(f1, a);
    return;
}

PcbPtr headi;
PcbPtr headf1; //priority 1
PcbPtr headf2; //priority 2
PcbPtr headf3; //priority 3
...
priEnq(&headf1, &headf2, &headf3, headi);
4

1 に答える 1

4

私があなたの問題を正しく理解している場合、の呼び出し元はpriEnqキューへのポインターを持っており、関数がキューの先頭を変更した場合にそれらのポインターを更新することを望んでいます。

問題は、ポインタを値で渡していることです。呼び出された関数で呼び出し元の値を変更する場合は、参照、つまり、更新するポインターへのポインターを渡す必要があります。コード内:

PcbPtr enqPcb(PcbPtr *headofQ, PcbPtr process){
    PcbPtr* c = headofQ;
    if (!*headofQ) {
        *headofQ = process;
        return *headofQ;
    }
    while (c->next) {
        c = c->next;
    }
    c->next = process;
    return headofQ;
}

void priEnq(PcbPtr *f1, PcbPtr *f2, PcbPtr *f3, PcbPtr a) {
    int pri = a->priority;
    if (pri == 3)
        enqPcb(f3, a);
    else if(pri == 2)
        enqPcb(f2, a);
    else 
        enqPcb(f1, a);
    return;
}

PcbPtr headi;
PcbPtr headf1; //priority 1
PcbPtr headf2; //priority 2
PcbPtr headf3; //priority 3
...
priEnq(&headf1, &headf2, &headf3, headi);

キューポインタのアドレスを渡すことにより、priEnqポインタのコピーだけでなく、ポインタを変更できます。

また、サーノルドが述べたように、読みやすさと保守性のためにキューポインタの配列を検討することをお勧めします。

于 2012-06-07T02:57:37.207 に答える