Не могу понять данную структуру

Tima123
Offline
Зарегистрирован: 29.01.2020

Здравствуйте, уважаемые форумчане. Нашел интересный код, но не могу понять одну конструкцию.
 

#define SIZE_TX_BUFFER 64
#define SIZE_RX_BUFFER 128

struct txBuffer_s
{
	uint8_t buffer[SIZE_TX_BUFFER];
	uint8_t tail;
	uint8_t head;
};

struct rxBuffer_s
{
	char buffer[SIZE_RX_BUFFER];
	uint8_t count;
};

struct rxBuffer_s rxBuffer = {{0},0};    // Выходной буфер USARTа.
struct txBuffer_s txBuffer = {{0},0,0};  // Входной буфер USARTа.

 

Мне не понятна эта часть:

struct rxBuffer_s rxBuffer = {{0},0};    // Выходной буфер USARTа.
struct txBuffer_s txBuffer = {{0},0,0};  // Входной буфер USARTа.

Что означает данная конструкция? Можно ли так объявлять структуру?

Разве не должна быть объявлена переменная таким образом:

rxBuffer_s rxBuffer;
txBuffer_s txBuffer;

 

 

 

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Она не должна, но может быть так объявлена, если выше по тексту будет использован typedef.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Tima123 пишет:

struct rxBuffer_s rxBuffer = {{0},0};    // Выходной буфер USARTа.
struct txBuffer_s txBuffer = {{0},0,0};  // Входной буфер USARTа.

Что означает данная конструкция?

Что в переменных rxBuffer и txBuffer изначально будут записаны нули во всех полях. Они и так бы там были, но явно это указать - более правильно. 

Tima123 пишет:
Можно ли так объявлять структуру?

Нет, конечно, но здесь её никто и не обновляет.

Tima123 пишет:

Разве не должна быть объявлена переменная таким образом:

rxBuffer_s rxBuffer;
txBuffer_s txBuffer;

Переменная никому ничего не должна. У Вас есть кредитный договор с нею? Нет? Ну, а чего она Вам должна тогда?

Tima123
Offline
Зарегистрирован: 29.01.2020

typedef не была объявлена.
 

Загрузил этот код. Странно но компилятор не ругается, принимает.


#define SIZE_TX_BUFFER 64
#define SIZE_RX_BUFFER 128


void setup() {
  
struct txBuffer_s
{
  uint8_t buffer[SIZE_TX_BUFFER];
  uint8_t tail;
  uint8_t head;
};

struct rxBuffer_s
{
  char buffer[SIZE_RX_BUFFER];
  uint8_t count;
};

struct rxBuffer_s rxBuffer = {{0},0};    // Выходной буфер USARTа.
struct txBuffer_s txBuffer = {{0},0,0};  // Входной буфер USARTа.

}

void loop() {
  // put your main code here, to run repeatedly:

}

 

Tima123
Offline
Зарегистрирован: 29.01.2020

А можно по-подробнее объяснить про это (или ссылку на какой-нибудь источник):

{{0},0};
{{0},0,0};

"Нет, конечно, но здесь её никто и не обновляет." - тогда почему два раза пишется struct?
 

sadman41
Offline
Зарегистрирован: 19.10.2016

Это инициализация членов структуры: массива и переменных.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Tima123 пишет:

А можно по-подробнее объяснить про это (или ссылку на какой-нибудь источник):

{{0},0};
{{0},0,0};

Да, конечно, в самой первой теме раздела "песочница", первая ссылка вот в этом посте. Про эти вещи написано в § 11.6.1.

Tima123 пишет:

"Нет, конечно, но здесь её никто и не обновляет." - тогда почему два раза пишется struct?

Не понял каким боком связано "никто не обновляет" и "два раза struct".

Не обновляет потому. что здесь задаются начальные значения, а не обновляются текущие.

А что касается struct, поясните что Вас смущает и где два раза - то? Вроде

struct rxBuffer_s rxBuffer = {{0},0};    // Выходной буфер USARTа.

один раз struct написано.

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП, вас в посте 2, полагаю, автозамена подвела и получилось "обновляет" вместо "объявляет".

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:
ЕвгенийП, вас в посте 2, полагаю, автозамена подвела и получилось "обновляет" вместо "объявляет".

Нет, это меня кривые глаза подвели - я прочитал у ТС это слово как "обновлять".

ТС, забудьте про "обновление", это я ошибся, сорри.

Tima123
Offline
Зарегистрирован: 29.01.2020

Огромное Вам спасибо за ссылку. То что я и искал. Тема инициализаторы (а то я даже названия незнал и соответственно в поисковике вбить не мог).

Насчет того что написано два раза struct, это я имел ввиду вот, например:

struct rxBuffer_s
{
	char buffer[SIZE_RX_BUFFER];
	uint8_t count;
};

struct rxBuffer_s rxBuffer = {{0},0};    // Выходной буфер USARTа.

struct rxBuffer_s