【问题标题】:How to pass in a 3D array with set x index as a 2D array?如何将设置 x 索引的 3D 数组作为 2D 数组传入?
【发布时间】:2021-08-05 07:23:37
【问题描述】:

我有一个 3D 数组 arr[x][y][z],其中在给定点 x 是一个常数,我想将 are[const][y][z] 作为 2D 指针传入。以下几行是我尝试这样做的方式:

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

这是我关于堆栈溢出的第一个问题,如果您可以提供任何有用的提示,将不胜感激。任何不必要的仇恨都会被忽略。

【问题讨论】:

  • 首先,它不是 3D 数组,它是数组的数组。这很重要。因此tmpMatrix[i] 将给出一个数组数组。 C 样式转换为双指针是不正确的。您应该使用正确的数组类型,甚至最好使用std::array
  • 这能回答你的问题吗? Why can't I treat an array like a pointer in C?
  • 您好,感谢您的反馈。当您说正确的数组类型时,您能否详细说明或提供任何链接来演示?

标签: c++ pointers multidimensional-array reinterpret-cast function-declaration


【解决方案1】:

这个函数声明有错误的注释

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 

【讨论】:

    【解决方案2】:

    void test(int msize, double * m),这里的 m 是一个指向 double 的指针(在使用时是一种数组),不代表二维数组。 因此,您可以通过显式执行地址操作来遍历元素来访问 2D 数组元素,或者您可以更改函数以接收 2D 数组作为指向 Array double (*m)[Z] 的指针,并且您可以将 2D 数组作为一系列 1D 数组进行遍历. 您可以在Create a pointer to two-dimensional arraywhat is `int *userMask[3][4]` pointing to? 参考答案

    【讨论】:

    • 不,m 不是数组。它是一个双精度指针。
    猜你喜欢
    • 2018-11-13
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多