Как инициализировать динамический массив struct в конструкторе? - PullRequest
1 голос
/ 27 сентября 2019

Это класс Stack, основанный на динамическом массиве struct для Depth First Search (DFS).Программа не может запускаться всякий раз, когда сталкивается с функцией push (), которая показывает, что массив не был успешно инициализирован в конструкторе.

Я пытался найти ошибку и даже изменить динамический массив struct на параллельные массивы, но он все еще не работает.Я прошу прощения, если проблема кажется слишком простой, чтобы быть решенной, поскольку у меня нет сильной основы в C ++.

#include <iostream>
#include <iomanip>
#ifndef HEADER_H
#define HEADER_H

using namespace std;

struct Value
{
    int row;  // row number of position
    int col;  // column number of position

    //operator int() const { return row; }
};

class ArrayStack
{

public:
    int top;
    Value* array;
    ArrayStack();
    bool isEmpty();
    bool isFull();
    void push(int r, int c);
    void pop();
    int poprowvalue(int value);
    int popcolvalue(int value);
    int peekrow(int pos);
    int peekcol(int pos);
    int count();
    void change(int pos, int value1, int value2);
    void display();
    void resize();
private:
    int size;
};

ArrayStack::ArrayStack()
{
    //Initialize all variablies
    top = -1;
    size = 10;
    Value * array = new Value[size];
    for (int i = 0; i < size; i++)
    {
        array[i].row = 0;
        array[i].col = 0;
    }
}

bool ArrayStack::isEmpty()
{
    if (top == -1)
        return true;
    else
        return false;
}

bool ArrayStack::isFull()
{
    if (top == size - 1)
        return true;
    else
        return false;
}

void ArrayStack::resize()
{
    if (isFull())
        size *= 2;
    else if (top == size / 4)
        size /= 2;
}

void ArrayStack::push(int r, int c)
{
    if (isEmpty() == false)
        resize();
    array[top + 1].row = r;
    array[top + 1].col = c;
    top++;
}

void ArrayStack::pop()
{
    int value;

    if (isEmpty())
    {
        cout << "Stack underflow" << endl;
    }
    else
    {
        poprowvalue(array[top].row);
        popcolvalue(array[top].col);
        array[top].row = 0;
        array[top].col = 0;
        top--;
    }
}

int ArrayStack::poprowvalue(int v)
{
    return v;
}

int ArrayStack::popcolvalue(int v)
{
    return v;
}

int ArrayStack::peekrow(int pos)
{
    if (isEmpty())
        cout << "Stack underflow" << endl;
    else
        return array[pos].row;
}

int ArrayStack::peekcol(int pos)
{
    if (isEmpty())
        cout << "Stack underflow" << endl;
    else
        return array[pos].col;
}

int ArrayStack::count()
{
    return (top + 1);
}

void ArrayStack::change(int pos, int value1, int value2)
{
    if (isEmpty())
        cout << "Stack underflow" << endl;
    else
    {
        array[pos].row = value1;
        array[pos].col = value2;
    }

}

void ArrayStack::display()
{
    for (int i = size - 1; i > -1; i--)
    {
        cout << array[i].row << "  " << array[i].col << endl;
    }


}

#endif 

Я ожидаю, что она будет работать хорошо, но исключение всегда выдается в строке 80, котораявыглядит следующим образом:

Exception thrown at 0x00007FF6A160487C in Assignment1.exe: 0xC0000005: Access violation writing location 0x0000000000000000.

1 Ответ

2 голосов
/ 27 сентября 2019

Проблема в следующей строке:

Value * array = new Value[size];

Это объявляет новую переменную array.Вы вместо этого выделяете array, а не свою переменную-член array.

Ответ прост, просто замените его следующим образом:

array = new Value[size];
...