Элемент в массиве изменился ненормально - PullRequest
0 голосов
/ 24 апреля 2018

CodeBlocks 17.12, win10

Второй элемент массива "theQueue" показывает разные до и после строки "cin >> theNumber;" в основной функции.

Я нашел проблему, добавив "Q.display ();" до и после распечатывать элементы массива "theQueue".

Кроме того, в функции «bool Queue :: enqueue (int number)» переменная «последовательность» также изменилась ненормально.

#include <iostream>

using namespace std;
class Queue
{
public:
    Queue(int theSize);
    bool enqueue(int number);
    int dequeue();
    int peek(int number) const;
    int getSize()  const;
    void display()  const;
private:
    int size;
    int theQueue[];
    int sequence;//record the current position
};
int main()
{
    int sizeValue,theNumber;
    cout<<"Enter the queue's size(less than 11): \n";
    cin>>sizeValue;
    Queue Q(sizeValue);
    while (true)
    {
        Q.display();
        cout<<"Please input a number to fill up the queue: \n";
        cin>>theNumber;
        Q.display();
        if (Q.enqueue(theNumber)==false)
            break;
    }
    cout<<"Now the queue have "<<Q.getSize()<<" elements,they are:\n";
    Q.display();
    cout<<"The first element in the queue is: "<<Q.dequeue()<<endl;
    cout<<"Now the queue have "<<Q.getSize()<<" elements,they are:\n";
    Q.display();
    return 0;
}
Queue::Queue(int theSize)
{
    int aQueue[10]={0,0,0,0,0,0,0,0,0,0};
    for (int i=0;i<10;i++)
         theQueue[i]=aQueue[i];
    size=theSize;
    sequence=0;//the initial position is 0
}
bool Queue::enqueue(int number)
{
    theQueue[sequence]=number;
    sequence=sequence+1;
    if (sequence>=size)
    {
        cout<<"The queue is full!\n";
        return false;
    }
    else
        return true;
}
int Queue::dequeue()
{
    int firstNumber;
    firstNumber=theQueue[0];
    for (int i= 1;i<size;i++)
         theQueue[i-1]=theQueue[i];
    size=size-1;
    return firstNumber;
}
int Queue::peek(int number) const
{
    return theQueue[number];
}
int Queue::getSize() const
{
    return size;
}
void Queue::display() const
{
    for (int j=0;j<size;j++)
         cout<<theQueue[j]<<" ";
    cout<<endl;
}

1 Ответ

0 голосов
/ 24 апреля 2018

theQueue получил размер 0. Запись в theQueue[0] имела бы неопределенный эффект, скорее всего, запись в поле sequence (0-й элемент массива и поле имеют одинаковый размер и адрес - реализация gcc).Запись или чтение любого другого элемента может привести к неопределенному поведению, возможно, к сбою программы

...