реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> инициализировать структуру в ф-ии
Метценгерштейн
сообщение Oct 22 2016, 07:38
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



есть структура
Код
    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
  };


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

Так то вынес, но саму переменную структуры не видит другая ф-я.
Go to the top of the page
 
+Quote Post
SlavaV
сообщение Oct 22 2016, 07:52
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 13-06-06
Из: г.Улан-Удэ
Пользователь №: 18 024



передавайте по ссылке в другую функцию

например:
void Init(PWMConfig & pwmcfg)
{
....
}
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Oct 22 2016, 08:20
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



так не пойдет.

Нужно из некой ф-ии вызывать ф-ю, где будет происходить заполнение структуры. Дальше эта структура будет или глобально видна, или возвращать туда, от куда ее вызвали переменную типа структура.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Oct 22 2016, 08:30
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Метценгерштейн @ Oct 22 2016, 10:38) *
есть структура
. . .
Так то вынес, но саму переменную структуры не видит другая ф-я.


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

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

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

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

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

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

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

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





Go to the top of the page
 
+Quote Post
SlavaV
сообщение Oct 22 2016, 08:35
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 13-06-06
Из: г.Улан-Удэ
Пользователь №: 18 024



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

Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Oct 22 2016, 09:05
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



пробую варианты. Может проще некоторые поля переинициализировать по ходу.
Go to the top of the page
 
+Quote Post
Lagman
сообщение Oct 22 2016, 09:39
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Цитата(Метценгерштейн @ 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;
Go to the top of the page
 
+Quote Post
k155la3
сообщение Oct 22 2016, 09:43
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Метценгерштейн @ Oct 22 2016, 12:05) *
пробую варианты. Может проще некоторые поля переинициализировать по ходу.

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


Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Oct 22 2016, 09:59
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



спасибо.
Смысл выкладывать проект? Это 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;


Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Oct 22 2016, 11:01
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Код
pwmcfg.channels[0].mode = PWM_OUTPUT_ACTIVE_HIGH;
  pwmcfg.channels[0].callback = NULL;


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

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

А нельзя как-то сразу инициализировать массив 0-
{PWM_OUTPUT_ACTIVE_HIGH, NULL}
Только каждое поле? В две строки?
Go to the top of the page
 
+Quote Post
k155la3
сообщение Oct 22 2016, 11:21
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Метценгерштейн @ 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;
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Oct 22 2016, 15:00
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



а зачем обнулять поля структуры?
Нельзя ли при объявлении структуры сразу ее инициализировать вне ф-ий, а уже непосредственно из некой ф-ии заменить только два поля?
Go to the top of the page
 
+Quote Post
Lagman
сообщение Oct 23 2016, 09:51
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



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

можно sm.gif
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Oct 24 2016, 07:49
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



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

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

то что хочется?
Go to the top of the page
 
+Quote Post
psL
сообщение Oct 24 2016, 21:09
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



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


Код
PWMConfig pwmcfg = {...
  .channels = {
     [0]{ .mode = PWM_OUTPUT_ACTIVE_HIGH, .callback = NULL},
     [1]{ .mode = PWM_OUTPUT_ACTIVE_HIGH, .callback = NULL},
     ...
  },
};
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 8th July 2025 - 16:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01544 секунд с 7
ELECTRONIX ©2004-2016