Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试将二维对象数组复制到另一个函数_C++_Arrays_Pointers_Multidimensional Array - Fatal编程技术网

C++ 尝试将二维对象数组复制到另一个函数

C++ 尝试将二维对象数组复制到另一个函数,c++,arrays,pointers,multidimensional-array,C++,Arrays,Pointers,Multidimensional Array,我试图通过将数组传递给函数将数组从一个类复制到另一个类,但遇到了一些问题。我试图复制的数组似乎丢失了所有数据 // A.h class A public: virtual void Test(); private: A* array2D[30][32]; //B.cpp 无效B::通过(A*array2D[][32]) { 对于(int i=0;i 我的猜测是,当我通过它时,它正在发生,但我不确定我做错了什么 首先,用于填充数组的for循环在嵌套的for循环的最后一次迭代中超出边界: vo

我试图通过将数组传递给函数将数组从一个类复制到另一个类,但遇到了一些问题。我试图复制的数组似乎丢失了所有数据

// A.h

class A
public:
virtual void Test();
private:
A* array2D[30][32];

//B.cpp
无效B::通过(A*array2D[][32])
{
对于(int i=0;i
我的猜测是,当我通过它时,它正在发生,但我不确定我做错了什么

首先,用于填充数组的
for
循环在嵌套的
for
循环的最后一次迭代中超出边界:

void B::pass(A *array2D[][32])
{
    for (int i = 0; i <= 30; i++)  // This goes out-of-bounds on the last iteration
    {
       for (int j = 0; j <= 32; j++)  // This also goes out-of-bounds.
        {
            a[i][j] = array2D[i][j];
        }
    }
}
这将是可行的,但是效率很低(除非一个优秀的优化编译器发现这是低效的并更改了代码)


更好的方法是调用
std::copy

#include <algorithm>

void B::pass(A *array2D[][32])
{
    std::copy(&array2D[0][0], &array2D[29][32], &a[0][0]);
}
#包括
无效B::通过(A*array2D[][32])
{
std::copy(&array2D[0][0]、&array2D[29][32]、&a[0][0]);
}
这是因为C++中的二维数组在邻接内存中有数据布局,因此本质上是一维数组,所以需要数组元素的起始地址和结束地址。
编译器很可能会看到您正在复制一个微不足道的可复制类型(指针),因此对
std::copy
的调用会导致对
memcpy
A*array2D[30][32];
--一个二维指针数组?这真的是目的吗?
A[i][j]=A[i][j]
这似乎很奇怪哦,我想说的是一个对象数组,让我来修正一下,对不起,我打字太快了,把我想要描述的东西弄糟了。对不起,我想这会慢慢变成一个。首先,2D数组复制可以在一行代码中完成,使用
std::copy
并提供正确的参数——不需要一个嵌套的
for
循环。但正如@anastaciu所指出的,您在这里的真正意图是什么?是复制对象,而不是指针?
// B.cpp

void B::pass(A *array2D[][32])
{
    for (int i = 0; i <= 30; i++)
    {

        for (int j = 0; j <= 32; j++)
        {
            a[i][j] = array2D[i][j];

        }

    }
}
void B::pass(A *array2D[][32])
{
    for (int i = 0; i <= 30; i++)  // This goes out-of-bounds on the last iteration
    {
       for (int j = 0; j <= 32; j++)  // This also goes out-of-bounds.
        {
            a[i][j] = array2D[i][j];
        }
    }
}
void B::pass(A *array2D[][32])
{
    for (int i = 0; i < 30; i++)
    {
        for (int j = 0; j < 32; j++)
        {
            a[i][j] = array2D[i][j];
        }
    }
}
#include <algorithm>

void B::pass(A *array2D[][32])
{
    std::copy(&array2D[0][0], &array2D[29][32], &a[0][0]);
}