Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 7383
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Есть еще вопрос по экспорту-импорту. Только теперь С++нутый. Контекст ардуина.
Хочу вебовские функции унести в другой файл, и вот заковыка. Есть нечто

Код: Выделить всё

ESP8266WebServer server(80);
И мне надо в главном цикле вызывать

Код: Выделить всё

server.handleClient();
Вот как этот фокус провернуть? или не заморачиваться, а сделать обёртку и её экспортировать? В плюсах я совсем ничего не понимаю.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

uldemir, есть волшебное слово extern, которое говорит компилятору, что объект находится где-то в другом месте и его поиском займётся линкер.

Код: Выделить всё

extern  ESP8266WebServer server; 
и делай с ним что хошь.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7383
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

я пытался сделать extern, ардуина вывалила ошибки. иначе, я бы сюда не писал...
а, я писал server(80), а не server. хорошо, попробую так.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Что-нибудь про раздельную компиляцию, заголовочные файлы слышали?
[uquote="uldemir",url="/forum/viewtopic.php?p=3478282#p3478282"]а, я писал server(80), а не server. хорошо, попробую так.[/uquote]*Рука-лицо* При создании объекта класса передаёте параметр в конструктор server(80); , а при объявлении внешнего объекта нет - просто server;
Реклама
Эиком - электронные компоненты и радиодетали
OKF
Это не хвост, это антенна
Сообщения: 1456
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3477668#p3477668"]Вот прямо так?

Код: Выделить всё

if(uint32_t x=10; A<B) { ... } else { ... } 
[/uquote]
Это называется "мелочь, а приятно".)
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="OKF",url="/forum/viewtopic.php?p=3480394#p3480394"]

Код: Выделить всё

if(uint32_t x=10; A<B) { ... } else { ... } 
Это называется "мелочь, а приятно".)[/uquote]
... хотя и несколько шизофренично, принимая во внимание видимость как в основном так и в альтернативном блоках. Впрочем, если она сможет быть static .... :D
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

В одной ситуации оператор "запятая" показался мне весьма удобным. Объясняю схематично. Есть устройство, которое в чувство можно привести следующим образом: посылаем ему команду RESET через одноименную функцию, ждем определенное время, затем посылаем INIT тем же способом, опять ждем и если все прошло хорошо, устройство готово принять команду.

Код можно написать так:

Код: Выделить всё


#define MOVE_FORWARD  0x10
#define MOVE_BACKWARD 0x20

int reset(void) {
  //
  return 1;
}

int init(void) {
  //
  return 1;
}

int run_cmd(int cmd) {
  //
  return 1;
}

int main(void) {

  if (reset()) {
    delay(100);
    if (init()) {
      delay(100);
      if (run_cmd(MOVE_FORWARD)) {
        // do smth
      }
    }
  }
}

На самом деле, вложенных if-ов у меня получалось больше, но даже тут глубина их начинает резать глаз. Какое решение пришло в голову в конце-концов:

Код: Выделить всё

int main(void) {

  if (reset() && (delay(100), 1) && init() && (delay(100), 1) && run_cmd(MOVE_FORWARD)) {
        // do smth
  }
}

В чем трюк с запятой -- функция delay(x) не возвращает ничего и использовать ее в цепочке логических проверок напрямую нельзя. Зато можно обернуть в скобки и через запятую "вернуть" любое нужное значение: (delay(100), 1) становится вполне себе функцией, всегда возвращающей 1.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Кто вам гарантировал последовательность выполнения функций это раз? Делэй не возвращает результата, так что и выполнять его не надо это два.
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

&& гарантировал. у него слева направо операнды вычисляются. точно так же, как и у оператора "запятая". так что все будет работать by design. при желании можно даже ветвления в строчку записывать.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Не будет. Задержку оптимизатор выкинет, так как от неё не зависит истинность выражения.
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Оптимизатор может выкинуть функцию лишь если она ничего не делает.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Она ничего влияющего на вычисление значение выражения в операторе if не делает.
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Как насчет проверить?
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

VladislavS, тогда объясните почему светодиод мигает несколько раз в секунду?

Код: Выделить всё

#include "stm32f10x_conf.h"

uint8_t Delay(volatile uint32_t nCount)
{
    for (; nCount != 0; nCount--);
}

