Вопросы по С/С++ (СИ)
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3477438#p3477438"]<мечтательно>Ещё бы t прямо здесь объявить ...</мечтательно>
[/uquote]C++17 - мечты сбываются. Теперь переменную можно объявить не только в for, но и в if, и switch.
Re: Вопросы по С/С++ (СИ)
[uquote="VladislavS",url="/forum/viewtopic.php?p=3477441#p3477441"]C++17 - мечты сбываются. Теперь переменную можно объявить не только в for, но и в if, и switch.[/uquote]
Ну не знаю как ++17 - но переменные в условии if объявляю уже достаточно давно - в Скотт Мейер-овской книжке подсмотрел.
Ну не знаю как ++17 - но переменные в условии if объявляю уже достаточно давно - в Скотт Мейер-овской книжке подсмотрел.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! 
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Вот прямо так?
Код: Выделить всё
if(uint32_t x=10; A<B) { ... } else { ... } Re: Вопросы по С/С++ (СИ)
VladislavS, можно пример где реально есть подобная необходимость?
Re: Вопросы по С/С++ (СИ)
[uquote="VladislavS",url="/forum/viewtopic.php?p=3477668#p3477668"]Вот прямо так?[/uquote]
Не, типа так:
Работает как в gcc для renesas, так и в десятилетней свежести MSVS.
Не, типа так:
Код: Выделить всё
if (volatile st_port0* p = guessPort()) {
p->PMR |= 0x01;
}
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! 
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[uquote="Мурик",url="/forum/viewtopic.php?p=3477827#p3477827"]VladislavS, можно пример где реально есть подобная необходимость?[/uquote]А почему ты мне этот вопрос задаёшь? Представляешь себе хоть немного процесс принятия изменений в язык? Я лишь констатировал факт, что мечты сбываются. А если по существу, то ограничение области видимости переменной уменьшает количество ошибок и упрощает работу оптимизирующего компилятора.
[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3477845#p3477845"]Не, типа так:[/uquote]Это совсем не то и есть воплощение зла в чистом виде. Борьба с ним как раз ещё одно "зачем оно нужно".
[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3477845#p3477845"]Не, типа так:[/uquote]Это совсем не то и есть воплощение зла в чистом виде. Борьба с ним как раз ещё одно "зачем оно нужно".
Re: Вопросы по С/С++ (СИ)
Можно ведь написать так и получить тот же результат.VladislavS писал(а):А если по существу, то ограничение области видимости переменной уменьшает количество ошибок и упрощает работу оптимизирующего компилятора.
Код: Выделить всё
{
uint32_t x=10;
if(A<B) { ... } else { ... }
}- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[uquote="Мурик",url="/forum/viewtopic.php?p=3478099#p3478099"]Можно ведь написать так и получить тот же результат.[/uquote]Было бы странно, если бы почти через 40 лет после создания языка чего-то нельзя было сделать его оператором if, не правда ли? Вы ретроград, батенька! Смиритесь, это теперь стандарт языка. Всё больше и больше вы это будете встречать в чужом коде. Это, кстати, мелкое нововведение, есть куда более интересные и полезные. Предлагаю не опоздать, вскочить на подножку уходящего поезда и пользоваться плодами прогресса.
Re: Вопросы по С/С++ (СИ)
Есть еще вопрос по экспорту-импорту. Только теперь С++нутый. Контекст ардуина.
Хочу вебовские функции унести в другой файл, и вот заковыка. Есть нечтоИ мне надо в главном цикле вызывать Вот как этот фокус провернуть? или не заморачиваться, а сделать обёртку и её экспортировать? В плюсах я совсем ничего не понимаю.
Хочу вебовские функции унести в другой файл, и вот заковыка. Есть нечто
Код: Выделить всё
ESP8266WebServer server(80);Код: Выделить всё
server.handleClient();А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
uldemir, есть волшебное слово extern, которое говорит компилятору, что объект находится где-то в другом месте и его поиском займётся линкер.
и делай с ним что хошь.
Код: Выделить всё
extern ESP8266WebServer server; Re: Вопросы по С/С++ (СИ)
я пытался сделать extern, ардуина вывалила ошибки. иначе, я бы сюда не писал...
а, я писал server(80), а не server. хорошо, попробую так.
а, я писал server(80), а не server. хорошо, попробую так.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Что-нибудь про раздельную компиляцию, заголовочные файлы слышали?
[uquote="uldemir",url="/forum/viewtopic.php?p=3478282#p3478282"]а, я писал server(80), а не server. хорошо, попробую так.[/uquote]*Рука-лицо* При создании объекта класса передаёте параметр в конструктор server(80); , а при объявлении внешнего объекта нет - просто server;
[uquote="uldemir",url="/forum/viewtopic.php?p=3478282#p3478282"]а, я писал server(80), а не server. хорошо, попробую так.[/uquote]*Рука-лицо* При создании объекта класса передаёте параметр в конструктор server(80); , а при объявлении внешнего объекта нет - просто server;
Re: Вопросы по С/С++ (СИ)
[uquote="VladislavS",url="/forum/viewtopic.php?p=3477668#p3477668"]Вот прямо так?
[/uquote]
Это называется "мелочь, а приятно".)
Код: Выделить всё
if(uint32_t x=10; A<B) { ... } else { ... } Это называется "мелочь, а приятно".)
Re: Вопросы по С/С++ (СИ)
[uquote="OKF",url="/forum/viewtopic.php?p=3480394#p3480394"]
Это называется "мелочь, а приятно".)[/uquote]
... хотя и несколько шизофренично, принимая во внимание видимость как в основном так и в альтернативном блоках. Впрочем, если она сможет быть static ....
Код: Выделить всё
if(uint32_t x=10; A<B) { ... } else { ... } ... хотя и несколько шизофренично, принимая во внимание видимость как в основном так и в альтернативном блоках. Впрочем, если она сможет быть static ....
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! 
Re: Вопросы по С/С++ (СИ)
В одной ситуации оператор "запятая" показался мне весьма удобным. Объясняю схематично. Есть устройство, которое в чувство можно привести следующим образом: посылаем ему команду RESET через одноименную функцию, ждем определенное время, затем посылаем INIT тем же способом, опять ждем и если все прошло хорошо, устройство готово принять команду.
Код можно написать так:
На самом деле, вложенных if-ов у меня получалось больше, но даже тут глубина их начинает резать глаз. Какое решение пришло в голову в конце-концов:
В чем трюк с запятой -- функция delay(x) не возвращает ничего и использовать ее в цепочке логических проверок напрямую нельзя. Зато можно обернуть в скобки и через запятую "вернуть" любое нужное значение: (delay(100), 1) становится вполне себе функцией, всегда возвращающей 1.
Код можно написать так:
Код: Выделить всё
#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
}
}
}
}
Код: Выделить всё
int main(void) {
if (reset() && (delay(100), 1) && init() && (delay(100), 1) && run_cmd(MOVE_FORWARD)) {
// do smth
}
}
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Кто вам гарантировал последовательность выполнения функций это раз? Делэй не возвращает результата, так что и выполнять его не надо это два.
Re: Вопросы по С/С++ (СИ)
&& гарантировал. у него слева направо операнды вычисляются. точно так же, как и у оператора "запятая". так что все будет работать by design. при желании можно даже ветвления в строчку записывать.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Не будет. Задержку оптимизатор выкинет, так как от неё не зависит истинность выражения.
Re: Вопросы по С/С++ (СИ)
Оптимизатор может выкинуть функцию лишь если она ничего не делает.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Она ничего влияющего на вычисление значение выражения в операторе if не делает.