[英]how to declare struct variable in C++
我是C ++的新手,我將用C編寫的代碼轉換為C ++。
這是結構代碼。
typedef struct {
uint16_t index; /**< PDO entry index. */
uint8_t subindex; /**< PDO entry subindex. */
uint8_t bit_length; /**< Size of the PDO entry in bit. */
} ec_pdo_entry_info_t;
這是C語言中struct的聲明。
ec_pdo_entry_info_t slave_0_pdo_entries[] =
{
{ 0x6040, 0x00, 16 }, // 0
{ 0x607a, 0x00, 32 }, // 2
{ 0x60b0, 0x00, 32 }, // 6
{ 0x60b1, 0x00, 32 }, // 10
{ 0x60b2, 0x00, 16 }, // 14
{ 0x6060, 0x00, 8 }, // 16
{ 0x2078, 0x01, 16 }, // 17
{ 0x60b8, 0x00, 16 }, // 19
{ 0x6041, 0x00, 16 }, // 21
{ 0x6064, 0x00, 32 }, // 23
{ 0x606c, 0x00, 32 }, // 27
{ 0x6077, 0x00, 16 },
{ 0x6061, 0x00, 8 },
{ 0x2071, 0x01, 16 },
{ 0x60b9, 0x00, 16 },
{ 0x60ba, 0x00, 32 },
{ 0x60bb, 0x00, 32 },
};
我制作了一個類,在其中聲明了如下所示的變量,
ec_pdo_entry_info_t slave_0_pdo_entries[];
現在在構造函數中,我想像在c-lang中一樣聲明slave_0_pdo_entries []變量。 您能幫我指導我該怎么做嗎?
Etherlabinterface::Etherlabinterface()
{
master=NULL;
domain0=NULL;
sc_epos3=NULL;
domain0_output=NULL;
slave_0_pdo_entries[]=
{
{ 0x6040, 0x00, 16 }, // 0
{ 0x607a, 0x00, 32 }, // 2
{ 0x60b0, 0x00, 32 }, // 6
{ 0x60b1, 0x00, 32 }, // 10
{ 0x60b2, 0x00, 16 }, // 14
{ 0x6060, 0x00, 8 }, // 16
{ 0x2078, 0x01, 16 }, // 17
{ 0x60b8, 0x00, 16 }, // 19
{ 0x6041, 0x00, 16 }, // 21
{ 0x6064, 0x00, 32 }, // 23
{ 0x606c, 0x00, 32 }, // 27
{ 0x6077, 0x00, 16 },
{ 0x6061, 0x00, 8 },
{ 0x2071, 0x01, 16 },
{ 0x60b9, 0x00, 16 },
{ 0x60ba, 0x00, 32 },
{ 0x60bb, 0x00, 32 }
};
構造函數以初始化struct。 我接受的答案正在工作,但是我面臨着新的問題,該數組將由另一個數組使用,但是當我但是這個東西給我不同的錯誤時。
在將數組初始化為可接受的答案之后,我需要初始化另一個數組,請參見下文,
ec_pdo_info_t slave_0_pdos[] = {
{0x1605, 7, slave_0_pdo_entries + 0},
{0x1a02, 5, slave_0_pdo_entries + 7},
}
在上面的數組中給出錯誤+運算符無效。
在上面的數組之后,我需要初始化另一個下面的數組,
ec_sync_info_t slave_0_syncs[] = {
{0, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE},
{1, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE},
{2, EC_DIR_OUTPUT, 1, slave_0_pdos + 0, EC_WD_ENABLE}};
它向我顯示了相同的錯誤..請指導我..謝謝。
您的數組聲明沒有大小,在實例化類的對象時,編譯器如何才能知道要分配多少個該類型的元素? 這不可以。
同樣,作為C ++的經驗法則,請始終嘗試使用std::vector
或std::array
而不是C樣式的數組。
由於您的數據似乎是靜態和const
您可以執行以下操作:
class the_class {
private:
static constexpr std::array<ec_pdo_entry_info_t, 17> slave_0_pdo_entries {{
{ 0x6040, 0x00, 16 }, // 0
{ 0x607a, 0x00, 32 }, // 2
{ 0x60b0, 0x00, 32 }, // 6
{ 0x60b1, 0x00, 32 }, // 10
{ 0x60b2, 0x00, 16 }, // 14
{ 0x6060, 0x00, 8 }, // 16
{ 0x2078, 0x01, 16 }, // 17
{ 0x60b8, 0x00, 16 }, // 19
{ 0x6041, 0x00, 16 }, // 21
{ 0x6064, 0x00, 32 }, // 23
{ 0x606c, 0x00, 32 }, // 27
{ 0x6077, 0x00, 16 },
{ 0x6061, 0x00, 8 },
{ 0x2071, 0x01, 16 },
{ 0x60b9, 0x00, 16 },
{ 0x60ba, 0x00, 32 },
{ 0x60bb, 0x00, 32 }
}};
//...
};
在這里您可以找到工作示例。
實際上,您在C中所做的事情很特別。 通常,您必須為分配的所有數組指定大小,唯一的例外是,如果直接用支撐列表初始化數組大小,則可以省略數組大小。 在這種特殊情況下,編譯器可以從初始化程序列表的大小中推斷出數組的大小。
現在,您可能會問:為什么編譯器沒有在ec_pdo_entry_info_t slave_0_pdo_entries[];
的聲明中引發錯誤ec_pdo_entry_info_t slave_0_pdo_entries[];
?
答案是,您已經調用了另一種特殊情況:您可以在struct
/ class
的末尾使用一個(且只有一個)大小未指定的數組。 但是,編譯器不會為此分配任何內存,您必須為該對象自己分配足夠的內存。 因此,僅在構造函數中初始化此數組是非常危險的錯誤。
您有幾種方法可以解決問題,其他答案則提供了不同的解決方法:在聲明變量的位置初始化變量,或使用諸如std::array
或std::vector
更高級別的結構std::vector
首先,此非靜態數據成員的定義
ec_pdo_entry_info_t slave_0_pdo_entries[];
類的錯誤。 數組必須是完整的類型,必須指定其尺寸。
如果要對數組使用括號初始化程序,則應使用std :: array類而不是數組。 對於exanoke
std::array<ec_pdo_entry_info_t, 17> slave_0_pdo_entries;
並在構造函數的主體內寫
slave_0_pdo_entries =
{
ec_pdo_entry_info_t( { 0x6040, 0x00, 16 } ), // 0
ec_pdo_entry_info_t( { 0x607a, 0x00, 32 } ), // 2
// other initializers
ec_pdo_entry_info_t( { 0x60bb, 0x00, 32 } ),
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.