差异动态静态2d数组c ++

时间:2010-05-24 00:16:31

标签: 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])

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

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

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));

但它无法正常工作。我的意思是点不被画出来。我想知道是否有可能“欺骗”那个方法并以理解它的方式给它动态数组并从正确的位置读取数据

感谢您的帮助

3 个答案:

答案 0 :(得分:3)

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

参数需要数组中的对数 - 并使用棘手的宏来计算它(使用宏更好的可维护性 - 只有一个地方使用大小常量)。

可能只是简单地将5传递给函数(或用于确定数组大小的任何变量)。

(我应该补充一点,我对这个特殊的API并不熟悉......而且它可能会做一些时髦的事情,这会让它无效......但我对此表示怀疑)

EDIT。 (从某些评论中)看来,此功能确实需要连续存储。

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

答案 1 :(得分:2)

如果您定义类似

的数组
double myArr[5][2];

所有单元格都占据了大量内存,我非常确定dataset->AddSerie依赖于此。

如果您使用连续调用new来分配内存,则无法保证。

我的主张是编写一个简单的类,为存储分配连续的内存块,并使用operator()作为使用2个索引的二维数组访问该内存。在内部您可以使用vector<double>来管理存储空间,并且可以将该向量的第一个元素的地址传递给dataset->AddSerie

请检查this C++ FAQ example中的代码并尝试了解它。矩阵示例使用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_;
 };

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

答案 2 :(得分:0)

使用@ Stephen的答案我创建了xy plot,它可以轻松处理各种数据,而不会将转换为(double *)和SIZE&lt; ...&gt;宏。也许这段代码对某人来说很有趣。

...
// 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);
...