[英]Difference dynamic static 2d array c++
我使用名为wxFreeChart的开源库绘制了一些XY图表。 在示例中,使用静态数组作为序列的代码:
double data1[][2] = {
{ 10, 20, },
{ 13, 16, },
{ 7, 30, },
{ 15, 34, },
{ 25, 4, },
};
dataset->AddSerie((double *) data1, WXSIZEOF(dynamicArray));
WXSIZEOF ismacro定义为:sizeof(array)/ sizeof(array [0])
在这种情况下,一切工作正常,但在我的程序Im中使用了动态数组(根据用户输入)。
我进行了测试,并编写了如下代码:
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));
但它不能正常工作。 我的意思是画点阿伦特。 我想知道是否有可能“欺骗”该方法并以它理解的方式为它提供动态数组,并将从正确的位置读取数据
感谢帮助
您不能在动态分配的数组上使用WXSIZEOF
宏。 那是为了确定数组的大小,您有一个指向数组的指针:)您不能对非编译时常量数组使用该技巧。
该参数需要数组中对的数量-并使用一个棘手的宏来找出它(使用宏对于可维护性更好-只有一个地方使用大小常量)。
您可能只需将5
传递给函数(或用于确定数组大小的任何变量)。
(我应该补充一点,就是我对这个特定的API不熟悉...它可能正在做一些时髦的事情,使它无法正常工作...但是我对此表示怀疑)
编辑。 从某些注释中可以看出,此功能确实需要连续存储。
我认为您无需编写自己的函数即可将这些元素连续存储在内存中。 这将需要大量的重新分配和复制。 您很有可能应该使用其他类。 浏览了非常少的文档之后,您似乎可以使用XYDynamicSerie构建动态的点列表,然后将其添加到XYDynamicDataset
或其他内容中。
如果你定义一个数组像
double myArr[5][2];
所有单元都占据连续的内存块,我很确定dataset->AddSerie
依赖dataset->AddSerie
。
您不能保证如果您连续使用对new的调用来按块分配内存。
我的建议是编写一个简单的类,该类分配连续的内存块用于存储,并使用operator()使用2个索引作为二维数组访问该内存。 在内部,您可以使用vector<double>
来管理存储,还可以将该vector的第一个元素的地址传递给dataset->AddSerie
请检查此C ++常见问题示例中的代码,并尝试理解它。 矩阵示例使用new []和delete []。 您应该使用向量,而类型应该是double
而不是Fred
在示例中哪里有这样的私有部分
class Matrix {
public:
...
private:
unsigned nrows_, ncols_;
Fred* data_;
};
(该示例显示了Freds
的矩阵)。您应该使用vector<double>
class Matrix {
public:
...
private:
unsigned nrows_, ncols_;
vector<double> data_;
};
这将使代码更加简单。 您甚至不需要析构函数,因为向量可以管理内存。
使用@Stephen的答案,我创建了xy图,该图可以轻松处理各种数据,而不会弄乱到(double *)和SIZE <...>宏的转换。 也许这段代码对某些人来说很有趣。
...
// create plot
XYPlot *plot = new XYPlot();
// create dynamic dataset and serie
XYDynamicDataset *ddataset = new XYDynamicDataset();
XYDynamicSerie *dds = new XYDynamicSerie();
///add values. you can simply grab this data from other sources
/// such as std::vector filled by user
dds->AddXY(1.1, 1.1);
dds->AddXY(3.1, 2.1);
dds->AddXY(5.1, 1.8);
ddataset->AddSerie(dds);
ddataset->SetRenderer(new XYLineRenderer());
plot->AddDataset(ddataset);
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.