如何在C ++中声明struct变量

时间:2014-01-02 11:14:47

标签: c++ struct

我是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-lang中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[];

现在在构造函数中,我想声明slave_0_pdo_entries []变量,就像我在c-lang中所做的那样。你能帮忙指导我怎么做?

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}};

它向我显示了同样的错误..请指导我.. 谢谢。

3 个答案:

答案 0 :(得分:3)

您的数组声明没有大小,编译器如何知道在实例化类的对象时要分配的该类型的元素数量?它不能。

另外,根据C ++的经验,总是尝试使用std::vectorstd::array而不是C风格的数组。

由于您的数据似乎是 static 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 }
    }};
    //...
};

here您可以找到工作示例。

答案 1 :(得分:2)

你在C中所做的实际上是一件非常特别的事情。通常,您必须为所分配的所有阵列指定大小,但有一个例外,如果您使用支撑列表直接初始化它,则可以省略数组大小。在这种特殊情况下,编译器可以从初始化列表的大小推断出数组的大小。

现在,你可能会问:为什么编译器没有在ec_pdo_entry_info_t slave_0_pdo_entries[];的声明上抛出错误?
答案是,您调用了另一个特殊情况:您可以在struct / class的末尾使用一个(且只有一个)具有未指定大小的数组。但是,编译器不会为它分配任何内存,你必须自己为该对象分配足够的内存。所以,只是在构造函数中初始化这个数组是非常危险的错误。

您有几种方法可以解决问题,其他答案提供了不同的方法:在变量声明的位置初始化变量,或使用一些更高级别的构造,如{{1} }或std::array

答案 2 :(得分:0)

首先,这个非静态数据成员的定义

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 } ),
    };