如何将设置 x 索引的 3D 数组作为 2D 数组传递?
How to pass in a 3D array with set x index as a 2D array?
我有一个 3D 数组 arr[x][y][z]
,其中给定点 x 是一个常数,我想将 are[const][y][z]
作为二维指针传入。以下几行是我尝试这样做的方式:
double tmpMatrix[msize][msize][msize];<- array declaration
...
test(msize, (double*)(tmpMatrix[i]));<- function calling
...
void test(int msize, double * m) <- function which takes in 2D arrays
这是我关于堆栈溢出的第一个问题,如果您能提供一些有用的提示,将不胜感激。任何不必要的仇恨都将被忽略。
void test(int msize, double * m),这里的m是指向double的指针(使用时充当数组),不代表二维数组。
因此,您可以通过显式执行地址操作来访问二维数组元素以遍历元素,或者您可以更改函数以接收二维数组作为指向数组 double (*m)[Z]
的指针,并且您可以将二维数组作为一系列一维数组。
您可以在 Create a pointer to two-dimensional array and what is `int *userMask[3][4]` pointing to?
参考答案
这个函数声明有一个错误的注释
void test(int msize, double * m) <- function which takes in 2D arrays
函数的参数均未声明为二维数组或指向二维数组的指针。
你的意思好像是
void test(int n, double ( * m )[msize][msize] ); <- function which takes in 2D arrays.
其中 msize
- 是编译时常量。
或者如果你想传递一个指向二维数组的指针作为一个指向一维数组的指针那么你必须写
test( ( msize - x ) * msize * msize, reinterpret_cast<double *>( tmpMatrix + x ) );
这是一个演示程序我在函数测试中改变了参数声明的顺序。
#include <iostream>
const size_t msize = 3;
void test( double *a, size_t n )
{
for ( size_t i = 0; i < n / ( msize * msize ); i++ )
{
for ( size_t j = 0; j < msize; j++ )
{
for ( size_t k = 0; k < msize; k++ )
{
std::cout << a[i * msize * msize + j * msize + k] << ' ';
}
std::cout << '\n';
}
std::cout << '\n';
}
}
int main()
{
double a[msize][msize][msize] =
{
{
{ 1.1, 2.1, 3.1 },
{ 4.1, 5.1, 6.1 },
{ 7.1, 8.1, 9.1 }
},
{
{ 1.2, 2.2, 3.2 },
{ 4.2, 5.2, 6.2 },
{ 7.2, 8.2, 9.2 }
},
{
{ 1.3, 2.3, 3.3 },
{ 4.3, 5.3, 6.3 },
{ 7.3, 8.3, 9.3 }
},
};
for ( size_t i = 0; i < msize; i++ )
{
test( reinterpret_cast<double *>( a + i ), ( msize - i ) * msize * msize );
putchar( '\n' );
}
return 0;
}
程序输出为
1.1 2.1 3.1
4.1 5.1 6.1
7.1 8.1 9.1
1.2 2.2 3.2
4.2 5.2 6.2
7.2 8.2 9.2
1.3 2.3 3.3
4.3 5.3 6.3
7.3 8.3 9.3
1.2 2.2 3.2
4.2 5.2 6.2
7.2 8.2 9.2
1.3 2.3 3.3
4.3 5.3 6.3
7.3 8.3 9.3
1.3 2.3 3.3
4.3 5.3 6.3
7.3 8.3 9.3
我有一个 3D 数组 arr[x][y][z]
,其中给定点 x 是一个常数,我想将 are[const][y][z]
作为二维指针传入。以下几行是我尝试这样做的方式:
double tmpMatrix[msize][msize][msize];<- array declaration
...
test(msize, (double*)(tmpMatrix[i]));<- function calling
...
void test(int msize, double * m) <- function which takes in 2D arrays
这是我关于堆栈溢出的第一个问题,如果您能提供一些有用的提示,将不胜感激。任何不必要的仇恨都将被忽略。
void test(int msize, double * m),这里的m是指向double的指针(使用时充当数组),不代表二维数组。
因此,您可以通过显式执行地址操作来访问二维数组元素以遍历元素,或者您可以更改函数以接收二维数组作为指向数组 double (*m)[Z]
的指针,并且您可以将二维数组作为一系列一维数组。
您可以在 Create a pointer to two-dimensional array and what is `int *userMask[3][4]` pointing to?
这个函数声明有一个错误的注释
void test(int msize, double * m) <- function which takes in 2D arrays
函数的参数均未声明为二维数组或指向二维数组的指针。
你的意思好像是
void test(int n, double ( * m )[msize][msize] ); <- function which takes in 2D arrays.
其中 msize
- 是编译时常量。
或者如果你想传递一个指向二维数组的指针作为一个指向一维数组的指针那么你必须写
test( ( msize - x ) * msize * msize, reinterpret_cast<double *>( tmpMatrix + x ) );
这是一个演示程序我在函数测试中改变了参数声明的顺序。
#include <iostream>
const size_t msize = 3;
void test( double *a, size_t n )
{
for ( size_t i = 0; i < n / ( msize * msize ); i++ )
{
for ( size_t j = 0; j < msize; j++ )
{
for ( size_t k = 0; k < msize; k++ )
{
std::cout << a[i * msize * msize + j * msize + k] << ' ';
}
std::cout << '\n';
}
std::cout << '\n';
}
}
int main()
{
double a[msize][msize][msize] =
{
{
{ 1.1, 2.1, 3.1 },
{ 4.1, 5.1, 6.1 },
{ 7.1, 8.1, 9.1 }
},
{
{ 1.2, 2.2, 3.2 },
{ 4.2, 5.2, 6.2 },
{ 7.2, 8.2, 9.2 }
},
{
{ 1.3, 2.3, 3.3 },
{ 4.3, 5.3, 6.3 },
{ 7.3, 8.3, 9.3 }
},
};
for ( size_t i = 0; i < msize; i++ )
{
test( reinterpret_cast<double *>( a + i ), ( msize - i ) * msize * msize );
putchar( '\n' );
}
return 0;
}
程序输出为
1.1 2.1 3.1
4.1 5.1 6.1
7.1 8.1 9.1
1.2 2.2 3.2
4.2 5.2 6.2
7.2 8.2 9.2
1.3 2.3 3.3
4.3 5.3 6.3
7.3 8.3 9.3
1.2 2.2 3.2
4.2 5.2 6.2
7.2 8.2 9.2
1.3 2.3 3.3
4.3 5.3 6.3
7.3 8.3 9.3
1.3 2.3 3.3
4.3 5.3 6.3
7.3 8.3 9.3