C++ 从C+;中的函数传递和返回多维数组+;

C++ 从C+;中的函数传递和返回多维数组+;,c++,function,multidimensional-array,C++,Function,Multidimensional Array,我正在尝试编写一个函数,它将两个矩阵作为参数,并返回这两个矩阵的和 以下是未能通过编译器的代码。我认为函数的实现是错误的,如何纠正呢 #include <iostream> int **func(int **array1, int **array2, int n){ a1 = new int[n][n]; for (int i = 0; i<n; i++){ for (int j = 0; j<n; j++) a1[i][j]=arr

我正在尝试编写一个函数,它将两个矩阵作为参数,并返回这两个矩阵的和

以下是未能通过编译器的代码。我认为函数的实现是错误的,如何纠正呢

#include <iostream>

int **func(int **array1, int **array2, int n){
    a1 = new int[n][n];
    for (int i = 0; i<n; i++){
     for (int j = 0; j<n; j++)
     a1[i][j]=array1[i][j]+array2[i][j];
   }
   return a1;
  }

 int main( ){

 int m1[2][2];
 int m2[2][2];

  m1[0][0]=1; m1[0][1]=2; m1[1][0]=3; m1[1][1]=4;
  m2[0][0]=1; m2[0][1]=2; m2[1][0]=3; m2[1][1]=4;

 int **m3;
  m3 = func(m1,m2,2);

 return 0;
 }
