dポイントプレゼントキャンペーン実施中!

今、キューのプログラムを使ってみたくて調べているのですが、どうしても疑問に思う点があって、

http://www.akita-pu.ac.jp/system/elect/comp1/kus …

このサイトで紹介されているキューでは
enqueue関数内で
”Tail=(Tail+1)%100”という計算をしてTail==Headでなければ、そのTail変数でQueue[Tail]=”入れたい値”

とやっているんですが、なぜ%100で割っているんですか?

たとえばTailが”2”だった場合、
Tail = (2+1)%100 = 0.03で
Queue[0.03]=”入れたい値”なんてことをやっているということでしょうか。配列を0.03という値で指定できるんでしょうか?

A 回答 (3件)

>Tail = (2+1)%100 = 0.03で



根本的に誤っています。
3を100で割った「余り」です。0.03ではなく、3です。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございました。

”うげー”って感じです。もうやばいかも知れないっす。あまりですね。3は100では割れなくてあまったのは3ってことですね。

大変失礼いたしました。

これなら、1~99まではそのままあまり「1~99」が出てくるけど、100だと余りなしだからキューが無くなったと判断できるようになるってことなんですね。

お礼日時:2009/11/27 22:58

配列をワッカにして使っているのですよ。



>余りなしだからキューが無くなった
とは判断していません、最後の場所が最初の場所に重なったらキューが無くなったと判断しています。

スケールを小さくして考えて見れば分かり易いです。
[0][1][2][3][4][5][6][7:Head][8:Tail][9]
でキューに●▲◆★をつんだ場合
[0:Tail/★][1][2][3][4][5][6][7:Head/●][8▲][9/◆]
のようになります。
更にどんどん積んでいってTailがHeadに達したらキューが無くなったと判断です。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございました。

わたしプログラムを全く見てませんでした。キューが無くなるのを見てるんじゃなくて、配列をリングでつなげるためにやってるんですね。

いま、PICマイコンの12F683のためにこれを作っているのですが、使い方としては6バイトのデータを1つのフレームとして受信できたら、それをキューに入れていこうと思っているのですが、最大4フレームまでストックできるようにしたいと思っていて、いっぱいになったらUARTで1フレームずつ出力するつもりです。

6バイトを4フレームなのでMAX_BUF_NUMは”24”に設定したのですが、これをやると今のプログラムは4フレーム目を格納しようとした時に、最後のバイトが格納できなくなってしまうことがわかり”25”としているのですが、24 + 1としなければいけないのでしょうか?



int CountQueue()
{
if(Head <= Tail)
return(Tail - Head);
else
return((MAX_BUF_NUM - 1) - Head + Tail);
}



void enqueue(BYTE x)
{
Tail=(Tail+1)%MAX_BUF_NUM;/*添え字の循環*/
if(Tail==Head){
QueueState = QSTATE_FULL;
return;
}
UartSendBuf[Tail]=x;

if(CountQueue()==(MAX_BUF_NUM-1)){
QueueState = QSTATE_FULL;
}
return;
}


BYTE dequeue(void)
{
BYTE x;
if(Head==Tail){
QueueState = QSTATE_EMPTY;
return;
}
Head=(Head+1)%MAX_BUF_NUM;
x=UartSendBuf[Head];
UartSendBuf[Head]=0x00;//出力し終わったら0x00でクリアしておく。
return x;
}

お礼日時:2009/11/28 16:03

>100だと余りなしだからキューが無くなったと判断できるようになるってことなんですね。



違います。
そのサイトの、1つ前のページをごらんください。
そこで紹介しているのは、直列状態のキューではなく、環状のキュー(リングバッファー)です。
配列の最終要素の次は[0]に戻るようになっています。

この回答への補足

すみません。追加で質問させて頂きたく、この補足の項目に書かせて頂きます。このプログラムをシミュレーションで見ていったところ、最初に配列[1]番目にデータを入れていくような動きをしていっているのですが、これはわざとこのようにデータを入れていくようにしているのでしょうか?

enqueueで最初にデータを書き込む時は”Tail=Tail+1”でインクリメントした配列番号でQueue配列に入れていくためQueue[1]にデータを入れているのですが、Queue[0]が空なのでもったいない気がしてしまったのですが、[0]から入れるということを考えなくてもよいのでしょうか?

補足日時:2009/11/28 11:33
    • good
    • 0
この回答へのお礼

回答頂きありがとうございました。

またまたヤバイことをキーボードに撃ち込んでしまったような気が!?

ちゃんとプログラムを見ていませんでした。余りなしという判定はキューが無くなったからじゃなくて、配列の0番目に戻すためにやってるんですね。配列をリングにしてつなげていくためにやってるのですね。

お礼日時:2009/11/28 11:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!