int main(void)
{
    GPIO_InitTypeDef Init;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    Init.GPIO_Pin = GPIO_Pin_13;
    Init.GPIO_Mode = GPIO_Mode_Out_PP;
    Init.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOC, &Init);

    while(1)
    {
        if (((GPIOC->ODR ^= GPIO_Pin_13)!=1) && Delay(1000000));
    }
}
Оптимизация O2 + LTO.
Вложения
Blink.7z
(167.83 КБ) 282 скачивания
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3483338#p3483338"]Она ничего влияющего на вычисление значение выражения в операторе if не делает.[/uquote]
Да, на вычисление if не влияет, но чтобы выкинуть у компилятора должно быть более веское основание. Тот кто кодил delay() должен был позаботиться, чтобы компилятор не выкидывал ее (а она кроме, сообственно, задержки ничего полезного не делает). А если такое основание у него (компилятора) будет, то выкинет ее (функцию delay ()), даже если Вы эту функцию за if вынесете. :-)
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="viiv",url="/forum/viewtopic.php?p=3483408#p3483408"]даже если Вы эту функцию за if вынесете. :-)[/uquote]Да, если она ничего не делает - выкинет.


Мурик, volatile то вставил, знаешь что иначе оптимизатор почикает всё.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

[uquote="a5021",url="/forum/viewtopic.php?p=3483188#p3483188"]На самом деле, вложенных if-ов у меня получалось больше, но даже тут глубина их начинает резать глаз. Какое решение пришло в голову в конце-концов:

Код: Выделить всё

int main(void) {

  if (reset() && (delay(100), 1) && init() && (delay(100), 1) && run_cmd(MOVE_FORWARD)) {
        // do smth
  }
}

[/uquote]Какое то нестандартное решение.
Не проще было сделать ф-ию delay возвращаемой true и не городить такой огород со скобками и запятыми ?
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

VladislavS писал(а):volatile то вставил, знаешь что иначе оптимизатор почикает всё.
Это здесь причем? Без volatile оптимизатор "наведет порядок" и когда функция не в if. Хотя бывают исключения.
Речь о том что из if функция delay() не выбрасывается.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18791
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3483424#p3483424"]Да, если она ничего не делает - выкинет.[/uquote]
Теоретик из вас, походу, никудышный.

Код: Выделить всё

  
void custom_delay(unsigned int delay) {
  while(--delay) __NOP();
}

//...

while (1)  {
   if ((GPIOA->BSRR = GPIO_BSRR_BS_0, 1) && (custom_delay(0x01FFFFFF), 1) && (GPIOA->BSRR = GPIO_BSRR_BR_0, 1) && (custom_delay(0x01FFFFFF), 1));
}
IAR 8, оптимизация HIGH/SIZE:

Код: Выделить всё

   \       0x72   0x....             LDR      R6,??DataTable2_3  ;; 0x1ffffff
    101            while (1)  {
    102               if ((GPIOA->BSRR = GPIO_BSRR_BS_0, 1) && (custom_delay(0x01FFFFFF), 1) && (GPIOA->BSRR = GPIO_BSRR_BR_0, 1) && (custom_delay(0x01FFFFFF), 1));
   \                     ??main_0: (+1)
   \       0x74   0x61AC             STR      R4,[R5, #+24]
   \       0x76   0x0030             MOVS     R0,R6
   \       0x78   0x.... 0x....      BL       custom_delay
   \       0x7C   0x0420             LSLS     R0,R4,#+16
   \       0x7E   0x61A8             STR      R0,[R5, #+24]
   \       0x80   0x0030             MOVS     R0,R6
   \       0x82   0x.... 0x....      BL       custom_delay
   \       0x86   0xE7F5             B        ??main_0
Весь код ответственный за блинк на месте. Это не смотря на то, что у if-а тела нет вовсе.

[uquote="Аlex",url="/forum/viewtopic.php?p=3483427#p3483427"]Не проще было сделать ф-ию delay возвращаемой true и не городить такой огород со скобками и запятыми ?[/uquote]
И что это даст кроме ощущения преемственности поколений?

[uquote="ARV",url="/forum/viewtopic.php?p=3483447#p3483447"]как мною и ожидалось, очередной пример того, как запятая помогает выстрелить в ногу.[/uquote]
Фиг с ней с ногой. Голову берегите.
Последний раз редактировалось a5021 Вт окт 16, 2018 20:00:40, всего редактировалось 1 раз.
Ответить

Вернуться в «Разные вопросы по МК»