Форум программистов, компьютерный форум CyberForum.ru

Прокомментировать код функций, генерирующих другие функции (лямбды) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Написать программу для поиска и замены (поиск-вставка) http://www.cyberforum.ru/cpp-beginners/thread1632393.html
Доброго! Имеется код на ST (*259384*) HV_259384:= SEL(STATE_NET_RES2_M, IN_RES2_DINT1, 0); (*259398*) UNPACK16_1(HV_259384); Требуется его изменить следующим образом: (*259384*) HV_259384:= SEL(STATE_NET_RES2_M, IN_RES2_DINT1, 0); (*259398*) UNPACK16_1(SEL(STATE_NET_RES2_M, IN_RES2_DINT1, 0)); т.е. вставлять в текст ниже вместо значения HV_ХХХХХХ значение присвоения.
C++ Упражнение по программированию (Стивен Прата, глава 2, упражнение 3) 2 Глава, вопрос 3. Напишите программу на С++, которая использует три определяемых пользователем функции (включая main()) и генерирует следующий вывод: Three blind mice Three blind mice See how they run See how they run Одна функция вызываемая два раза, должна генерировать первые две строки, а другая также вызываемая два раза - оставшиеся строки. Не понимаю как это... http://www.cyberforum.ru/cpp-beginners/thread1632391.html
Целые числа в локальном отладчике C++
#include <stdio.h> #include "stdafx.h" #include <conio.h> #include <iostream> #include <iomanip> using namespace::std; /* печать таблицы температур по Фаренгейту и Цельсию для fahr = 0, 20 ... 300; вариант с плавающей точкой */ int main() { float fahr,celsius;
C++ Инкрементирование элементов массива-счётчика
Здравствуйте. К примеру, есть массив: const int stablePay = 200; // dollars const double rate = 0.09; // 9 % const int totalPaySize = 20; double totalPay;
C++ Не могу удалить динамический массив http://www.cyberforum.ru/cpp-beginners/thread1632360.html
В общем, выдает критическую ошибку: HEAP CORRUPTION DETECTED: after Normal block (#140) at 0x004452BF0. CRT detected that the application wrote to memory after end of heap buffer. когда собираюсь удалить из памяти динамический массив. без delete все работает. в чем проблема? void fillArray(int *pArray, int size); void showArray(int *pArray, int size); void freeArray(int *pArray); void...
C++ Запись в файл слов, которые не повторяются Добрый вечер, помогите с кодом. Как сделать чтобы считать с файла слова в односвязный список, сделать сортировку, и записать в другой файл слова кроме тех которые повторяются. Вот мой код: void List::readFromFile(char *FileWay) { FILE *file; int j = 0; file = fopen(FileWay,"r"); if (file == NULL) { cout << "Error" << endl; return; } подробнее

Показать сообщение отдельно
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
05.01.2016, 22:01
kquick, С Новым Годом Вас!
Проблемы с первым вариантом связаны с тем, что Вы захватываете в лямде по ссылке значение переменной n, область видимости которой ограничена самой функцией gen_fun. Таким образом после того как Вы возвращаете функцию из gen_fun - один из захваченных по ссылке объектов перестает существовать. Это приводит к тому, что память, выделенная под данный объект может быть использована под другие объекты. Данная проблема эквивалентна попытке возврата ссылки на объект локальный для функции.
Данная ситуация приводит к неопределенному поведению. Т.е. программа в этом случае может делать всё, что угодно. Например, вести себя "якобы" правильно, и делать то что Вы ожидаете:
http://ideone.com/Ga0sbZ
А может и нет:
https://coderpad.io/XW22R4RH

на случай, если кто-то удалит код программы, там получается вывод :
9:47pm - Melg running 13 lines of C++
5
0
0
Согласитесь, один и тот же текст программы, дающий разное поведение из-за компиляции двумя разными компиляторами, поддерживающими один и тот же стандарт (или с разными флагами) - не лучшая ситуация.

Пример 2 не так проблематичен. В данном случае вы просто вводите статическую переменную, значение которой будет инициализировано при первом вызове. Проблема данного кода состоит в том, что полученная из gen_clo функция будет иметь скрытую зависимость от глобального состояния. Таким образом тривиальная проверка:
std::function<int()> f = gen_clo();
assert(f(), f()); будет проваливаться.
Кроме того данный код не является потоко-безопасным.
Насколько мне известно, в программировании имеется стремление к написанию кода, в котором любые зависимости между частями программы выражены в явной форме. Это позволяет проще думать о таком коде, проще его отлаживать и тестировать.

Резюмируя:
В общем случае - Пример 1 - вызывает неопределенное поведение так делать не следует.
Пример 2 - доступ к глобальному состоянию, влияющий на результат выполнения функции, а тем более в скрытой форме не желателен, так делать не следует.

Добавлено через 1 минуту
Зы. Я отвечал на первую постановку вопроса:
Корректно ли делать это в C++ так, как показано ниже? Какие могут быть проблемы?
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru