如何将3d数组传递给c ++中的函数?

时间:2015-02-05 04:32:26

标签: c++ arrays

我在main函数中创建了一个3d数组,因为它的一个大小来自于使用过的输入。我正在使用C ++

 std::cin >> size;
    typedef int T[8][3]; 
    T* tables = new T[size];

基本上是tables[size][8][3] 现在我必须在不同的函数中使用这个3d表,并且必须将值存储到其中。通过将此表作为全局变量来实现此目的的最佳方法。但是我不确定在主要功能之后我能做到这一点。我有另一个选项,我必须将此表作为参数传递,并且必须在函数结束时返回该表。 我尝试了这两种方法,但我遇到了错误。请帮我解决这个问题。我不知道选择哪种方法以及如何做 提前谢谢。

**示例:**这是一个我真正想做的例子。这里我在main函数中创建了一个3d数组,通过另一个函数我给了该数组一些输入并再次在main函数中打印出来。

#include <iostream>
#include <conio.h>
using namespace std;


class M
{
public:
    int i,j,k;
public:
    int pass(int (*table)[8][3],int size);

}


int M:: pass(int (*table)[8][3],int s)
{
for (i=0;i<s;i++)
  {
      //int a = tables[i][2][1];
      for(j=0;j<8;j++)
      {
          for(k=0;k<3;k++)
          {
              table[i][j][k]=i;

          }
      }


  }

return (*table)[8][3]; // not sure about this

}



int main()
{
  int size,i,j,k;


  std::cin >> size;

 typedef int T[8][3]; // T is your 2d array type

T* tables = new T[size];
cout << "test";


M mx;
mx.pass(tables,size); // not sure


for (i=0;i<size;i++)
  {

      for(j=0;j<8;j++)
      {
          for(k=0;k<3;k++)
          {
              cout<<tables[i][j][k];
              cout<<"   ";

          }
          cout<<endl;
      }

      cout<<endl;
      cout<<"..........." << i <<endl;
  }

getch();

}

3 个答案:

答案 0 :(得分:0)

由于您要创建两个尺寸固定的动态3D数组,因此使用std::array<std::array<int, 3>, 8>作为2D数组。使用std::vector<__2D_ARRAY_TYPE>创建3D阵列。

#include <iostream>
#include <array>
#include <vector>

int main() {
    std::array<std::array<int, 3>, 8> array_2d ;
    std::vector<decltype(array_2d)> array_3d ;
    int size = 4 ;
    for(int i = 0; i < size; ++i)
    {
        for(int j = 0; j < 8; ++j)
            for(int k = 0; k < 3; ++k)
                array_2d[j][k] = j + k ;
        array_3d.push_back(array_2d);
    }
    return 0;
}

这样的东西可以轻松使用,无需任何手动内存管理即可轻松完成工作。

您可以将其传递给函数。签名将是:

return_type function_name(const std::vector<std::array<std::array<int, 3>, 8>>& array_3d)
{ .... }

答案 1 :(得分:0)

class M
{
public:
    int i,j,k;
public:
    int pass(int (*table)[8][3],int size);

}
你不必两次上市。您可以将所有公开成员数据放在关键字public

此外,您似乎在最后重新编写了您的功能。而不是

cout<<tables[i][j][k];

你可以写

cout<<*tables

答案 2 :(得分:0)

我不知道我是否完全理解你的问题。但是你绝对可以将指针本地存储在对象中并在其他地方引用它。像这样:

class M
{
public:
    M(int(*tbl)[8][3]) : table(tbl) { }
    int(*table)[8][3];
    int i, j, k;
public:
    void pass(int size);

};

void M::pass(int s)
{
    for (i = 0; i<s; i++)
    {
        for (j = 0; j<8; j++)
        {
            for (k = 0; k<3; k++)
            {
                table[i][j][k] = i;

            }
        }
    }
}

int main()
{
    int size, i, j, k;
    std::cin >> size;
    typedef int T[8][3]; // T is your 2d array type
    T* tables = new T[size];
    cout << "test";
    M mx(tables);
    mx.pass(size); // not sure
    for (i = 0; i<size; i++)
    {
        for (j = 0; j<8; j++)
        {
            for (k = 0; k<3; k++)
            {
                cout << tables[i][j][k];
                // or you can also:
                // cout << mx.table[i][j][k];
                cout << "   ";
            }
            cout << endl;
        }
        cout << endl;
        cout << "..........." << i << endl;
    }
    _getch();
}