在c ++中传递一个多维数组

时间:2015-10-06 05:44:13

标签: c++ arrays parameter-passing

#include <bits/stdc++.h>
using namespace std;

#define HODOR        long long int
#define INF          1234567890
#define rep(i, a, b) for(int i = (a); i < (b); ++i)
#define dwn(i, a, b) for(int i = (a); i >= (b); --i)
#define REP(c, it)   for( typeof( (c).begin()) it = (c).begin();  it !=  (c).end(); ++it)
#define DWN(c, it)   for( typeof( (c).end()) it = (c).end()-1;  it >= (c).begin(); --it)
#define ss(n)        scanf("%s",n)
#define FILL(x,y)    memset(x,y,sizeof(x))
#define pb           push_back
#define mp           make_pair
#define ALL(v)       v.begin(), v.end()
#define sz(a)        ((int)a.size())
#define SET(v, i)    (v | (1 << i))
#define TEST(v, i)   (v & (1 << i))
#define TOGGLE(v, i) (v ^ (1 << i))
#define gc           getchar
#define pc           putchar


template<typename X> inline void inp(X &n ) {
    register int ch=gc();int sign=1;n=0;
    while( ch < '0' || ch > '9' ){if(ch=='-')sign=-1; ch=gc();}
    while(  ch >= '0' && ch <= '9' ) n = (n<<3)+(n<<1) + ch-'0', ch=gc();
    n=n*sign;
}

inline void inps(char *n) {
    register int ch=gc();
    int sign=1;
    int i=0;
    while( ch != '\n' ){ n[i]=(char)ch; ++i; ch=gc();}
    n[i]='\0';
}

int MaxPath(int arr[][100],int n) {
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cout<<arr[i][j]<<" ";
        }
        cout<<endl;
    }
}

int main() {
    int t,n;
    inp(t);

    while(t--) {
        inp(n);
        int arr[n][n];

        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                inp(arr[i][j]);
            }
        }

        float result = MaxPath(arr,n);
   }

   return 0;
}
  

错误似乎是这样:错误:无法将参数'1'的'int()[n]'转换为'int()[100]'到' int MaxPath(int(*)[100],int)'

我在stckoverflow上看过很多帖子,但其中没有一个似乎在起作用

2 个答案:

答案 0 :(得分:1)

你可以像这样

作为指向int的指针传入
 int MaxPath(int** arr,int n)

但为了实现这一点,你必须以不同的方式声明int arr [n] [n]

int main() {
    int t,n;
    inp(t);

    while(t--) {
        inp(n);
        int** arr = new int*[n];

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

        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                inp(arr[i][j]);
            }
        }

        float result = MaxPath(arr,n);
   }
   //deallocate arr
   for (int i = 0; i < n; i++)
   {
       delete[] arr[i];
   }

   delete []arr;

   return 0;
}

答案 1 :(得分:0)

编译器需要能够在MaxPath中计算存储数据项的地址。只有在知道矩阵的宽度时才可以这样做。

最简单的解决方案之一是创建某种矩阵类,在矢量上实现两(或多)维类型。它看起来像这样:

#include <vector>
#include <stdio.h>

template<class T> class matrix 
{
   std::vector<T> v;
   int width;
 public:
   matrix(int w, int h): v(w*h),width(w) {}
   T &operator()(int x, int y) { return v[x+y*width]; }
   const T &operator()(int x, int y) const { return v[x+y*width]; }

};


void f(matrix<int> &m) 
{
   printf("%d\n",m(1,2));
}

int main()
{
   matrix<int> m(5,5);

   m(1,2)=42;
   f(m);
}

这只是一个最小的例子,您可能需要扩展真实世界应用程序的矩阵类。