• ベストアンサー

キューのプログラムってなんで%で割ってるんですか?

今、キューのプログラムを使ってみたくて調べているのですが、どうしても疑問に思う点があって、 http://www.akita-pu.ac.jp/system/elect/comp1/kusakari/japanese/teaching/SoftTech/2005/note/9/Slide47.html このサイトで紹介されているキューでは enqueue関数内で ”Tail=(Tail+1)%100”という計算をしてTail==Headでなければ、そのTail変数でQueue[Tail]=”入れたい値” とやっているんですが、なぜ%100で割っているんですか? たとえばTailが”2”だった場合、 Tail = (2+1)%100 = 0.03で Queue[0.03]=”入れたい値”なんてことをやっているということでしょうか。配列を0.03という値で指定できるんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>Tail = (2+1)%100 = 0.03で 根本的に誤っています。 3を100で割った「余り」です。0.03ではなく、3です。

techhouse
質問者

お礼

回答頂きありがとうございました。 ”うげー”って感じです。もうやばいかも知れないっす。あまりですね。3は100では割れなくてあまったのは3ってことですね。 大変失礼いたしました。 これなら、1~99まではそのままあまり「1~99」が出てくるけど、100だと余りなしだからキューが無くなったと判断できるようになるってことなんですね。

その他の回答 (2)

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.3

配列をワッカにして使っているのですよ。 >余りなしだからキューが無くなった とは判断していません、最後の場所が最初の場所に重なったらキューが無くなったと判断しています。 スケールを小さくして考えて見れば分かり易いです。 [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に達したらキューが無くなったと判断です。

techhouse
質問者

お礼

回答頂きありがとうございました。 わたしプログラムを全く見てませんでした。キューが無くなるのを見てるんじゃなくて、配列をリングでつなげるためにやってるんですね。 いま、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; }

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

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

techhouse
質問者

お礼

回答頂きありがとうございました。 またまたヤバイことをキーボードに撃ち込んでしまったような気が!? ちゃんとプログラムを見ていませんでした。余りなしという判定はキューが無くなったからじゃなくて、配列の0番目に戻すためにやってるんですね。配列をリングにしてつなげていくためにやってるのですね。

techhouse
質問者

補足

すみません。追加で質問させて頂きたく、この補足の項目に書かせて頂きます。このプログラムをシミュレーションで見ていったところ、最初に配列[1]番目にデータを入れていくような動きをしていっているのですが、これはわざとこのようにデータを入れていくようにしているのでしょうか? enqueueで最初にデータを書き込む時は”Tail=Tail+1”でインクリメントした配列番号でQueue配列に入れていくためQueue[1]にデータを入れているのですが、Queue[0]が空なのでもったいない気がしてしまったのですが、[0]から入れるということを考えなくてもよいのでしょうか?

専門家に質問してみよう