C++ 差分动静二维阵列c++;
我正在使用名为wxFreeChart的开源库绘制一些XY图表。在示例中,有一段代码使用静态数组作为序列:C++ 差分动静二维阵列c++;,c++,C++,我正在使用名为wxFreeChart的开源库绘制一些XY图表。在示例中,有一段代码使用静态数组作为序列: double data1[][2] = { { 10, 20, }, { 13, 16, }, { 7, 30, }, { 15, 34, }, { 25, 4, }, }; dataset->AddSerie
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;
矢量数据;
};
这将使代码更加简单。你甚至不需要析构函数