![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
今、キューのプログラムを使ってみたくて調べているのですが、どうしても疑問に思う点があって、
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という値で指定できるんでしょうか?
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に達したらキューが無くなったと判断です。
回答頂きありがとうございました。
わたしプログラムを全く見てませんでした。キューが無くなるのを見てるんじゃなくて、配列をリングでつなげるためにやってるんですね。
いま、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;
}
No.2
- 回答日時:
>100だと余りなしだからキューが無くなったと判断できるようになるってことなんですね。
違います。
そのサイトの、1つ前のページをごらんください。
そこで紹介しているのは、直列状態のキューではなく、環状のキュー(リングバッファー)です。
配列の最終要素の次は[0]に戻るようになっています。
この回答への補足
すみません。追加で質問させて頂きたく、この補足の項目に書かせて頂きます。このプログラムをシミュレーションで見ていったところ、最初に配列[1]番目にデータを入れていくような動きをしていっているのですが、これはわざとこのようにデータを入れていくようにしているのでしょうか?
enqueueで最初にデータを書き込む時は”Tail=Tail+1”でインクリメントした配列番号でQueue配列に入れていくためQueue[1]にデータを入れているのですが、Queue[0]が空なのでもったいない気がしてしまったのですが、[0]から入れるということを考えなくてもよいのでしょうか?
回答頂きありがとうございました。
またまたヤバイことをキーボードに撃ち込んでしまったような気が!?
ちゃんとプログラムを見ていませんでした。余りなしという判定はキューが無くなったからじゃなくて、配列の0番目に戻すためにやってるんですね。配列をリングにしてつなげていくためにやってるのですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 “I don’t give a rat’s tail ” 2 2023/06/30 10:00
- 英語 魚の胴体 7 2022/12/24 19:07
- マンガ・コミック マガジンで連載されていたFAIRY TAILは大ヒット作品ですか? 1 2022/06/24 12:10
- マンガ・コミック マガジンで連載されていたFAIRY TAILは知名度はどれぐらいですか? 1 2022/06/24 12:13
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- Java Java モンスターブリーダー 1 2023/02/05 09:44
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# numpyスライス機能を使った数値計算 2 2023/05/08 16:01
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで配列の計算
-
EXCEL VBA で、0から?1から?
-
動的配列が存在(要素が有る)か...
-
VBで作った乱数を一度も重複さ...
-
C言語 重複しない4ケタの乱数...
-
IF関数でEmpty値を設定する方法。
-
VB.net 引数で配列変数を渡す際...
-
複数のテキストボックスに同じ...
-
遅延バインディングを使用でき...
-
エクセルの配列定数について教...
-
変数を動的に作るには?
-
C++、クラスメンバの構造体配列...
-
パソコンキーボードで時分秒を...
-
配列にある重複要素を削除した...
-
ランダムな英数字を発生させて...
-
乱数とは・・・?
-
五目並べのプログラムを配列と...
-
重複なしでランダムに画像を表...
-
エクセル:バグという名の仕様?
-
MFC CArray in CArray
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
応用情報技術者試験の令和元年...
-
IF関数でEmpty値を設定する方法。
-
VBAで配列の計算
-
パソコンキーボードで時分秒を...
-
EXCEL VBA で、0から?1から?
-
動的配列が存在(要素が有る)か...
-
変数を動的に作るには?
-
C言語 重複しない4ケタの乱数...
-
VBで作った乱数を一度も重複さ...
-
VB.net 引数で配列変数を渡す際...
-
配列の要素数を超えた参照のコ...
-
C#の質問
-
複数のテキストボックスに同じ...
-
VBでbyte配列型のインスタンス...
-
For文と配列
-
遅延バインディングを使用でき...
-
【MFC】GetCount()とGetSize()...
-
配列プロパティをREDIMする方法...
-
Excel VBAで配列の途中から(X)M...
-
五目並べのプログラムを配列と...
おすすめ情報