1

キューで使用されている配列の内容を出力する際に​​問題が発生しました。

テンプレートキューの一部:

#include <iostream>
#include <cstdlib>
using namespace std;

template<class T>
class Queue
{
private:
    int front;      //front position
    int rear;       //rear position
    int maxQue;     //maximum number of elements in the queue
    T* items;       //points to a dynamically-allocated array code here
public:
    Queue()  // default constructor: Queue is created and empty
    {
        front = -1;
        rear = 0;
        maxQue = 10;
        items = new T[maxQue];
    }

    void Print()   // print the value of all elements in the queue
    {
        while(front != rear)
        {
            cout<<items[front];
            front++;
            if(front==rear)
               break;
            cout<<" - ";
        }
        cout<<endl;
    }

    void Enqueue(T add)      // insert x to the rear of the queue
    {                           // Precondition: the queue is not full
        if(IsFull())
        {
             cout<<"Queue is full!"<<endl;
        }
        else
        {
             items[rear] = add;
             rear++;
             rear = rear % maxQue;
        }
    }

    void Dequeue(T &x)  // delete the element from the front of the queue
    {                       // Precondition: the queue is not empty
         if(!IsEmpty())
         {
             front = (front+1)%maxQue;
             x = items[front];
         }
    }

    bool IsEmpty()   // test if the queue is empty
    {
         return (rear==front);
    } 

    bool IsFull()   // test if the queue is full
    {
         return ((rear+1)%maxQue==front);
    }

    int length()    // return the number of elements in the queue
    {
         return abs(rear-front);
    }

    ~Queue()  // Destructor:  memory for the dynamic array needs to be deallocated
    {
         delete [] items;
    }
};

メインルーチンの一部:

int main()
{
     Queue<float>FloatQueue;
     float y;
     FloatQueue.MakeEmpty();

     FloatQueue.Dequeue(y);
     FloatQueue.Enqueue(7.1);
     cout << "float length 3 = " << FloatQueue.length() << endl;

     FloatQueue.Enqueue(2.3);
     cout << "float length 4 = " << FloatQueue.length() << endl;

     FloatQueue.Enqueue(3.1);
     FloatQueue.Dequeue(y);
     cout << "The float queue contains:  ";
     FloatQueue.Print();

     return 0;
}

コードは、印刷を試みるまで正常にコンパイルされます。印刷を試みると、これらのエラーが発生します。

0 00000000  0x00466a7f in std::__convert_from_v() (??:??)  
1 00000000  0x00430302 in std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_float<double>() (??:??)  
2 00000000  0x00430da8 in std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put() (??:??)  
3 00000000  0x00447455 in std::ostream::_M_insert<double>() (??:??)  
4 00000000  0x00448988 in std::ostream::operator<<() (??:??)  
5 0041CB37  Queue<float>::Print(this=0x28ff00)

私はこれに数日間立ち往生しています、どんな助けでも大歓迎です。

4

1 に答える 1

0

固定サイズの循環バッファーを実装しているようです。そうである場合 (またはそうでない場合でも)、いくつかの問題があります。

  1. キューから何かを取り出す前に、キューの最大サイズを超えてエンキューすると、満杯として登録されることはありません。
  2. 「フロント」ポインターがリアポインターより大きい場合、印刷機能は停止せず、フロントは MAX_INT まで継続し、再びループする可能性があります。バッファの最大サイズで mod 操作を行っていません。
  3. デストラクタがないため、これらのオブジェクトのいずれかを作成および破棄するたびにバッファがリークします。
  4. 長さ関数が正しくありません。フロントがリアよりも大きい場合 (半分の時間)、エラーになります。このように考えてください。いっぱいになると、サイズはゼロになります。

そして多分それ以外のいくつかのこと。私はあなたのデザインを再考します。あなたは近いですが、いくつかの数学エラーがあります。

于 2012-04-16T22:34:53.327 に答える