Как сделать тест с массивами с использованием утверждений? - PullRequest
2 голосов
/ 05 мая 2019

Я пытаюсь написать тест для программы, которая добавляет произведение матриц A и X к матрице Y.Но я получил ошибку:

"Identifier is required"

Я не смог решить или найти решение этой проблемы, поэтому я прошу помощи здесь.

Сначала я подумал, что проблемачто я сравниваю это с неправильным массивом.Затем я попытался передать другие аргументы.Разобрал мой код на несколько функций.Но все же ничего не произошло.

#include<iostream>
#include<cassert>

using namespace std;

void axpy(int n, int m, int k, int **A, int **X, int **Y)
{
    int i, j, q;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            for (q = 0; q < k; q++)
            {
                Y[i][j] += A[i][q] * X[q][j];
            }
        }
    }
    cout << "Product of matrices\n";
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
            cout << Y[i][j] << "  ";
        cout << "\n";
    }
}

void TestAxpy()
{
    int P[2][2] = { {13,11},{27,21} };
    assert(axpy(2,2,2,[1,2][3,4],[4,3][2,1],[5,6][7,8]) == P);
}

int main()
{
    int n, m, k, i, j, q;

    cout << "Enter number of rows of matrix X and columns of matrix A: ";
    cin >> k;
    cout << "Enter number of rows of matrix A and Y: ";
    cin >> n;
    cout << "Enter number of columns of matrix X and Y: ";
    cin >> m;

    int **A = new int *[k];

    for (i = 0; i < k; i++)
        A[i] = new int[n];

    int **X = new int *[m];

    for (i = 0; i < m; i++)
        X[i] = new int[k];

    int **Y = new int *[m];

    for (i = 0; i < m; i++)
        Y[i] = new int[n];


    cout << "Enter elements of matrix A: ";
    for (i = 0; i < n; i++)
        for (j = 0; j < k; j++)
            cin >> A[i][j];
    cout << "Enter elements of matrix X: ";
    for (i = 0; i < k; i++)
        for (j = 0; j < m; j++)
            cin >> X[i][j];
    cout << "Enter elements of matrix Y: ";
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
            cin >> Y[i][j];
    axpy(n, m, k, A, X, Y);
    TestAxpy();
    system("pause");
    return 0;
}

Я хотел получить матрицу 2x2 с результатами [13, 11] [27 21].Вход, который я использовал, такой как:

Enter number of rows of matrix X and columns of matrix A: 2
Enter number of rows of matrix A and Y: 2
Enter number of columns of matrix X and Y: 2
Enter elements of matrix A: 1 2 3 4
Enter elements of matrix X: 4 3 2 1
Enter elements of matrix Y: 5 6 7 8

1 Ответ

3 голосов
/ 05 мая 2019

Это похоже на смесь C и C ++. В C ++ редко нужно использовать необработанные массивы "C", почти всегда лучшим выбором будет std::vector<> или std::array<>. В буст-библиотеке также есть матрица, которая будет хранить именно то, что вам нужно.

С точки зрения вашего конкретного кода есть две проблемы:

  1. Указатели на указатели (**) - это не то же самое, что двухмерные массивы. Они являются двухслойной косвенностью. Первые - это указатели на места в памяти, которые хранят второй слой в памяти. Ниже показано, как это должно работать, чтобы вызывать axpy. Снова настоятельно рекомендует взглянуть на библиотеки std :: vector или boost.
  2. Оператор "==" не будет работать таким образом для массивов Си. Вам нужно указать, как вы хотите, чтобы сравнение происходило. Как написано, он в лучшем случае просто сравнивает адрес памяти, но, скорее всего, выдаст ошибку.
void TestAxpy()
{
    int P[2][2] = { {13,11},{27,21} };
    int A1[2] = {1,2};
    int A2[2] = {3,4};
    int* A[2] = { A1, A2 };

    int X1[2] = {4,3};
    int X2[2] = {2,1};
    int *X[2] = { X1, X2 };

    int Y1[2];
    int Y2[2];
    int *Y[2] = {Y1, Y2 };    

    axpy(2,2,2,A,X,Y);
    //assert(Y == P); //C++ doesn't know how to do this.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...