簡體   English   中英

如何在C ++中聲明結構變量

[英]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::vectorstd::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::arraystd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM