2010-05-24 70 views
0

我使用名为wxFreeChart的开源库来绘制一些XY图表。在示例中,存在其中使用静态数组作为系列代码:差异动态静态二维数组C++

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

dataset->AddSerie((double *) data1, WXSIZEOF(dynamicArray)); 

WXSIZEOF ismacro等定义为:的sizeof(数组)/的sizeof(数组[0])

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

我做了一个试验,并wrotecode象下面这样:

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

但它不正常工作。我的意思是没有绘制。我不知道是否有任何可能,我可以“欺骗”是方法上,并在它知道它的方式动态数组,并从正确的位置读取数据

感谢您的帮助

+0

请考虑更改问题的标题。它应该强调的问题是动态分配一个坐标数组用于wxFreeChart库。这样它可能对其他人有用。我无法编辑我自己 – 2010-05-25 22:56:54

回答

2

如果你定义像

double myArr[5][2]; 

阵列中的所有细胞占据的内存块连续和我敢肯定dataset->AddSerie依赖于这一点。

如果您以块的形式分配内存,则无法保证连续调用新的内存。

我的建议是编写一个简单的类,为存储分配连续的内存块,并使用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_; 
}; 

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

+0

所以,你可以帮我写这样的类,或者如果它更容易实现它使用向量因为我不会忘记你写的东西excaclty。但是你确定AddSerie依赖它是正确的。 – gruber 2010-05-24 00:31:39

+0

@snorlaks:我不相信你需要向后弯曲这个API :)我在我的答案中添加了一个指向XYDynamicSerie的指针,希望这会有所帮助。 – Stephen 2010-05-24 00:40:26

3

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

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

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

(我要补充一点,我不熟悉这个特定的API ...它可能是做一些时髦的,这将使这个不行......但我对此表示怀疑)

编辑。它看起来(从一些评论),这个功能确实需要连续存储。

我不认为你需要编写你自己的函数来把这些元素连续放在内存中。这将是很多重新分配和复制。更可能的是,你应该使用不同的课程。浏览他们非常小的文档后,看起来您可以使用XYDynamicSerie来构建一个动态的点列表,然后将其添加到XYDynamicDataset或其他东西。

+0

当我这样做时,在图表面板上会出现一些垃圾,所以我想知道所有单元格占用连续的内存块的事实在此方法中具有意义 – gruber 2010-05-24 00:39:34

+0

有趣。在浏览他们的API后编辑我的答案。 – Stephen 2010-05-24 00:41:09

0

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

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