Я определил эту структуру:
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 и обновить это значение, получив доступ к имени атрибута?" Почему вы вообще используете malloc
? Что плохого в использовании конструкторов и new
?
Почему вы используете malloc
в программе на C++? Если какой-либо из этих членов WEATHER_STRUCT
изменится на типы, отличные от POD, этот вызов malloc
не создаст объект, и теперь вам нужно будет выследить трудно обнаруживаемую ошибку.
Хорошо, я не могу использовать новый, потому что структура очень длинная. Но это я использовал malloc, но теперь я знаю, что это не лучший выбор. Должен ли я использовать конструктор для этого примера?
new
?
Не могли бы вы привести мне небольшой пример? Я благодарен за то, что инициализировать большую структуру с использованием new было неудачным выбором.
@JoseJimRin Я благодарен за то, что инициализировать большую структуру с использованием new было неудачным выбором - Опять же, а? Почему вы думали, что malloc
будет отличаться (прямо сейчас) от new
? Откуда вы получаете этот (плохой) совет?
Я не знаю Пола, по этому я разместил этот вопрос: S
Что ж, вы должны знать, что делает new
, прежде чем делать предположения относительно того, что он делает. Приведенные ниже ответы показывают, как отказаться от malloc
и просто использовать new
для создания объекта, а также как вообще не использовать new
и просто создать объект. Использование конструкций C
в программе на C++ - опасная игра, если вы не знаете, что делаете.
Почему у вашего массива packetID
только элемент 1
?
Потому что мне нужно использовать только 1 байт для отправки этой информации в сокет. (Заголовок)
Вы знаете, что в C++ есть исправления с целочисленными типами! en.cppreference.com/w/cpp/types/integer
Да, но если я использую unsigned char, мне не нужно использовать библиотеку <cstdint>
В C++ вы можете использовать new
для выделения и инициализации:
wheather_struct *p = new wheather_struct();
Обратите внимание на круглую скобку в конце - это инициализация значения - заполняет элементы встроенных типов 0.
А потом:
p->packetID[0] = 1;
Если я использую это решение, компилятор говорит мне, что "выражение должно быть изменяемым L-значением"
@JoseJimRin На какой линии?
Похоже, мне нужно написать * p -> packetID = '1', у меня это работает.
@JoseJimRin p->packetID[0] = 1;
Хорошо, спасибо, но если у меня есть 2 байта для представления информации. И мне нужно поставить значение 300. * p -> packetID = '300'; Правильный вариант?
@JoseJimRin packetID
составляет 1 байт, может содержать значения в диапазоне [0, 255].
Да, извините, если у меня есть 2 байта для представления значений. Например, packetSize. PackageSize = '300'; Правильный вариант? @MaximEgorushkin
@JoseJimRin Какую кодировку использует ваш протокол?
Вы можете добавить инициализаторы {}
к своим массивам, чтобы инициализировать их нулями, например:
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 Вам, вероятно, потребуется установить версию C
в вашем компиляторе на C++11
или выше. Какой компилятор вы используете?
32-разрядный оптимизирующий компилятор Microsoft (R) C / C++ версии 16.XX.YYYYY.ZZ для 80x86
@JoseJimRin Я думаю, вы можете использовать /std:c++11
или /std:c++latest
в командной строке.
Дайте структуре подходящий конструктор (или используйте инициализаторы класса для значений по умолчанию) и прекратите использование
malloc
в C++.