簡體   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