C++ 差分动静二维阵列c++;

C++ 差分动静二维阵列c++;,c++,C++,我正在使用名为wxFreeChart的开源库绘制一些XY图表。在示例中,有一段代码使用静态数组作为序列: double data1[][2] = { { 10, 20, }, { 13, 16, }, { 7, 30, }, { 15, 34, }, { 25, 4, }, }; dataset->AddSerie

我正在使用名为wxFreeChart的开源库绘制一些XY图表。在示例中,有一段代码使用静态数组作为序列:

double data1[][2] = {
                { 10, 20, },
                { 13, 16, },
                { 7, 30, },
                { 15, 34, },
                { 25, 4, },
        };

dataset->AddSerie((double *) data1, WXSIZEOF(dynamicArray));
WXSIZEOF ismacro的定义类似于:sizeof(数组)/sizeof(数组[0])

在这种情况下,一切都很好,但在我的程序中,我使用动态数组(根据用户输入)

我做了一个测试,编写了如下代码:

double **dynamicArray = NULL;
        dynamicArray = new double *[5] ;

        for( int i = 0 ; i < 5 ; i++ )
            dynamicArray[i] = new double[2];

        dynamicArray [0][0] = 10;
        dynamicArray [0][1] = 20;
        dynamicArray [1][0] = 13;
        dynamicArray [1][1] = 16;
        dynamicArray [2][0] = 7;
        dynamicArray [2][1] = 30;
        dynamicArray [3][0] = 15;
        dynamicArray [3][1] = 34;
        dynamicArray [4][0] = 25;
        dynamicArray [4][1] = 4;

dataset->AddSerie((double *) *dynamicArray, WXSIZEOF(dynamicArray));
double**dynamicArray=NULL;
dynamicArray=新的双精度*[5];
对于(int i=0;i<5;i++)
dynamicArray[i]=新的双精度[2];
动态卡雷[0][0]=10;
动态卡雷[0][1]=20;
动态卡雷[1][0]=13;
动态卡雷[1][1]=16;
动态卡雷[2][0]=7;
动态卡雷[2][1]=30;
动态卡雷[3][0]=15;
动态卡雷[3][1]=34;
动态卡雷[4][0]=25;
动态卡雷[4][1]=4;
数据集->添加序列((双*)*dynamicArray,WXSIZEOF(dynamicArray));
但是它不能正常工作。我的意思是,这一点还没有画出来。我想知道是否有任何可能,我可以“欺骗”那个方法,并以它理解它的方式给它动态数组,并从正确的位置读取数据


感谢您的帮助

您不能在动态分配的阵列上使用
WXSIZEOF
宏。这是为了确定数组的大小,你有一个指向数组的指针:)你不能对非编译时常量数组使用这个技巧

该参数需要数组中的对数-并使用一个复杂的宏来计算(使用宏更好地维护-只有一个地方使用大小常量)

您可能只需将
5
传递给函数(或用于确定数组大小的任何变量)

(我应该补充一点,我不熟悉这个特定的API……它可能会做一些让它无法工作的古怪事情……但我对此表示怀疑)

编辑。从一些注释中可以看出,此函数确实需要连续存储


我认为您不需要编写自己的函数来将这些元素连续地放入内存中。这将是大量的重新分配和复制。更有可能的是,您应该使用不同的类。在浏览了他们非常简单的文档之后,您似乎可以使用它来构建点的动态列表,然后将其添加到
XYDynamicDataset
或其他内容。

您不能在动态分配的数组上使用
WXSIZEOF
宏。这是为了确定数组的大小,你有一个指向数组的指针:)你不能对非编译时常量数组使用这个技巧

该参数需要数组中的对数-并使用一个复杂的宏来计算(使用宏更好地维护-只有一个地方使用大小常量)

您可能只需将
5
传递给函数(或用于确定数组大小的任何变量)

(我应该补充一点,我不熟悉这个特定的API……它可能会做一些让它无法工作的古怪事情……但我对此表示怀疑)

编辑。从一些注释中可以看出,此函数确实需要连续存储


我认为您不需要编写自己的函数来将这些元素连续地放入内存中。这将是大量的重新分配和复制。更有可能的是,您应该使用不同的类。在浏览了他们非常简单的文档之后,您似乎可以使用它来构建一个点的动态列表,然后将其添加到
XYDynamicDataset
或其他内容中。

如果您定义一个类似

double myArr[5][2];
所有的单元格都占用一个连续的内存块,我很确定
dataset->AddSerie
依赖于此

如果使用对new的连续调用将内存分块分配,则无法保证这一点

我的建议是编写一个简单的类,它分配一个连续的内存块用于存储,并使用运算符()以二维数组的形式使用2个索引访问该内存。在内部,您可以使用
向量
来管理存储,并且可以将该向量的第一个元素的地址传递给
数据集->AddSerie

请签入代码并尝试理解它。矩阵示例使用new[]和delete[]。您应该改为使用向量,并使用类型
double
而不是
Fred

在本例中,有这样一个私有部分

class Matrix {
 public:
   ...
 private:
   unsigned nrows_, ncols_;
   Fred* data_;
 };
(该示例显示了
Freds
的矩阵)您应该使用
向量

类矩阵{
公众:
...
私人:
无符号nrows,ncols;
矢量数据;
};

这将使代码更加简单。您甚至不需要析构函数,因为向量管理内存。

如果您定义一个类似

double myArr[5][2];
所有的单元格都占用一个连续的内存块,我很确定
dataset->AddSerie
依赖于此

如果使用对new的连续调用将内存分块分配,则无法保证这一点

我的建议是编写一个简单的类,它分配一个连续的内存块用于存储,并使用运算符()以二维数组的形式使用2个索引访问该内存。在内部,您可以使用
向量
来管理存储,并且可以将该向量的第一个元素的地址传递给
数据集->AddSerie

请签入代码并尝试理解它。矩阵示例使用new[]和delete[]。您应该改为使用向量,并使用类型
double
而不是
Fred

在本例中,有这样一个私有部分

class Matrix {
 public:
   ...
 private:
   unsigned nrows_, ncols_;
   Fred* data_;
 };
(该示例显示了
Freds
的矩阵)您应该使用
向量

类矩阵{
公众:
...
私人:
无符号nrows,ncols;
矢量数据;
};
这将使代码更加简单。你甚至不需要析构函数