получение ошибки сегментации в функции PrintArray () - PullRequest
1 голос
/ 02 февраля 2020
class Array
{
    int sizeX, sizeY;
    int **array;

public:

    void EnterElements()
    {
        for(int i = 0; i < sizeX; i++)
        {
            cout << "Enter Elements Of Row:" << i+1 <<endl;
            for(int j = 0; j < sizeY; j++)
            {
                cin >> array[i][j];
            }
        }
    }

    Array()
    {
        sizeX = sizeY = 2;

        array = new int*[sizeX];
        for(int i = 0; i<sizeX; i++)
        {
            array[i] = new int[sizeY];
        }
    }

    Array(int x, int y)
    {
        sizeX = x;
        sizeY = y;

        array = new int*[sizeX];
        for(int i = 0; i<sizeX; i++)
        {
            array[i] = new int[sizeY];
        }
    }

    Array(Array &t)
    {
        sizeX = t.sizeX;
        sizeY = t.sizeY;

        array = new int* [sizeX];
        for(int i = 0; i<sizeX; i++)
        {
            array[i] = new int [sizeY];
        }

        for(int i = 0; i<sizeX; i++)
        {
            for(int j = 0; j<sizeY; j++)
            {
                array[i][j] = t.array[i][j];
            }
        }
    }

    void PrintArray()
    {
        for(int i = 0; i<sizeX; i++)
        {
            for(int j = 0; i<sizeY; j++)
            {
                cout << (int)array[i][j] << "\t";
            }
            cout << endl;
        }
    }

    Array& operator *(Array array2)
    {
        Array temp(this->sizeY, array2.sizeX);

        if(this->sizeY != array2.sizeX)
        {
            cout << "Cant Multiply" << endl;
            return temp;
        }

        for(int i = 0; i < sizeX; i++)
        {
            for(int j = 0; j < sizeY; j++)
            {
                for(int k = 0; k < sizeX && k < sizeY; k++)
                {
                    temp.array[i][j] += this->array[i][k]*array2.array[k][j];
                }
            }
        }

        return temp;
    } 
};

int main()
{
    Array a(3,3), b(3,3);
    a.EnterElements();
    b.EnterElements();

    a.PrintArray();
    b.PrintArray();
    Array c(a*b);
    c.PrintArray();

    return 0;
}

пытается умножить две матрицы, используя oop, но получает ошибку сегментации. Я использую двойные указатели. Пожалуйста, помогите мне решить эту проблему. Также будут приветствоваться любые предложения / улучшения в коде.

1 Ответ

0 голосов
/ 02 февраля 2020

помогите мне решить эту проблему

Вы выделяете динамическую c память в конструкторе, но никогда не удаляете ее. Это утечка памяти (но не причина вашего cra sh).

Вы также пренебрегали реализацией конструктора копирования и оператора присваивания, нарушая правило о трех .

Теперь к актуальной проблеме: компиляция вашей программы (после добавления отсутствующего #include) приводит к:

t.cc:80:15: warning: reference to local variable ‘temp’ returned [-Wreturn-local-addr]

Это предупреждение приходит отсюда:

   Array& operator *(Array array2)
    {
        Array temp(this->sizeY, array2.sizeX);
...
        return temp;
    }

Возвращение ссылки на Локальная переменная плохая, поскольку ссылка не ссылается на действительный объект, как только возвращается operator*(), поэтому ваша программа демонстрирует неопределенное поведение.

Исправляя вышеуказанную ошибку, мы переходим к следующему (трудно определить ) один:

    void PrintArray()
    {
        for(int i = 0; i<sizeX; i++)
        {
            for(int j = 0; i<sizeY; j++)   // wrong variable used for loop limit (should be j)
            {
                cout << (int)array[i][j] << "\t";
            }
            cout << endl;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...