ポインタに問題があります。基本的に、以下のリンクリストキューとして機能する構造体があり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);