Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: инициализировать структуру в ф-ии
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Метценгерштейн
есть структура
Код
    PWMConfig pwmcfg = { /// структура насройки ШИМ
    10000,                                    /* 10kHz PWM clock frequency.   */
    100,                                    /* Initial PWM period 1S.       */
    NULL,
    {
     {PWM_OUTPUT_ACTIVE_HIGH, NULL},
     {PWM_OUTPUT_DISABLED, NULL},
     {PWM_OUTPUT_DISABLED, NULL},
     {PWM_OUTPUT_DISABLED, NULL}
    },
    0,
    0,
  #if STM32_PWM_USE_ADVANCED
    0
  #endif
  };


но значения полей могут быть разные.
Как можно вынести инициализацию в отд. ф-ю и с определенными параметрами полей инициализировать ее?

Так то вынес, но саму переменную структуры не видит другая ф-я.
SlavaV
передавайте по ссылке в другую функцию

например:
void Init(PWMConfig & pwmcfg)
{
....
}
Метценгерштейн
так не пойдет.

Нужно из некой ф-ии вызывать ф-ю, где будет происходить заполнение структуры. Дальше эта структура будет или глобально видна, или возвращать туда, от куда ее вызвали переменную типа структура.
k155la3
Цитата(Метценгерштейн @ Oct 22 2016, 10:38) *
есть структура
. . .
Так то вынес, но саму переменную структуры не видит другая ф-я.


Если она в глобальных - то как ОНО может "не видеть" - если в .h указано для вызывающих модулей-ф-ий
что ОНО "extern" ?

1. Запихните все в класс. Там будет и сама структура (тотже класс без функций обработки), и
всевозможные варианты реализации (видимость обеспечится "автоматически")

2. Если класс не подходит.
В модуле, где объявлена структура, реализуйте ф-ию, которая возвращает указатель на Вашу структуру.

PWMConfig * MDL1_GetPtrPWM_Struct(void) { return( &pwmcfg ); };

В вызывающих модулях эта ф-ия должна быть объявлена как extern

Использовать:

MDL1_GetPtrPWM_Struct()->field1 = .....

или любым другим способом.





SlavaV
Тогда я не понял в чем проблема, особенно это: "или возвращать туда, от куда ее вызвали переменную типа структура."

Метценгерштейн
пробую варианты. Может проще некоторые поля переинициализировать по ходу.
Lagman
Цитата(Метценгерштейн @ Oct 22 2016, 10:38) *
есть структура
Код
    PWMConfig pwmcfg = { /// структура насройки ШИМ
    10000,                                    /* 10kHz PWM clock frequency.   */
    100,                                    /* Initial PWM period 1S.       */
    NULL,
    {
     {PWM_OUTPUT_ACTIVE_HIGH, NULL},
     {PWM_OUTPUT_DISABLED, NULL},
     {PWM_OUTPUT_DISABLED, NULL},
     {PWM_OUTPUT_DISABLED, NULL}
    },
    0,
    0,
  #if STM32_PWM_USE_ADVANCED
    0
  #endif
  };


Тут идет объявление структуры и ее инициализация начальными значениями, чтобы изменить в любой функции поля структуры, как вам сказали, либо передаете указатель структуру, либо она у вас глобальна и доступна всем функциям.

Для изменения полей стуктуры, надо знать как она устроена, ищете где объявляется
typedef PWMConfig и смотрите поля, код будет типа такого:
Код
    pwmcfg.Pulse = 10000;
    pwmcfg.OCMode = 100;
    pwmcfg.OCPolarity = TIM_OCPOLARITY_HIGH;
    pwmcfg.OCNPolarity = TIM_OCNPOLARITY_HIGH;
    pwmcfg.OCIdleState = TIM_OCIDLESTATE_SET;
    pwmcfg.OCNIdleState= TIM_OCNIDLESTATE_RESET;
    pwmcfg.OCFastMode = TIM_OCFAST_DISABLE;
k155la3
Цитата(Метценгерштейн @ Oct 22 2016, 12:05) *
пробую варианты. Может проще некоторые поля переинициализировать по ходу.

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


Метценгерштейн
спасибо.
Смысл выкладывать проект? Это chibios. Пробую ШИМ.

нашел сам тип
Код
typedef struct {
  /**
   * @brief   Timer clock in Hz.
   * @note    The low level can use assertions in order to catch invalid
   *          frequency specifications.
   */
  uint32_t                  frequency;
  /**
   * @brief   PWM period in ticks.
   * @note    The low level can use assertions in order to catch invalid
   *          period specifications.
   */
  pwmcnt_t                  period;
  /**
   * @brief Periodic callback pointer.
   * @note  This callback is invoked on PWM counter reset. If set to
   *        @p NULL then the callback is disabled.
   */
  pwmcallback_t             callback;
  /**
   * @brief Channels configurations.
   */
  PWMChannelConfig          channels[PWM_CHANNELS];
  /* End of the mandatory fields.*/
} PWMConfig;


Метценгерштейн
Код
pwmcfg.channels[0].mode = PWM_OUTPUT_ACTIVE_HIGH;
  pwmcfg.channels[0].callback = NULL;


структура изначально глобальная и сразу инициализирована была.

В любой ф-ии можно поля переинициализировать так как привел.

А нельзя как-то сразу инициализировать массив 0-
{PWM_OUTPUT_ACTIVE_HIGH, NULL}
Только каждое поле? В две строки?
k155la3
Цитата(Метценгерштейн @ Oct 22 2016, 14:01) *
Код
pwmcfg.channels[0].mode = PWM_OUTPUT_ACTIVE_HIGH;
  pwmcfg.channels[0].callback = NULL;


структура изначально глобальная и сразу инициализирована была.

В любой ф-ии можно поля переинициализировать так как привел.

А нельзя как-то сразу инициализировать массив 0-
{PWM_OUTPUT_ACTIVE_HIGH, NULL}
Только каждое поле? В две строки?


memset( &pwmcfg, 0x00, sizeof(PWMConfig) ); - вся структура будет содержать 0x00.

далее - устанавливаем те поля, что надо.

pwmcfg.channels[0].mode = PWM_OUTPUT_ACTIVE_HIGH;
Метценгерштейн
а зачем обнулять поля структуры?
Нельзя ли при объявлении структуры сразу ее инициализировать вне ф-ий, а уже непосредственно из некой ф-ии заменить только два поля?
Lagman
Цитата(Метценгерштейн @ Oct 22 2016, 18:00) *
а зачем обнулять поля структуры?
Нельзя ли при объявлении структуры сразу ее инициализировать вне ф-ий, а уже непосредственно из некой ф-ии заменить только два поля?

можно sm.gif
Kabdim
Не уверен что праильно понял желание, но к примеру:
Код
PWMConfig pwmcfg = {...};

void InitPwmConfigType1(PWMConfig* pwmcfg)
{
   PWMConfig inner_pwm_cfg = {...};
   memcpy(pwmcfg, &inner_pwm_cfg, MIN(sizeof(*pwmcfg), sizeof(inner_pwm_cfg)));
}

то что хочется?
psL
Цитата(Метценгерштейн @ Oct 22 2016, 18:00) *
а зачем обнулять поля структуры?
Нельзя ли при объявлении структуры сразу ее инициализировать вне ф-ий, а уже непосредственно из некой ф-ии заменить только два поля?


Код
PWMConfig pwmcfg = {...
  .channels = {
     [0]{ .mode = PWM_OUTPUT_ACTIVE_HIGH, .callback = NULL},
     [1]{ .mode = PWM_OUTPUT_ACTIVE_HIGH, .callback = NULL},
     ...
  },
};
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.