2011-07-16 51 views
1

我試圖解析返回的信息,這些信息可能在結構中具有可變數量的數據。我不知道如何有效地做到這一點,我寫了一個類,其中包含每個變量作爲一個函數,該函數通過計算適當的偏移量返回數據,但它不是很管理,必須有更好的方法。我已經閱讀過有關向量(對他們沒有太多經驗),但是當我將它們添加到結構中時,它會添加額外的填充以將所有變量轉移。實現指向可變大小結構的指針

例如:

struct info_t { 
    UINT32 signature; 
    UINT32 elements[NUM_ELEMENTS]; 
    UINT32 options; 
}; 

NUM_ELEMENTS是動態生成的,並僅在運行時已知的,這些元件的可變的尺寸必須的或可變的將有錯誤的偏移正好NUM_ELEMENTS的選項。

我很高興,如果其需要的時候,我可以初始化結構的指針,但C++不會讓我有編譯過程中發生未知NUM_ELEMENTS變量的過去。有任何想法嗎?謝謝。

+0

爲什麼你不使用STL容器而不是C數組作爲'elements'? – leftaroundabout

+0

,因爲結構是一個固定的大小,我沒有控制它的佈局和std :: vertex增加填充,它改變了選項的偏移量。 – jeremyb

回答

0

我認爲info_t是您要分析數據的格式,所以你不能改變它。

有沒有什麼特別的原因,爲什麼使用包裝類是不可管理的?這看起來正是OOP有用的問題。如果您wan't一個類,其中接口與info_t兼容,你可以使用下面的佈局:

struct info_t { 
    UINT32 &signature; 
    UINT32 * const elements; 
    UINT32 &options; 
}; 

然後,您必須創建一個構造函數,設置字段指向輸入數據的正確位置。

如果輸入數據作爲一個指針UINT32s數組,構造可能是這個樣子:

info_t(UINT32 *data, size_t number_of_elements) : 
    signature (*data), 
    elements (data+1), 
    options (*(data+number_of_elements+1)) {} 

如果你想data被釋放時,info_t實例超出範圍您可以在構造函數中做到這一點。

+0

有趣的..我從來沒有見過這樣的結構/構造函數聲明,這看起來正是我需要的。謝謝:) – jeremyb

+0

它稱爲「初始化列表」,並在調用構造函數之前初始化元素*。由於引用是常量,所以不能在構造函數中初始化它們。 –

2

可變長度陣列(VLA)不是由C++標準所支持。
C++爲此提供了std::vector

2

通常,你把可變長度值在末端,然後你會拉出作爲一個數組並分配它在一個vector,例如。這種代碼通常不在C++中使用。

+0

我無法控制數據結構,因此我無法將可變長度變量移動到最後。 – jeremyb

1

試着寫一個包裝類這需要的數據,並提供成員函數訪問一個很好的清潔方式中的數據,然後看看它是多麼快。它可能已經足夠快了。

0

(的代碼)一幅畫是一千餘字:

// --> do not instantiate a static variable of these: 

struct info_t_headerstruct { 
    UINT32 signature; 
    UINT32 options; 
    UINT32 num_elements; 
    // no elements !!! 
}; 

// --> do not instantiate a static variable of these, either: 

// header plus variable elements 
struct info_t_struct { 
    info_t_headerstruct header; 
    UINT32 elements[65535]; 
}; 

// --> you will use this type instead: 

typedef 
    info_t_struct* info_t_ptr; 

info_t_ptr generate(size_t variableqty) 
{ 
    size_t HowManyBytes = (sizeof(info_t_headerstruct) + (sizeof UINT32 * variableqty)); 
    info_t_ptr Result = malloc(HowManyBytes); 
} 

// ... 

void doSomething(info_t_ptr dataptr) 
{ 
    dataptr = generate(5); 
    // ... 
} 

這是一個的情況下,你可能要擺脫掉「一切是一類/對象」的想法。我通常在C++中使用「struct」,就像在「plain C」中一樣,作爲數據而不是類/對象。

正如前面的答案中所述。您應該將元素或可變數據移動到數據類型的頁腳。

您還必須添加一個存儲項目數量的字段。該類型被聲明爲非常大的數量。的項目,但是,從來沒有做出真正的變量。

您將使用結構的指針,而不是結構本身。

某些[大學項目/公司]非標準版本的「pascal」或「plain C」在語法中支持這種功能。

+0

我無法控制結構,我無法移動變量,它的數據我試圖解析。 – jeremyb

+0

@ user642559你可以得到相同結構或其他方式的元素數量嗎? – umlcat