1

ショートストーリー

着信メッセージデータを固定長のバッファに追加する必要があります。
バッファがいっぱいの場合は、最も古いメッセージデータ(またはバッファ内の最も古いバイト)を新しいものに置き換えます。これはある種のキューです。
この種のキューを実装するにはどうすればよいですか?
プログラムはCであり、私はCについてほとんど(ほとんどないように)知識がありません。

長い話

デバイスからメッセージを受信するプログラムがあります。
このメッセージは可変長であり、IDが関連付けられている可能性があります。
現在、プログラムは各IDに対して受信した最新のメッセージのみを保持します。
このメッセージはプログラムによって内部的に保持され、その構成がある場合、またはユーザーが特定のIDの受信メッセージを取得するコマンドを(リアルタイムで)送信した場合にのみユーザーに表示されます。
ここで、特定のID(最後だけでなく)に対して受信したいくつかのメッセージを保持し、それらを返す必要があります。個別に返品する必要はありません。それらはすべて1つのブロックで返すことができます(デバイスが返すメモリデータの一部としていくつかのメッセージを考えてください)。
現在、受信したメッセージを保持するための固定長のバッファと、受信したメッセージの長さを追跡するための変数があります。
そのため、既存のバッファを使用して、新しいメッセージを追加し続けることを考えていました。また、別のメッセージが届き、バッファに空き容量がなくなった場合は、最も古いメッセージデータを上書きする必要があります。キューのようなもの。
特に、この種のキューを実装する最後の部分は、私がもっと助けを必要としているところです。
プログラムはCであり、私が行ったものではなく、Cに関する知識は限られています(存在しないとは言えません:)
私は本当に最初にCを学ぶ必要がありますが、今はその時間はありません:)私はC#をやりました、 Java、Javascript、そしてほとんど。

このキューの王を管理する上で何か助けはありますか?

ありがとう

4

1 に答える 1

1

この場合、循環バッファが役立ちますが、バッファがいっぱいになったときに最も古いエントリをキックアウトできるように若干の変更が加えられています。typedef struct msg {...} msgこの種の配列がいくつかあると想像してください。次に、両方とも0に初期化されるmessage[N]2つのインデックスを管理します。int in, out

このout != in配列からメッセージを読むことができますが。の何らかの形式を使用して、両方の増分inとラップアラウンドを実装します。これまでのところ、これは他の循環バッファと同じです。outout = (++ out) % N;

(in + 1) % N == out次に、バッファがいっぱいになった場合、つまり挿入を実行しようとしているときに、最も古いメッセージを置き換えるという質問に対処しましょう。循環バッファを使用すると、これは非常に簡単になります。スペースを作るために、を1つ進めて、とにかくoutインクリメントできるようにしてから、次を挿入します。in

if (((in + 1) % N) == out)
{ 
    out = (++ out) % N;
}
in = (++ in) % N;
message[in] = incoming_msg;

リーダーのインデックスoutを前方に押すと、この位置を最新のメッセージに使用できます。

于 2013-01-27T00:06:14.723 に答える