2

C# で独自の循環バッファーを作成しようとしています。次のアイテムを挿入する必要がある場所を追跡するためにカウンターを使用しています。これは完全なコードへのリンクであり、これを行うための(簡略化された)コードは次のとおりです

public class CircularBuffer<T>
{
    private bool _isFull = false;

    private int _size;
    private int _current = 0;

    private BufferItem<T>[] _buffer;

    public CircularBuffer(int size)
    {
        _size = size;
        _buffer = new BufferItem<T>[size];
    }

    public void Insert(T value)
    {
        BufferItem<T> item = new BufferItem<T>(value);
        //Removed code to check if the buffer is full, if so over-write the oldest item
        //and don't insert at the current position
        _buffer[_current] = item;
        _isFull = (_current == (_size - 1));
        _current++;

        //Age all items            
    }

現在の位置をインクリメントして別のアイテムを追加しようとするまで、すべて正常に機能します。

ここに画像の説明を入力

ここでアイテムを追加する"first"と、現在の位置 ( _current) がインクリメントされます。

ここに画像の説明を入力

アイテムを追加しましたが、現在の位置が 0 にリセットされます。宣言、アクセス、インクリメント以外"third"のコードはまったくありません。_current世界で何が起こっているのですか?のコードは次のBufferItem<T>とおりです。

public class BufferItem<T>
{
    public int Age = 0;
    public T Item;

    public BufferItem(T item)
    {
        Item = item;
    }
}
4

1 に答える 1

1

あなたのクラスメソッドは問題ありません。あなたの_current変数もうまくいきます。問題はCircularBufferクラスの外にあります。これが実装されている場所のどこかで、問題の CircularBuffer オブジェクトが何らかの方法でリセットされています。

于 2012-11-05T04:09:14.750 に答える