如何找到传递给函数的矩阵的大小?

问题描述 投票:0回答:1

在此C ++代码中,sizeof(ar)不能帮助我查找cols和rows变量,并且总是给我相同的错误cols和rows。如何在不将sizeX和sizeY变量传递给IsMagicSquare(arr)函数的情况下找到矩阵的大小?您可以帮助我了解此问题并找到解决方法吗?

int main()
{
    int sizeX, sizeY;
    cout << "Size of Matrix:";
    cin >> sizeX >> sizeY;

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

    cout << "Elements of the Matrix:";
    for (int i = 0; i < sizeX; i++)
        for (int j = 0; j < sizeY; j++)
            cin >> arr[i][j];

    if (IsMagicSquare(arr))
    {
        for (int i = 0; i < sizeX; i++)
        {
            cout << "\n";
            for (int j = 0; j < sizeY; j++)
                cout << arr[i][j];
        }
    }
    else
    {
        for (int i = 0; i < sizeY; i++)
        {
            delete[] arr[i];
        }
        delete[] arr;
    }


    return 0;
}

bool IsMagicSquare(int** ar)
{
    int rows = sizeof (ar)/ sizeof (ar[0]);
    int cols = sizeof (ar[0]) / sizeof(int); 
    cout << rows << cols;
    if (rows == cols)
    {
        int* ver = new int[rows]();
        int* hor = new int[cols]();
        int cross0=0;
        int cross1=0;

        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                hor[i] += ar[i][j];
                ver[j] += ar[i][j];
                if (i == j)
                    cross0 += ar[i][j];
                else if ((i+j) == cols)
                    cross1 += ar[i][j];
            }
        }
        if (cross0 != cross1)
            return false;
        else
        {
            for (int i = 0; i < rows; i++)
                if ((cross0 != ver[i]) || (cross1 != hor[i]))
                    return false;
        }
    }
    else
        return false;

    return true;
}
c++ function pointers multidimensional-array dynamic-memory-allocation
1个回答
1
投票

只需合计您为合理的估算而做出的分配:

  • 外部数组:sizeY * sizeof(int*)
  • 内部数组:sizeY * sizeX * sizeof(int)

当然,您在IsMagicSquare()中获得的大小计算将不起作用:sizeof对类型而不是实际分配的内存进行运算。该信息会丢失,无法从指针中恢复。最好使用std::vector<std::vector<int>>。它处理自动内存分配,并跟踪结构的大小。

© www.soinside.com 2019 - 2024. All rights reserved.