Как объявить переменную структуры в C ++

0

Я новичок в 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.

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

конструктор для инициализации структуры. Ответ, который я принял, работает, но я столкнулся с новой проблемой, этот массив будет использоваться другим массивом, но когда я, но эта вещь в том, что он дает мне другую ошибку.

после инициализации массива как принятого ответа, я инициализирую другой массив, см. ниже,

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

Он показывает мне ту же самую ошибку. Я всегда буду вести меня.. Спасибо.

  • 0
    в каком конструкторе?
  • 0
    Если slave_0_pdo_entries был статическим в вашем классе, то вы должны иметь возможность инициализировать его, как в C.
Показать ещё 5 комментариев
Теги:
struct

3 ответа

3
Лучший ответ

Объявление массива не имеет размера, как компилятор знает, сколько элементов этого типа выделяет при создании объекта вашего класса? Это не может.

Кроме того, как правило, в C++ всегда старайтесь использовать std::vector или std::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 }
    }};
    //...
};

И здесь вы можете найти рабочий пример.

  • 0
    Это правильное решение, если данные одинаковы для всех экземпляров класса. Если данные в slave_0_pdo_entries не являются статическими, следует использовать список инициализаторов. Обратитесь к en.cppreference.com/w/cpp/language/initializer_list Поскольку массивы C не поддерживают списки инициализаторов, в этом случае необходимо использовать std :: vector или std :: array.
  • 0
    Как я могу использовать этот метод для общественности?
Показать ещё 8 комментариев
2

То, что вы сделали на C, на самом деле довольно особенное. Обычно вам нужно указать размер для всех распределенных массивов, за исключением того, что вы можете опустить размер массива, если вы непосредственно инициализируете его с помощью скобочного списка, как вы это делали. В этом специальном случае компилятор может вывести размер массива из размера списка инициализаторов.

Теперь вы можете спросить: почему компилятор не выложил ошибку при объявлении ec_pdo_entry_info_t slave_0_pdo_entries[]; ?
Ответ заключается в том, что вы вызвали специальный случай: вы можете использовать один (и только один) массив с неопределенным размером в конце struct/class. Но компилятор не выделяет для него никакой памяти, вам придется выделять достаточно памяти для объекта. Таким образом, просто инициализация этого массива в конструкторе очень опасна неправильно.

У вас есть несколько способов, в которых вы можете исправить свою проблему, другие ответы дают разные способы сделать это: либо инициализировать переменную в том месте, где она объявлена, либо использовать некоторые конструкции более высокого уровня, такие как std::array или std::vector.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню