输入二维数组的大小
Inputing the Size of a 2-dimentional Array
在我的代码中,我输入了两个维度的大小,然后声明了一个二维数组。我的问题是,如何使用这个数组作为函数参数?我知道我需要在函数规范中写列的数量,但我如何传递列的数量?
void gameDisplay(gameCell p[][int &col],int a,int b) {
for(int i=0;i<a;i++) {
for(int j=0;j<b;j++) {
if(p[i][j].getStat()==closed)cout<<"C ";
if(p[i][j].getStat()==secure)cout<<"S ";
if(p[i][j].getBomb()==true&&p[i][j].getStat()==open)cout<<"% ";
if(p[i][j].getBomb()==false&&p[i][j].getStat()==open) {
if(p[i][j].getNum()==0)cout<<"0 ";
else cout<<p[i][j].getNum()<<" ";
}
cout<<endl;
}
}
}
int main() {
int row,col,m;
cout<<"Rows: ";cin>>row;cout<<"Columns: ";cin>>col;
m=row*col;
gameCell p[row][col];
gameConstruct(p[][col],m);
gameDisplay(p[][col],row,col);
}
我试过这种方法,但是行不通。
谢谢。
在c++中,不能使用可变长度数组。也就是说,不能将输入的整数用作数组的大小,如下所示:
std::cin >> x;
int array[x];
(这将在gcc中工作,但它是一个不可移植的扩展)
当然,也可以做类似的事情。允许您拥有动态大小数组的语言特性是new[]
的动态分配。你可以这样做:
std::cin >> x;
int* array = new int[x];
但是注意,这里的array
是而不是数组类型。它是指针类型。如果你想动态分配一个二维数组,你必须这样做:
std::cin >> x >> y;
int** array = new int*[x]; // First allocate an array of pointers
for (int i = 0; i < x; i++) {
array[i] = new int[y]; // Allocate each row of the 2D array
}
但是,这仍然不是数组类型。它现在是一个int**
,或"指针指向指针int"。如果要将其传递给函数,则需要将函数的参数设置为int**
。例如:
void func(int**);
func(array);
那太好了。然而,您几乎总是需要知道函数内部数组的维数。你怎么能这么做?只需将它们作为额外参数传递即可!
void func(int**, int, int);
func(array, x, y);
这当然是一种方法,但肯定不是c++惯用的方法。它有安全问题,因为它很容易忘记delete
一切。您必须手动管理内存分配。您必须这样做以避免内存泄漏:
for (int i = 0; i < x; i++) {
delete[] array[i];
}
delete[] array;
所以忘记我刚才告诉你的一切。使用标准库容器。您可以轻松地使用std::vector
,而不必担心传递尺寸:
void func(std::vector<std::vector<int>>);
std::cin >> x >> y;
std::vector<std::vector<int>> vec(x, std::vector<int>(y));
func(vec);
如果你最终要处理数组类型而不是动态分配数组,那么你可以通过定义一个接受数组引用的模板函数来获得数组的维度:
template <int N, int M>
void func(int (&array)[N][M]);
该函数将为传递给它的所有不同大小的数组实例化。模板参数(数组的尺寸)必须在编译时已知。
我编写了一个小程序:
#include <iostream>
using namespace std;
void fun(int tab[][6], int first)
{}
int main(int argc, char *argv[])
{
int tab[5][6];
fun(tab, 5);
return 0;
}
在函数定义中,必须输入第二个索引的大小。列数作为参数传递。
我猜来自'int'您已遵循验证问题的建议,并且您正在使用std::vector
这个函数返回一个"数组"的列数(如果有问题则返回0)。
int num_column(const std::vector<std::vector<int> > & data){
if(data.size() == 0){
std::cout << "There is no row" << std::endl;
return 0;
}
int first_col_size = data[0].size();
for(auto row : data) {
if(row.size() != first_col_size){
std::cout << "All the columns don't have the same size" << std::endl;
return 0;
}
}
return first_col_size;
}
如果你使用的是c风格的数组,你可能想在形参中做一个引用:
int (&array)[2][2]; // reference to 2-dimensional array
这是你要找的吗?
int* generate2DArray(int rowSize, int colSize)
{
int* array2D = new int[rowSize, colSize];
return array2D;
}
示例…
#include <iostream>
#include <stdio.h>
int* generate2DArray(int rowSize, int colSize);
int random(int min, int max);
int main()
{
using namespace std;
int row, col;
cout << "Enter row, then colums:";
cin >> row >> col;
//fill array and display
int *ptr = generate2DArray(row, col);
for(int i=0; i<row; ++i)
for(int j=0; j<col; ++j)
{
ptr[i,j] = random(-50,50);
printf("[%i][%i]: %in", i, j, ptr[i,j]);
}
return 0;
}
int* generate2DArray(int rowSize, int colSize)
{
int* array2D = new int[rowSize, colSize];
return array2D;
}
int random(int min, int max)
{
return (rand() % (max+1)) + min;
}
不是访问p[i][j]
,而是访问p[i*b + j]
-这实际上是编译器为您做的,因为int[a][b]
在内存中被平化为a*b
大小的数组
同样,你可以把这个函数的原型改成"void gameDisplay(gameCell p[],int a,int b)"
固定代码:
void gameDisplay(gameCell p[],int a, int b) {
for(int i=0;i<a;i++) {
for(int j=0;j<b;j++) {
if(p[i*a +j].getStat()==closed)cout<<"C ";
if(p[i*a +j].getStat()==secure)cout<<"S ";
if(p[i*a +j].getBomb()==true&&p[i][j].getStat()==open)cout<<"% ";
if(p[i*a +j].getBomb()==false&&p[i][j].getStat()==open) {
if(p[i*a +j].getNum()==0)cout<<"0 ";
else cout<<p[i*a +j].getNum()<<" ";
}
cout<<endl;
}
}
}
int main() {
int row,col,m;
cout<<"Rows: ";cin>>row;cout<<"Columns: ";cin>>col;
m=row*col;
gameCell p[row][col];
gameConstruct(p[][col],m);
gameDisplay(p[],row,col);
}
- 将值从二维数组输出到文本文件
- 在二维数组中查找最小值和最大值?
- 如何使用用户输入变量制作二维数组?
- 程序终止,状态为 -1073741510 在 for 循环的中间,将输入分配给二维数组
- C++使用二维数组的程序,该数组要求用户输入两次.它需要将这些输入显示为输出
- C++ ->尝试逐字阅读一行文本。如何使指针等效于用于存储输入的当前二维数组
- 从命令行输入分配二维数组
- C++基于用户输入字符串长度创建二维数组
- 根据用户输入对二维数组进行排序和打印
- 我无法让我的程序正确读取输入文件中的值(二维数组)
- 二维数组C++中的输入格式
- 使用输入值创建二维数组的大小
- 如何在C++中为矢量数据结构中的二维数组获取用户输入,而不使用行和列上的两个for循环
- 我如何设置一个5 X 5的二维数组,允许输入所有的数字
- 从用户输入填充二维数组
- 正确地将值输入到二维数组中
- 无法在C++中输入二维数组的值
- 用构造函数和用户输入创建一个二维数组
- 输入二维数组的大小
- 有没有一种方法可以从输入中找到二维数组的行和列