2010-05-24 71 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); 
...