LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4536|回复: 22

C++中如何传递二维数组更方便?

[复制链接]
发表于 2005-7-20 17:05:47 | 显示全部楼层 |阅读模式
传递二维数组,在C里可以这么写:

void aaa(int ** x)
{
}


main()
{
        int X[2][2];
        aaa(X);
}

但是在C++中编译出错,无法从“int [2][2]”转换为“int ** ”,C++似乎不允许把二维数组名赋给指针的指针。

那么在C++中该如何传递最方便而且快速?
发表于 2005-7-20 22:28:44 | 显示全部楼层
作为一个指针,是无法知道每一维的大小的
回复 支持 反对

使用道具 举报

发表于 2005-7-21 08:24:53 | 显示全部楼层
void aaa(int *x, int lines, int rows);



void aaa(int x[][2]);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-21 09:08:44 | 显示全部楼层
Post by doubleelec
void aaa(int *x, int lines, int rows);



void aaa(int x[][2]);


第二种情况不合适,因为数组长度是不确定的,对于第一种情况,恐怕只能写成

main()
{
int X[2][2];
aaa(*X,2,2);
}

然后在函数aaa中将列指针转换成行指针。

唉,怎么就这么别扭呢
回复 支持 反对

使用道具 举报

发表于 2005-7-21 09:14:47 | 显示全部楼层
用模板试试:

  1. #include <iostream>
  2. using namespace std;

  3. template <typename Type , int row, int col>
  4. void printarr(const Type (& r_array)[row][col])
  5. {
  6.     for(int i=0;i<row;i++)
  7.     {
  8.         for(int j=0;j<col;j++)
  9.         cout<< r_array[i][j] <<' ';
  10.         cout <<endl;
  11.     }
  12. }

  13. int main()
  14. {
  15.     int ar[2][3]={{1,2,3},{6,5,4}};
  16.     printarr(ar);
  17.     return 0;
  18. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-21 09:39:15 | 显示全部楼层
模板中的row,col必须在编译的时候确定下来吧,这样不行滴,刚才没说清楚,偶的数组在运行的时候才能知道大小。
回复 支持 反对

使用道具 举报

发表于 2005-7-21 11:57:41 | 显示全部楼层
"偶的数组在运行的时候才能知道大小"
是在堆内分配的吗? 如果是栈内分配置的标准要求是静态的
        int a = 1, b = 2;
        char c[a];
虽然在GCC下能行,然不是标准.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-21 13:14:41 | 显示全部楼层
是在堆中分配的。。。。。
回复 支持 反对

使用道具 举报

发表于 2005-7-22 00:53:06 | 显示全部楼层
如果要用gcc的扩展的话,那比较好办
这样定义

  1. int
  2. aaa(int m, int n; int a[m][n], int m,  int n)
  3. {
  4.        int i = 0, j = 0;
  5.        for(i = 0; i < m; i++){
  6.                for(j = 0; j < n; j++){
  7.                       printf("%d\n", a[i][j]);
  8.                }
  9.        }
  10. }

  11. int
  12. main()
  13. {
  14.     int a[2][3] = {{1,2,3},{4,5,6}};
  15.     aaa(a, 2, 3);
  16.     return 0;
  17. }
复制代码

如果要使用ANSI C的话,似乎没有什么好的办法,只能
#define GET_A(array, cols, i, j) a[(j)+(i)*(cols)]
然后把a[j],替换产GET_A(a, n, i, j)
回复 支持 反对

使用道具 举报

发表于 2005-7-22 03:34:41 | 显示全部楼层
因为数组大小是在动态决定的,c++的type checking 是在编译时决定的。
所以肯定是要用**的。

或者可以考虑用vector.

typedef vector<int> col;
vector<col> array;

可以传递一个array的引用。
foo(vector<col>& theArray,...)
{
   for(vector<col>::iterator it = theArray.begin(); it != theArray.end(); it++ )
   {
       for( col::iterator colit = *it.begin(); ...)

}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表