ПредишенСледващото

Структура - удобна за съхранение на разнородни данни, които трябва да бъдат комбинирани. Например, можете да създадете структура, която описва настройките на устройството ви - мрежови настройки, спящ режим на изчакване, неговото име и други подобни неща, като всеки поздрав линия и LED статус. След като всички параметри, ще се съхраняват на едно място - те винаги ще бъдат видими, и нормалната IDE бихте предложили за структурата на поле са достъпни. И все пак ние считаме, съхранението и възстановяването на органи от архива, както и предаването им в мрежата.

Как става това?

Това може да се направи малко по-различно: да обяви само от вида и променливата да започне по-късно. За да направите това, ние ще използваме typedef ключовата дума, и пише, както следва:

Разбира се, че може и в двата случая да обяви произволен брой копия на структурите, или да се създаде масив от тях:

Версия на масива е особено полезна за сървъра в клиент-сървър мрежова топология е - всеки клиент се съхранява в структурата на собствените си параметри, а главното устройство е масата на параметрите на всички клиенти под формата на масив от структури.

По принцип нищо сложно структури там, и с темата на сървъри и клиенти, ние постепенно се стигна до по-интересна тема:

Съхранение, пренасяне и синхронизация на структури

За много хора ще се учудите, че структурите от данни се съхраняват в паметта като плосък списък на всички структури на терена само да отидете в паметта една след друга. Следователно, става възможно да се справят с тази структура като масив от байтове с прост! Ние се провери създаде масив от "отгоре" на конструкцията.

Започвайки компенсира получите това:

sizeof и offsetof

Той дори не е функция, както и вградени в езика макроси. Да започнем с един прост, sizeof.

Компилаторът замества всички видове запис sizeof X от X. стойност дължина X може да действа като двата вида и ekzmeplyar тип, т.е. в нашия случай може да бъде заместен в структурата и вида на sizeof (ако спря използване typedef) и структурата на самия променливата като: sizeof params_struct или sizeof PARAMS. Той ще премине през всички полета на структурата, определя дължината им и да даде сумата, която ще бъде дължината на конструкцията.

offsetof - реално макро която приема два параметъра (_s_ структура и полето _m_ там) и дава положението на тази област в рамките на структурата, неговото преместване по отношение на структурата. Изглежда този макрос е много проста:

Как става това?

Тук е необходимо да се отделям. Фактът, че аз считам най-простия случай, когато полетата са опаковани точно следват един след друг. Има и други методи за опаковане, които се наричат ​​"подреждане". Например, всяко поле може да бъде издаден "слот" е кратно на 4 байта или 8 байта. Тогава дори установката ще заемат 8 байта, а общият размер на структурата да расте, и компенсации ще се измести и да стане съставното подреждане. Това парче е полезно при програмирането на компютъра, тъй като се дължи на гранулиране на RAM е много по-бърз процесор е в състояние да изтеглите данни от паметта подравнени, тя се нуждае от по-малко операции.

Работа с масив от структури

Добре, сега ние сме в състояние да предоставят структура под формата на един байт масив, и обратно. Можете да получите точка? В момента сме на една и съща област на паметта има ролята на "структура" и "решетка". Промяна нещо в структурата - промяна масив, промяна на масива - се променя структурата.

В този - същността на процеса! Ние не разполагаме с отделен масив, тъй като самата структура - това е масив и ние просто се обръщат към паметта по различни начини. И ние не разполагат с никакви копиране преминава през нивите или байтове, този цикъл ще бъде веднъж на функцията за трансфер.

Сега можете да научите само комфортно с него цялата работа.

Съхранение и предаване на структура

трансфер на данни функции по мрежата обикновено изглеждат почти същото. Както подаване на данни Поколения назад, и като дължината на данни - sizeof Params.

Рецепция и възстановяване на структурата

Всички по същия начин. Моята функция на четенето масив от EEPROM: I2C_burst_read (I2Cx, HW_address, вр, n_data, * данни). n_data = sizeof Params, * = данни Поколения назад:

Не забравяйте, че вие ​​просто взети байта директно в структурата. Бавна и ненадеждни предаване има смисъл да се пишат данните на временен буфер, а след тях проверка да ги прехвърлят в структурата през

Чрез прилагането на тези методи, ние ще направим удобен синхронизация на двете структури, намиращи се на различни машини: клиентския микроконтролера може да бъде най-малко от другата страна на земното кълбо от сървъра, но структурата все още ще мине толкова лесно.

Склад / възстановяване на отделните полета

И защо сме толкова дълго време считано за макро offsetof? Това е много удобно да се използва за четене и писане на отделните полета на структурата, като например:

Е, като цяло, би било хубаво да се направи удобен за обвивки на макроси за тази цел.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!