(Struct *) Инициализация с использованием имени значения атрибута?

Я определил эту структуру:

typedef struct WHEATHER_STRUCT
{
   unsigned char packetID[1];
   unsigned char packetSize[2];
   unsigned char subPacketID[1];
   unsigned char subPacketOffset[2];
   ...
} wheather_struct;

Как я могу инициализировать эту структуру (используя конструктор или новый), используя имя атрибута? Например:

wheather_struct.packetID = 1;

Finally

Я пробовал это решение, и оно у меня работает, но как вы думаете, это хороший выбор?

WHEATHER_STRUCT * wheather_struct = new WHEATHER_STRUCT();
*weather_struct->packetID = '1';

А для атрибута float:

wheather_struct->floatAttribute= 111.111

Дайте структуре подходящий конструктор (или используйте инициализаторы класса для значений по умолчанию) и прекратите использование malloc в C++.

Jesper Juhl 26.09.2018 17:26

"Как я могу инициализировать эту структуру с помощью malloc и обновить это значение, получив доступ к имени атрибута?" Почему вы вообще используете malloc? Что плохого в использовании конструкторов и new?

Algirdas Preidžius 26.09.2018 17:26

Почему вы используете malloc в программе на C++? Если какой-либо из этих членов WEATHER_STRUCT изменится на типы, отличные от POD, этот вызов malloc не создаст объект, и теперь вам нужно будет выследить трудно обнаруживаемую ошибку.

PaulMcKenzie 26.09.2018 17:27

Хорошо, я не могу использовать новый, потому что структура очень длинная. Но это я использовал malloc, но теперь я знаю, что это не лучший выбор. Должен ли я использовать конструктор для этого примера?

JoseJimRin 26.09.2018 17:33
Хорошо, я не могу использовать новый, потому что конструкция очень длинная. - ???????? Вы знаете, что делает new?
PaulMcKenzie 26.09.2018 17:34

Не могли бы вы привести мне небольшой пример? Я благодарен за то, что инициализировать большую структуру с использованием new было неудачным выбором.

JoseJimRin 26.09.2018 17:35

@JoseJimRin Я благодарен за то, что инициализировать большую структуру с использованием new было неудачным выбором - Опять же, а? Почему вы думали, что malloc будет отличаться (прямо сейчас) от new? Откуда вы получаете этот (плохой) совет?

PaulMcKenzie 26.09.2018 17:37

Я не знаю Пола, по этому я разместил этот вопрос: S

JoseJimRin 26.09.2018 17:39

Что ж, вы должны знать, что делает new, прежде чем делать предположения относительно того, что он делает. Приведенные ниже ответы показывают, как отказаться от malloc и просто использовать new для создания объекта, а также как вообще не использовать new и просто создать объект. Использование конструкций C в программе на C++ - опасная игра, если вы не знаете, что делаете.

PaulMcKenzie 26.09.2018 17:42

Почему у вашего массива packetID только элемент 1?

Galik 26.09.2018 17:43

Потому что мне нужно использовать только 1 байт для отправки этой информации в сокет. (Заголовок)

JoseJimRin 26.09.2018 17:44

Вы знаете, что в C++ есть исправления с целочисленными типами! en.cppreference.com/w/cpp/types/integer

Martin York 26.09.2018 18:23

Да, но если я использую unsigned char, мне не нужно использовать библиотеку <cstdint>

JoseJimRin 26.09.2018 18:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
13
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В C++ вы можете использовать new для выделения и инициализации:

wheather_struct *p = new wheather_struct();

Обратите внимание на круглую скобку в конце - это инициализация значения - заполняет элементы встроенных типов 0.

А потом:

p->packetID[0] = 1;

Если я использую это решение, компилятор говорит мне, что "выражение должно быть изменяемым L-значением"

JoseJimRin 26.09.2018 17:52

@JoseJimRin На какой линии?

Maxim Egorushkin 26.09.2018 18:10

Похоже, мне нужно написать * p -> packetID = '1', у меня это работает.

JoseJimRin 26.09.2018 18:10

@JoseJimRin p->packetID[0] = 1;

Maxim Egorushkin 26.09.2018 18:25

Хорошо, спасибо, но если у меня есть 2 байта для представления информации. И мне нужно поставить значение 300. * p -> packetID = '300'; Правильный вариант?

JoseJimRin 26.09.2018 18:28

@JoseJimRin packetID составляет 1 байт, может содержать значения в диапазоне [0, 255].

Maxim Egorushkin 26.09.2018 18:46

Да, извините, если у меня есть 2 байта для представления значений. Например, packetSize. PackageSize = '300'; Правильный вариант? @MaximEgorushkin

JoseJimRin 27.09.2018 10:10

@JoseJimRin Какую кодировку использует ваш протокол?

Maxim Egorushkin 27.09.2018 11:05

Вы можете добавить инициализаторы {} к своим массивам, чтобы инициализировать их нулями, например:

struct wheather_struct // no need for typedef in C++
{
   unsigned char packetID[1]{};
   unsigned char packetSize[2]{};
   unsigned char subPacketID[1]{};
   unsigned char subPacketOffset[2]{};
};

Затем используйте new для динамического создания объекта:

auto w = new weather_struct;

w->packetID[0] = 'A';

Не забудьте позже удалять:

delete w;

Но (гораздо лучше) используйте умный указатель:

auto w = std::make_unique<weather_struct>(); // will delete itself

w->packetID[0] = 'A';

// no need to delete it

Или (что еще лучше) просто используйте его как объект значения (не всегда возможно):

weather_struct w; 

w.packetID[0] = 'A';

Компилятор не разрешил мне заключать в определение структуры скобки {}.

JoseJimRin 26.09.2018 17:54

@JoseJimRin Вам, вероятно, потребуется установить версию C в вашем компиляторе на C++11 или выше. Какой компилятор вы используете?

Galik 26.09.2018 17:57

32-разрядный оптимизирующий компилятор Microsoft (R) C / C++ версии 16.XX.YYYYY.ZZ для 80x86

JoseJimRin 26.09.2018 18:03

@JoseJimRin Я думаю, вы можете использовать /std:c++11 или /std:c++latest в командной строке.

Galik 26.09.2018 18:12

Другие вопросы по теме