填充数组的c ++函数

时间:2013-11-17 09:26:26

标签: c++ arrays function

我想做的事情:

用户输入两个数字。 使用这些数字作为维度声明数组。 main()之外的函数正在填充数组。 在main()中访问数组以获取更多内容。

我遇到的问题:

功能+阵列组合似乎并不像我想的那样有效。

我做了什么:

void tablica1(int h, int w)
{
    int m,n;

    for(m=0; m<h; m++)
        for(n=0; n<w; n++) 
        {
            arr[h][w]=1;
        }
}

会发生什么:

数组arr在tablica1()中无法访问,因为它尚未在该函数中声明。

当然,当我在tablica1()中声明数组时,它在main()中无法访问。

可能的解决方案:

  • 将arr传递给tablica1()作为参考 - 不知道该怎么做
  • tablica1()中声明arr并以某种方式将其传递给main() - 不知道该怎么做

其他可能的解决方案?

4 个答案:

答案 0 :(得分:5)

您可以在编译单元级别声明数组以外的数组:

int arr[10][10];

void func() {
    for (int i=0; i<10; i++) {
        for (int j=0; j<10; j++) {
            arr[i][j] = i + j;
        }
    }
}

int main(int argc, const char *argv[]) {
    func();
    std::cout << arr[3][4] << "\n"; // Output will be 7
    return 0;
}

如果你想处理动态大小的矩阵,最常见的模式是使用std::vector std::vector s(它更通用,因此比2d矩阵效率稍低,因为每个行可以有不同的长度,但在大多数情况下,成本差异不是一个大问题)

#include <vector>

std::vector< std::vector< int > > arr;

void func() {
    int height = arr.size();
    int width = arr[0].size();
    for (int i=0; i<height; i++) {
        for (int j=0; j<width; j++) {
            arr[i][j] = i + j;
        }
    }
}


int main() {
    int height = 13;
    int width = 7;

    arr = std::vector< std::vector<int> >(height, std::vector<int>(width));

    func();

    ...
}

答案 1 :(得分:1)

你提到的两个解决方案

1,将arr传递给tablica1()作为参考

void tablica1(int h, int w,int **arr)
{
    int m,n;

    for(m=0; m<h; m++)
        for(n=0; n<w; n++) 
        {
            arr[h][w]=1;
        }
}

void main()
{
  const int h=100,w=100;
  int arr[h][w];
  tablica1(h,w,arr);
}

2,在tablica1()中声明arr并以某种方式将其传递给main()

int **tablica1(int h, int w)
{
    int m,n;
    int **arr=new int*[h];
    for(int i=0;i<h;i++)
    {
       arr[i]=new int[w];
    }
    //it is best to initialize arr by setting each element 0
    for(m=0; m<h; m++)
        for(n=0; n<w; n++) 
        {
            arr[h][w]=1;
        }
   return arr;

}

void main()
{
  const int h=100,w=100;
  int **arr=tablica1(h,w);
  //do somting

  //delete arr
  for(int i=0;i<h;i++)
  {
    delete []arr[i];
  }
  delete []arr;
}

答案 2 :(得分:0)

如果你想声明一个动态的多维数组,你可以使用下面的模板给出。

     #include<iostream.
     #include <vector>
     using namespace std;
     typedef vector<int> vi;

     vector<vi> arr; // arr is a dynamic two dimensional array.
     vi.assign(10,vi());//10 rows of type vi .

如果你想在arr中输入值,你可以通过

来输入
    vi[0].push_back(a);
    vi[0].push_back(b);  // a,b,c are some example values..
    vi[1].push_back(c);

答案 3 :(得分:0)

您可以使用此代码了解

     #include <iostream>
      #include <cstdio>
     #include <vector>
     using namespace std;

     typedef vector <int> vi;

     vector<vi> arr;// dynamic multidimensional array

     int main(){
     cout<<"enter array size\n";
     int h,w,temp;;
     cin>>h>>w;

     arr.assign(h,vi());
     int i, j;
     for(i=0; i < h ;i++)
      for(j=0; j < w; j++)
       {
       cin>>temp;
       arr[i].push_back(temp);
       }

       // for printing
       for(i=0; i < h ;i++){
       for(j=0; j < w; j++)
        {
        cout<<arr[i][j]<<" ";

        }
     cout<<endl;
   }
    return 0;

    }