Массив структуры: члены структуры являются переменными Enum - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь понять код, который является частью руководства по разработке многоразовых прошивок.Книга слишком сложна для меня, но все же я пытаюсь понять код.

В примере кода, поставляемом с книгой, есть синтаксис, подобный приведенному ниже

typedef enum 
{

   DIO_MAX_MODE 
}DioMode_t;


typedef enum 
{
   DIO_PULLUP_DISABLED,     /*< Used to disable the internal pull-ups */
   DIO_PULLUP_ENABLED,      /*< Used to enable the internal pull-ups */
   DIO_MAX_RESISTOR         /*< Resistor states should be below this value */
}DioResistor_t;

typedef enum
{
    DIO_OUTPUT,
    DIO_INPUT
}DioDirection_t;



typedef struct 
{
    DioResistor_t Resistor;              /**< Pullup/Pulldown Resistor - ENABLED or DISABLED    */
    DioDirection_t Direction;      /**< Data Direction      - OUTPUT or INPUT           */
    DioMode_t Function;            /**< Mux Function        - Dio_Peri_Select           */
}DioConfig_t;

Если я правильно понимаю, члены структуры являются переменными enum.

И в одной части кода разработчик присваивает ему значение ниже (не точно, я пытаюсь понять, как все это работает,создавая похожий синтаксис)

 DioConfig_t config[] = {    {1, 2, 3}, 
                                {4, 5, 6}
 };

Что здесь происходит?Возможно ли это?

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

Редактировать:

Если я создаю структуру, подобную этой

#include <stdio.h>

struct test {
    int a;
    int b;
};

int main()
{
    struct test var[] = { {1, 2}, {3, 4} }; 

    /* 
    struct test var[0] = {1, 2}
    struct test var[1] = {3, 4}
    */

    printf("%d %d\n", var[0].a, var[1].a);

    return 0;

Я знаю, какие значения присваиваются a и b в зависимости от того, какую переменную структуры я использую для их вызова, например: var [0] .a = 1 и var 1 .a = 3

Но код, который я показал сначала, содержит enum переменных в качестве членов структуры. Значения, присвоенные элементам структуры, равны

config[0].Resistor = 1
config[0].Direction = 2
config[0].Function = 3

Поскольку это enum переменные, изменится ли оно enum значений, как ???

PS: Прошло всего несколько месяцев с тех пор, как я начал изучать C. Я использую его для разработкиНебольшие встроенные проекты, я прочитал несколько онлайн-уроков и видео, узнал о структуре и указателях, но когда я открыл этот
код , для меня это не имело особого смысла.Это нормально ??

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

По сути, enum - это еще один метод определения целочисленных констант, поэтому переменная enum должна занимать ту же память, что и целочисленная переменная, поэтому в основном она может содержать любое целочисленное значение. В вашем случае переменная enum типа DioResistor_t можетсодержат значения, отличные от 0 (DIO_PULLUP_DISABLED), 1 (DIO_PULLUP_ENABLED) и 2 (DIO_MAX_RESISTOR).Таким образом, инициализация других значений для элемента структуры enum - это нормально (но это может привести к неверному выводу).

Теперь мы обсудим причину определения элементов структуры как enum.Для этого рассмотрим 2 сценария, приведенные ниже.

Случай 1: Структура DioConfig_t определяется следующим образом:

typedef struct
{
    unsigned int Resistor;
    unsigned int Direction;
    unsigned int Function;
}DioConfig_t;

Случай 2: структура DioConfig_t определяется как заданнаяв вашем коде.

Теперь, если разработчик хочет настроить вывод в качестве выходного вывода с тяговым резистором и в максимальном режиме.

В первом случае ему нужно найти значения для резистора,Направляющие и функциональные переменные структуры конфигурации DioConfig_t, которые будут настраивать вывод так, как ему требуется, но во втором случае он может легко настроить его, так как все необходимые значения переменных определены в enum.

Конфигурация в2 приведенных выше случая приведены ниже:

Случай 1:

    Dio_Config_t dio_configuration;
    dio_configuration.Resistor = 1;
    dio_configuration.Direction = 0;
    dio_configuration.Function = 0;

Случай 2:

    Dio_Config_t dio_configuration;
    dio_configuration.Resistor = DIO_PULLUP_ENABLED;
    dio_configuration.Direction = DIO_OUTPUT;
    dio_configuration.Function = DIO_MAX_MODE;

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

0 голосов
/ 26 сентября 2018

enum является частным случаем целочисленного типа.В C допустимо присваивать значения переменной enum, выходящей за пределы этого диапазона.

Присвоение значения вне диапазона переменной enum также не оказывает влияния на enumконстанты, которые были определены.Также обратите внимание, что тот факт, что рассматриваемая переменная является членом структуры, ничего не меняет.

Например:

#include <stdio.h>

typedef enum f {
    F1,
    F2,
    F3
} f;

int main()
{
    f x = 4;
    printf("F1=%d\n", F1);
    printf("F2=%d\n", F2);
    printf("F3=%d\n", F3);
    printf("x=%d\n", x);
    return 0;
}

Вывод:

F1=0
F2=1
F3=2
x=4

В этом примере значение 4 присваивается переменной типа f, хотя значения связанных enum равны 0, 1 и 2.

0 голосов
/ 26 сентября 2018

Что здесь происходит?Возможно ли это?

Внутренние скобки ({1, 2, 3} и {4, 5, 6}) инициализируют DioConfig_t каждая.Внешние скобки инициализируют массив config[] двумя DioConfig_t, определенными внутренними скобками.Это эквивалентно этому:

DioConfig_t a = {1, 2, 3};
DioConfig_t b = {4, 5, 6};
DioConfig_t config[] = {a, b};

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

Примечание: я не уверен, что моя терминология на 100% правильная, и когда я говорю «они эквивалентны», я не считаю, чтопроизводительность может отличаться в зависимости от уровня оптимизации компилятора.

Для меня это не имело особого смысла.Это нормально?

Вы спрашиваете, нормально ли быть запутанным каким-то кодом C?Абсолютно.В языке много хитростей, подводных камней и непонятных вещей, даже люди, которые работали с ним годами, учатся чему-то новому и смущаются / сбиваются с толку каким-то хитрым C-кодом.Не позволяйте этому обескураживать вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...