繁体   English   中英

差异动态静态二维数组C ++

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM