1

実装したキュークラスのサンプルテストの設定で問題が発生しました。

キュークラスは次のとおりです。

Queue.h:

    typedef float QueueInfoType;
    QueueInfoType x;
    class Queue
    {
      public:
        Queue(){front = rear = count = 0;}

        bool isEmpty();

        bool isFull();

        void add(QueueInfoType x);

        float remove();

        int numItems();

        enum {MAXQUEUE = 80};

      private:
        QueueInfoType values[MAXQUEUE];
        int front, rear, count;
    };

Queue.cpp:

    bool Queue::isEmpty()
    {
      return front == rear;
    }

    bool Queue::isFull()
    {
      return count >= MAXQUEUE;
    }

    void Queue::add(QueueInfoType x)
    {
      values[rear = (rear + 1) % MAXQUEUE] = x;
      count = count + 1;
    }

    float Queue::remove()
    {
      count = count - 1;
      return x = values[front = (front + 1) % MAXQUEUE];
    }

    int Queue::numItems()
    {
      return count;
    }

試験方法:

    [TestMethod]
    void TestNumItems()
    {
        Queue q;
        for(int i = 0; i < 20; i++)
        {
            q.add(i);
        }
        int expected = 2;
        int actual = q.numItems();
        Assert::AreEqual(expected, actual,  "queue had: " + actual + " items");
    };

明らかに何かが足りません。addメソッドを呼び出してアイテムをキューに追加しても、キューのカウントが増えることはありませんが、アイテムはキューに正常に追加されます。

静的ライブラリでキュークラスをコンパイルし、テストプロジェクトでそのクラスへの参照を追加しています。

キューの数が変わらない理由はありますか?

編集:

MAXQUEUEによって定義されたアイテムの最大数を持つこのクラスで循環キューを作成しています。

上記は、QueueInfoTypeの定義方法です。

ノート:

静的ライブラリを実行可能ファイルに変更void main()し、queue.cppに追加して、キューの機能をテストするコードを記述すると、正常に機能し、カウントが正しく返されます。テストプロジェクトで静的ライブラリとして使用されたときに何かが起こっていますか?

4

3 に答える 3

0

テストルーチンのforループを次のように変更してみてください。

    for(int i = 0; i < 20; i++)
    {
        q.add(i + 100);
    }

カウントに対して異なる数を取得することになった場合、それは、誤ってアレイの範囲を超えてスタックを損傷したためです。変数がどのように定義されたかにより、スタック上で隣接変数になる可能性があります。  

于 2011-10-03T18:06:38.550 に答える
0

よくわかりませんが、キュークラスはポインターを使用して実装する必要があるため、サイズの制限はなく、 add 関数でもそのようなものを使用できます。

void Queue::add(QueueInfoType x)
{
  count++;
  values[count] = x;
}

そのため、実装の方が理解しやすく、あなたの間違いについて... 見つからない、うまくいくかもしれません... 引き続き考えます。

PD: 私の英語でごめんなさい

于 2011-10-03T17:36:14.200 に答える
0

あなたの予想は「20」であるべきだと思います。

また、remove は「float」を返しますが、それはおそらく QueueInfoType である必要があります。

テストを実行したところ、正常に機能しました (20 対 2 のテスト以外)。私のテストでは、実際は20でした。

また、remove での "x=" の割り当ては正しくないようです。

于 2011-10-03T17:49:10.660 に答える