函数可以返回2d数组吗?

时间:2018-04-04 15:25:37

标签: c++

#include <stdio.h>
#include <stdlib.h>
double matrixMultiply(double a[100][100],double b[100][100], int rowA,int colB,int colArowB){
    double c[100][100];
    int i,j,k;
    for(i=0;i<rowA;i++)
        for(j=0;j<colB;j++){
            for(k=0;k<colArowB;k++)
                c[i][j]=c[i][j]+a[i][k]+b[k][j];}
    return c;
    }
int main()
{
    double a[100][100],b[100][100];
    int n,m,o,p,i,j;
    printf("%s \n", "Nr. linii A:");
    scanf("%d",&n);
    printf("%s \n", "Nr. coloane A:");
    scanf("%d",&m);
    printf("%s \n", "Nr. linii B:");
    scanf("%d",&o);
    printf("%s \n", "Nr. coloane B:");
    scanf("%d",&p);
    printf("%s \n", "A=");
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
            scanf("%d", &a[i][j]);
    printf("%s \n", "B=");
    for(i=0;i<o;i++)
        for(j=0;j<p;j++)
            scanf("%d", &b[i][j]);
    if(m==o){
    printf("Matricile se pot inmulti");
    cout<<matrixMultiply(a,b,n,m,p);
    return 0;}

    else printf("Matricile nu se pot inmulti");

    return 0;
}

我应该乘以2个矩阵A&amp; B,但我不知道如何返回矩阵C,有人可以帮忙吗? 返回矩阵C时出错,我还需要打印矩阵C吗?

4 个答案:

答案 0 :(得分:2)

  

我应该乘以2个矩阵A&amp; B,但我不知道如何返回矩阵C,有人可以帮忙吗?

return c;
由于数组衰减为指针,

将无法工作。不仅如此,一旦函数返回,指针就会变为无效,因为c是一个函数局部变量。

如果在编译时已知矩阵的大小,则可以使用std::array。如果仅在运行时知道矩阵的大小,则应使用std::vector的{​​{3}}。

std::array<std::array<int, 100>, 100> matrixMultiply(...) {}

std::vector<std::vector<int>> matrixMultiply(...) {}

答案 1 :(得分:-1)

正如其他人所说,您可以使用std::vector<std::vector<int>>,但如果您仍想使用2D数组,则需要使用malloc在函数中动态分配2D数组并返回double* matrixMultiply(double a[100][100],double b[100][100], int rowA,int colB,int colArowB)或你也可以在main函数中分配并只传递地址引用cout<<matrixMultiply(&a,&b,n,m,p);

答案 2 :(得分:-1)

首先请注意,由于数组衰减机制

,函数无法返回内置的2d数组

并且我建议您不要使用std::vector,因为它会非常慢并且没有 RVO,返回值优化,复制矢量会花费您太多时间。

所以我希望你使用动态内存并返回数组名称或引用。

答案 3 :(得分:-2)

对于C ++中的这种情况,

vector可能是更好的选择。

该功能可能如下所示,此问题的整个程序为here

using namespace std;

typedef vector<double> MatrixRow;
typedef vector<MatrixRow> Matrix;

Matrix matrix_multiply(const Matrix &left, const Matrix &right)
{
    // Validate conditions of multiplication of matrices
    if (left.empty())
    {
        cerr << "Left matrix is empty." << endl;
        exit(-1);
    }

    if (right.empty())
    {
        cerr << "Right matrix is empty." << endl;
        exit(-1);
    }

    const int leftRowCount = left.size();
    const int leftColumnCount = left.front().size();

    const int rightRowCount = right.size();
    const int rightColumnCount = right.front().size();

    if (leftColumnCount != rightRowCount)
    {
        cerr << "The number of columns of the left matrix is not the same as the number of columns of the right matrix." << endl;
        exit(-1);
    }

    cout << "Calculate steps" << endl
         << "=====" << endl;

    // Calculation
    Matrix matrix(leftRowCount);
    for (int i = 0; i < leftRowCount; i++)
    {
        matrix.at(i).resize(rightColumnCount);
        for (int j = 0; j < rightColumnCount; j++)
        {
            matrix.at(i).at(j) = 0;
            cout << "M(" << i << "," << j << ") = ";
            for (int k = 0; k < leftColumnCount; k++)
            {
                cout << "L(" << i << "," << k << ") + R(" << k << "," << j << ")";
                if (k < leftColumnCount - 1)
                {
                    cout << " + ";
                }
                matrix.at(i).at(j) += left.at(i).at(k) * right.at(k).at(j);
            }
            cout << endl;
        }
    }

    cout << endl;

    return matrix;
}

有关标识符命名的更多信息:

  

在声明中

     

标识符可用于命名对象,引用,   函数,枚举器,类型,类成员,命名空间,模板,   模板特化,参数包,转到标签等   实体,但有以下例外:

     
      
  • 作为关键字的标识符不能用于其他目的;
  •   
  • 保留带有双下划线的标识符;在
  •   
  • 以下划线开头,后跟大写字母的标识符   信保留;
  •   
  • 以下划线开头的标识符   在全局命名空间中保留。
  •   

有关C ++中标识符命名的更多信息,请访问here了解详细信息。