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

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

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

Сообщение VladislavS »

[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3477438#p3477438"]<мечтательно>Ещё бы t прямо здесь объявить ...</мечтательно> :D[/uquote]C++17 - мечты сбываются. Теперь переменную можно объявить не только в for, но и в if, и switch.
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3477441#p3477441"]C++17 - мечты сбываются. Теперь переменную можно объявить не только в for, но и в if, и switch.[/uquote]
Ну не знаю как ++17 - но переменные в условии if объявляю уже достаточно давно - в Скотт Мейер-овской книжке подсмотрел. ;)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Вот прямо так?

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

if(uint32_t x=10; A<B) { ... } else { ... } 
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

VladislavS, можно пример где реально есть подобная необходимость?
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

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

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

if (volatile st_port0* p = guessPort()) {
   p->PMR |= 0x01;
}
Работает как в gcc для renesas, так и в десятилетней свежести MSVS.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Мурик",url="/forum/viewtopic.php?p=3477827#p3477827"]VladislavS, можно пример где реально есть подобная необходимость?[/uquote]А почему ты мне этот вопрос задаёшь? Представляешь себе хоть немного процесс принятия изменений в язык? Я лишь констатировал факт, что мечты сбываются. А если по существу, то ограничение области видимости переменной уменьшает количество ошибок и упрощает работу оптимизирующего компилятора.

[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3477845#p3477845"]Не, типа так:[/uquote]Это совсем не то и есть воплощение зла в чистом виде. Борьба с ним как раз ещё одно "зачем оно нужно".
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

VladislavS писал(а):А если по существу, то ограничение области видимости переменной уменьшает количество ошибок и упрощает работу оптимизирующего компилятора.
Можно ведь написать так и получить тот же результат.

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

{
  uint32_t x=10; 
  if(A<B) { ... } else { ... }
}
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Мурик",url="/forum/viewtopic.php?p=3478099#p3478099"]Можно ведь написать так и получить тот же результат.[/uquote]Было бы странно, если бы почти через 40 лет после создания языка чего-то нельзя было сделать его оператором if, не правда ли? Вы ретроград, батенька! Смиритесь, это теперь стандарт языка. Всё больше и больше вы это будете встречать в чужом коде. Это, кстати, мелкое нововведение, есть куда более интересные и полезные. Предлагаю не опоздать, вскочить на подножку уходящего поезда и пользоваться плодами прогресса.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

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

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

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

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

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

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

Сообщение VladislavS »

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

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

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

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

Сообщение uldemir »

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

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

Сообщение VladislavS »

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

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

Сообщение OKF »

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

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

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

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

Сообщение 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! ;-)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение 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.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

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

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

Сообщение a5021 »

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

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

Сообщение VladislavS »

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

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

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

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

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

Сообщение VladislavS »

Она ничего влияющего на вычисление значение выражения в операторе if не делает.
Ответить

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