#包括
int**func(int**array1,int**array2,int n){
a1=新整数[n][n];

对于(int i=0;i函数的第一行:需要指定a1的类型

int **a1 = new int[n][n];

函数的第一行:需要指定a1的类型

int **a1 = new int[n][n];
线路

a1 = new int[n][n];
这是行不通的

< 2>分配2D C++数组是这样的:

int **a1;
a1 = new (int *)[n];
for (int i = 0; i < n; i++) {
    a1[i] = new int[n];
}
int**a1;
a1=新的(整数*)[n];
对于(int i=0;i
线路

a1 = new int[n][n];
这是行不通的

< 2>分配2D C++数组是这样的:

int **a1;
a1 = new (int *)[n];
for (int i = 0; i < n; i++) {
    a1[i] = new int[n];
}
int**a1;
a1=新的(整数*)[n];
对于(int i=0;i
一个
int[]
将衰减为
int*
,但是
int[]
不会衰减为
int**
。使用一个包含数组的类并引用它。

一个
int[]
将衰减为
int*
,但是
int[]
不会衰减为
int**
。请使用包含数组的类并引用它。

您不能创建这样的动态大小的矩阵。前两个矩阵可以,因为它们是静态编译的,但您在函数中创建的矩阵必须以这种方式动态创建:

int ** a1 = new int*[n];
for (int i=0; i<n; ++i) a1[i] = new int[n];
int**a1=新的int*[n];

对于(int i=0;i您不能创建这样的动态大小的矩阵。前两个矩阵可以,因为它们是静态编译的,但是您在函数中创建的矩阵必须以这种方式动态创建:

int ** a1 = new int*[n];
for (int i=0; i<n; ++i) a1[i] = new int[n];
int**a1=新的int*[n];
对于(int i=0;i
对于上面的原型,程序无法传递二维数组(即[][]),因为二维数组会衰减为指向一维数组的指针。因此,原型应该是-

int** func( int array1[][2], int array2[][2], int n );

编辑:进行上述更正后,程序需要按照@brado86的建议为2D阵列分配内存。但是,程序还需要释放new获得的资源,否则内存泄漏将占上风

int main( ){

   // .......

   int **m3;
   m3 = func(m1,m2,2);      // m3 is pointing to the resources acquired in func(..)
                            // So, the resources acquired should be returned to
                            // free store. 

   for( int i=0; i<2; ++i )
       delete[] m3[i] ;

   delete[] m3 ;

   return 0;

}
int main(){
// .......
整数**m3;
m3=func(m1,m2,2);//m3指向在func(..)中获取的资源
//因此,获得的资源应该返回给
//免费商店。
对于(int i=0;i
对于上面的原型,程序无法传递二维数组(即[][]),因为二维数组会衰减为指向一维数组的指针。因此,原型应该是-

int** func( int array1[][2], int array2[][2], int n );

编辑:进行上述更正后,程序需要按照@brado86的建议为2D阵列分配内存。但是,程序还需要释放new获得的资源,否则内存泄漏将占上风

int main( ){

   // .......

   int **m3;
   m3 = func(m1,m2,2);      // m3 is pointing to the resources acquired in func(..)
                            // So, the resources acquired should be returned to
                            // free store. 

   for( int i=0; i<2; ++i )
       delete[] m3[i] ;

   delete[] m3 ;

   return 0;

}
int main(){
// .......
整数**m3;
m3=func(m1,m2,2);//m3指向在func(..)中获取的资源
//因此,获得的资源应该返回给
//免费商店。

对于(int i=0;i < p>这是C++代码,使用<代码> STD::<代码> Boo::数组< /Calp>。它们的用法是微不足道的,更安全。您仍然可以从@马赫什的答案中学习如何用原始数组来做。< /P> < P>这是C++,使用<代码> STD::vector < /COD>或Boox> Boo::数组< /代码>。它们的用法是琐碎和安全的。你们仍然可以使用。n从@Mahesh的答案中学习如何使用原始数组执行此操作。

#包括
#include <iostream>

using namespace std;
int** Create2DMatrix(int);
int** AddMatrix(int**&,int**&,int);

void DeleteMatrix(int**&);


 int main( )
 {
     int myDimension=4; // for example
     int i,j;

     int** myFirstMatrix=Create2DMatrix(myDimension);
     int** mySecondMatrix=Create2DMatrix(myDimension);


     // for example without function *


     for (i=0;i<myDimension;i++)
     {
         for (j=0;j<myDimension;j++)
         {
             // for example
             myFirstMatrix[i][j]=i+j;
             mySecondMatrix[i][j]=2*i+7*j-16;
         }
     }

     // show matrix 1
     for (i=0;i<myDimension;i++)
     {
         for (j=0;j<myDimension;j++)
         {
             cout<< myFirstMatrix[i][j] << " ";
         }
         cout << endl;
     }
     cout << endl;

     // show matrix 2
     for (i=0;i<myDimension;i++)
     {
         for (j=0;j<myDimension;j++)
         {
             cout<< mySecondMatrix[i][j] << " ";
         }
         cout << endl;
     }

     int** finalMatrix=AddMatrix(myFirstMatrix,mySecondMatrix,myDimension);

     // show sum of matrix
     cout << endl;
     for (i=0;i<myDimension;i++)
     {
         for (j=0;j<myDimension;j++)
         {
             cout<< finalMatrix[i][j] << " ";
         }
         cout << endl;
     }

     DeleteMatrix(myFirstMatrix);
     DeleteMatrix(mySecondMatrix);
     DeleteMatrix(finalMatrix);




    return 0;
 }

 int** Create2DMatrix(int dim)
 {
     int** myMatrix=new int*[dim];
     int* linearTable=new int[dim*dim];
     for (int i=0;i<dim;i++)
     {
         myMatrix[i]=linearTable+i*dim;
     }
     return myMatrix;
 }

 void DeleteMatrix(int**& MatrixToDel)
 {
     delete [] MatrixToDel[0];
     delete [] MatrixToDel;
     MatrixToDel=0;
 }

 int** AddMatrix(int**& MatrixOne,int**& MatrixTwo,int dimension)
 {
     int** sumMatrix=Create2DMatrix(dimension);
     for (int i=0;i<dimension;i++)
     {
         for (int j=0;j<dimension;j++)
         {
             // for example
             sumMatrix[i][j]=MatrixOne[i][j]+MatrixTwo[i][j];
         }
     }
     return sumMatrix;
 }
使用名称空间std; int**Create2DMatrix(int); int**AddMatrix(int**&,int**&,int); 无效删除矩阵(int**&); int main() { int myDimension=4;//例如 int i,j; int**myFirstMatrix=Create2DMatrix(myDimension); int**mySecondMatrix=Create2DMatrix(myDimension); //例如,没有功能* 对于(i=0;i
#包括
使用名称空间std;
int**Create2DMatrix(int);
int**AddMatrix(int**&,int**&,int);
无效删除矩阵(int**&);
int main()
{
int myDimension=4;//例如
int i,j;
int**myFirstMatrix=Create2DMatrix(myDimension);
int**mySecondMatrix=Create2DMatrix(myDimension);
//例如,没有功能*

对于(i=0;i当它无法通过编译器时,然后发布编译器的输出。当它无法通过编译器时,然后发布编译器的输出。我正在编写编辑,中间被打断了。+1表示好的建议。我正在编写编辑,中间被打断了。+1表示好的建议。只需将
>
之间的空格设置为comp可以使用C++03实现int**func(int array1[][2],int array2[][2],int n);假设列是2。但是如果列事先不知道并且只依赖于n怎么办?那么如何修改此函数呢?非常感谢。只需在
之间留出空格,以便与C++03实现int**func兼容(int-array1[][2],int-array2[][2],int-n);假设列是2。但是如果列事先不知道,并且只依赖于n怎么办?那么如何修改此函数呢?非常感谢。ofc您可以重新编辑代码来创建矩阵(dim1,dim2)=>int**myMatrix=new int*[dim1]…=>int**Create2DMatrix(int-dim1,int-dim2)…=>int*linearTable=new int[dim1*dim2]…=>myMatrix[i]=linearTable+i*dim2;:)@user672117,谢谢。你发布的内容正是我想学习的,即如何在函数中传递数组。但是,我不明白DeleteMatrix是如何工作的?delete[]MatrixToDel[0];“delete[]MatrixToDel”和“delete[]MatrixToDel;”之间有什么区别为什么我们需要MatrixModel=0;?这没什么区别,你必须这么做:)你有一个数字数组,这个数组的地址在MatrixModel[0]上。删除[]MatrixModel[0]后,你需要释放(?)一个指针数组,我不确定