如何解决如何使用c ++中的指针将未知大小的多维数组传递给函数?
| 就像问题说的那样,我试图将多维数组传递给函数以将其打印到工程项目的文件中。不能更改输入数据的格式,因此请不要建议仅将其输入为其他数据类型。 这个特殊的函数期望一个二维数组(尽管我还有其他二维数组),在运行之前,对数组的大小一无所知。我知道我必须使用指针分别指向数组的每一行,但是我不知道将其传递给函数的语法是什么。在以下代码中,所讨论的数组为\'block \'。主要功能只是我为使其正常工作而做的一些测试示例:#include<fstream>
using namespace std;
void of_write_blocks(string filename,string block_type[],int **block,int grid[][3],string grade_type[],int grade[][3],int n_blocks,int m[])
{
ofstream file_out(filename.c_str(),ios::app);
file_out<<\"\\nblocks\\n(\\n\";
for(int i=0;i<n_blocks;++i) {
file_out<<\" \"<<block_type[i]<<\" ( \";
for(int j=0;j<m[i];++j)
file_out<<block[i][j]<<\" \";
file_out<<\") ( \";
file_out<<grid[i][0]<<\' \'<<grid[i][1]<<\' \'<<grid[i][2]<<\" ) \";
file_out<<grade_type[i]<<\" ( \";
file_out<<grade[i][0]<<\' \'<<grade[i][1]<<\' \'<<grade[i][2]<<\" )\\n\";
}
file_out<<\");\\n\";
}
//testing example:
int main()
{
int block[6][9];
for(int i=0; i<6;++i)
for(int j=0; i<9;++j)
block[i][j] = i*j;
int grid[6][3];
for(int i=0; i<6;++i)
for(int j=0; i<3;++j)
block[i][j] = i*j;
int grade[6][3];
for(int i=0; i<6;++i)
for(int j=0; i<3;++j)
block[i][j] = i*j;
string grade_type[6] = {\"simpleGrading\"};
string block_type[6] = {\"hex\"};
int m[6] = {8};
int n_blocks = 6;
of_write_blocks(\"name\",block_type,block,grid,grade_type,grade,n_blocks,m);
}
任何帮助表示赞赏!
解决方法
你不能。多维数组是语法糖,可以直接编译为对数组进行操作的代码,该数组是单个内存块。维度不会作为参数或类似的东西作为数组的一部分传递给函数,因为事情是在例如Java或C#。
如果您在函数中需要数组的维,则只需要接受一个指向数组第一个元素和该维的指针,然后进行乘法和加法即可自己获得正确的索引。
或者,使用诸如“ 1”之类的方法,该方法将尺寸作为对象的一部分而不是内置数组传递。
,如果已安装Boost,请检查Boost Multi-Array。
,为了清楚起见,我从示例中删除了所有不相关的代码。
#include <iostream>
#include <fstream>
using namespace std;
void of_write_blocks(int **block,int bh,int bw){
for(int i = 0; i < bh; ++i)
for(int j = 0; j < bw; ++j)
cout << block[i][j] << \" \";
cout << endl;
}
int main(){
int bh,bw;
cin >> bh >> bw;
int** block;
block = new int*[bh];
for(int k = 0; k < bh; k++)
block[k] = new int[bw];
// initialize the array
for(int i = 0; i < bh; i++)
for(int j = 0; j < bw; j++)
block[i][j] = (i*bw) + j;
of_write_blocks( block,bh,bw);
}
首先,我们将创建一个2D数组并将其初始化。然后,将其传递给of_write_block,后者将打印数组。那是你想做的吗?
,为什么不能使用数组引用。请参见以下示例:
char c[10];
int i[10][20];
double d[10][20][30];
编写一个包装函数,如下所示:
template<typename T,int SIZE>
void Array (T (&a)[SIZE])
{}
template<typename T,int SIZE1,int SIZE2>
void Array (T (&a)[SIZE1][SIZE2])
{}
template<typename T,int SIZE2,int SIZE3>
void Array (T (&a)[SIZE1][SIZE2][SIZE3])
{}
这只是一个示例,以演示语法,该语法将优雅地接收数组而不进行任何复制,并且还避免了混淆指针。另外,如果您知道仅将其用于int
,则只需删除类型名称并明确提及int
。即
template<int SIZE>
void Array (int (&a)[SIZE]); // explicitly mention int
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。