- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
int function(void) {
static int i, state = 0;
switch (state) {
case 0: /* start of function */
for (i = 0; i < 10; i++) {
state = 1; /* so we will come back to "case 1" */
return i;
case 1:; /* resume control straight after the return */
}
}
}
Kornew 09.01.2011 00:08 # +2
"case 1" - не видим в данном контексте...
TarasB 09.01.2011 00:09 # +4
Видимо, при каких-то настройках в каком-то древнем стандарте такое можно было.
Sauron 11.01.2011 21:24 # −4
А вообще.
http://ru.wikipedia.org/wiki/%D0%A3%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1% 81%D1%82%D0%B2%D0%BE_%D0%94%D0%B0%D1%84% D1%84%D0%B0
xXx_totalwar 11.01.2011 21:39 # +2
Kornew 09.01.2011 00:11 # +4
mindfreakthemon 09.01.2011 00:13 # +5
i всегда определено. Если прыгаем внутрь цикла, то просто подходим к концу итерации.
TarasB 09.01.2011 00:15 # +4
Если state 0, то меняем на 1, иначе, если i меньше 10, увеличиваем i. Нахера выпендриваться?
mindfreakthemon 09.01.2011 00:19 # +4
Или надрезать шаблон, как вот первому комментатору.
Бессмысленно
Kornew 09.01.2011 00:22 # +4
- там, я так полагаю, функция рассчитана на циклическое использование или для перерисовок... - как вариант можно использовать для подсчёта количества перерисовок :)
тут нужно доработать:
теперь цикл внутри - работает =Ъ
mindfreakthemon 09.01.2011 00:47 # +4
тут — 14, void, void...
TarasB 09.01.2011 18:01 # +3
3.14159265 10.01.2011 11:13 # +1
guest 10.01.2011 11:45 # 0
bugmenot 10.01.2011 19:38 # +1
absolut 10.01.2011 19:13 # +1
Kornew 09.01.2011 00:25 # +5
-- как-то стрёмно, стало, что можно было прям в тело цикла запрыгнуть, и чтобы такое работало :(
и честно, - даже удивлён был, что ни слова не сказал компилер, что так делать не хорошо... О_о
guest 09.01.2011 13:03 # +7
Хотябы потомучто этот код не потоковобезопасный, тк использует общие для разных потоков static переменные (если, кончно, это не входило в планы разработчика).
К тому же после завершения цикла перестаёт возвращать из функции вообще какие либо значения. После завершения цикла просто возвращает случайный мусор.
mindfreakthemon 09.01.2011 13:10 # +3
Ну, тут я не сильно знаком с тем, что будет возвращаться функцией, если ничего не будет возвращаться в её теле. Предположил, что она возвращать будет что-то на подобии указателя с недотипом void
guest 09.01.2011 13:14 # +7
Какой-то неудачный пример.
mindfreakthemon 09.01.2011 13:15 # +4
ряд => поток
водитель => компилятор
guest 09.01.2011 13:19 # +6
mindfreakthemon 09.01.2011 13:21 # +3
Насколько я знаю, потоки порождаются процессами.
guest 09.01.2011 13:23 # +6
mindfreakthemon 09.01.2011 13:24 # +4
guest 09.01.2011 13:25 # +6
А то расскажите мне курс, запишите за меня в тетрадку, покажите видеокурс и запомните за меня...
guest 09.01.2011 13:21 # +6
Опасны столкновения между машинами.
static - это и есть то самое "столкновение" между потоками.
mindfreakthemon 09.01.2011 13:24 # +4
по разным рядам.
>Опасны столкновения между машинами.
Взаимоисключающие параграфы?
guest 09.01.2011 15:18 # +6
guest 09.01.2011 13:17 # +6
Функция вернёт случайный мусор, тот, что остался в регистре eax, если не использовать return.
В данном коде есть случаи, когда return не вызывается. Тогда мы получим мусор.
Что-бы стало лучше - нужно state=0 после цикла поставить и "goto" на начало функции.
guest 09.01.2011 15:15 # +6
Предложние не согласовано.
guest 09.01.2011 00:27 # +4
guest 09.01.2011 00:44 # +5
guest 09.01.2011 02:36 # +6
psina-from-ua 09.01.2011 01:31 # +4
guest 09.01.2011 01:55 # +6
Корутины (Coroutine) позволяют прерывать вычисления функции с возвратом значения (return) и продолжать с того же места, на котором остановились.
В C# для этого используется оператор yield.
Пожалуй, в данном говнокоде сделано не очень аккуратно, но смысл передаёт.
Интересно, существуют ли альтернативные реализации корутин на С++?
guest 09.01.2011 02:48 # +6
http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
guest 09.01.2011 13:06 # +5
guest 09.01.2011 16:48 # +6
TarasB 09.01.2011 17:00 # +4
guest 09.01.2011 17:08 # +6
gegMOPO4 31.01.2011 12:49 # 0
TarasB 31.01.2011 15:28 # 0
bugmenot 31.01.2011 15:31 # 0
3.14159265 09.01.2011 01:50 # +10
давно ничего подобного на гк не было - все окупировало пхп.
shm 09.01.2011 02:16 # +3
shm 09.01.2011 02:23 # +4
guest 09.01.2011 02:43 # +6
Это совершенно не так. Этот паттерн, с некоторой натяжкой, называется корутина и я выше это описал в http://govnokod.ru/5186#comment68330
>по стандарту языка такое работать не должно
Должно.
Это функция при каждом вызове вернёт следующее значение переменной i из цикла (и так от 0 до 9).
Тоесть Console::Write(function()) выведет на экран 0.
Следующий вызов Console::Write(function()) выведет на экран 1 и так до 9.
Дальше там в коде косяк, тк не возвращается зачение return'ом, но с варнингом скомпилируется и будет возвращать мусор.
shm 09.01.2011 16:55 # +4
guest 09.01.2011 17:10 # +6
В С++ при даной реализации она почти ничего не стоит.
shm 09.01.2011 17:13 # +4
guest 09.01.2011 17:21 # +6
Но всё же лучше этого не делать, а воспользоваться более подходящими для этого инструментами, чем Си.
shm 09.01.2011 17:31 # +4
Идею я теперь понял
> Но всё же лучше этого не делать
А я и не собирался
shm 09.01.2011 17:08 # +4
guest 09.01.2011 17:17 # +6
>понять не могу
>не могу понять
Просто загуглите про корутины или хотябы сходите по моей ссылке, в которых есть кривенькая рализация всё тех же корутин на чистом Си.
shm 09.01.2011 17:29 # +4
guest 09.01.2011 17:35 # +6
Ни кто с этим и не спорит. Автор расчитывает, что функция со свитча начинается.
>компилятор и оптимизирует данный код
Оптимизация тут не причём. Этот код - лишь эмуляция начала функции с return через свитч.
Если ссылку так и не нашли, то приведу снова, сходите:
http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
Только там про корутины из текущего говнокода написано ближе к середине.
shm 09.01.2011 17:39 # +4
Для говнокода - да.
> Если ссылку так и не нашли
Да я вас отлично понимаю, не надо думать, что я не знаю, что такое сопрограмма. Я вообще как бэ другое хотел сказать.
guest 09.01.2011 17:43 # +6
Я Вас послушаю. Что Вы хотели сказать?
shm 09.01.2011 17:44 # +4
guest 09.01.2011 17:48 # +6
Попробуйте повторить, возможно я не всё понял.
Мне показалось, что не всё внятно расписано, извиняюсь... :-[
shm 09.01.2011 17:59 # +4
> Я имею ввиду другое, а именно, что автор утверждает (как я уже сейчас понял), что управление будет передано после retrun, это не так (передано оно конечно будет туда, но не сразу), для этого достаточно вставить что-нибудь перед switch'ем
>>для этого достаточно вставить что-нибудь перед switch'ем
Ни кто с этим и не спорит. Автор расчитывает, что функция со свитча начинается.
Теперь понятно?
guest 09.01.2011 02:58 # +5
http://govnokod.ru/5153
TarasB 09.01.2011 18:10 # +4
guest 09.01.2011 20:02 # +5
koodeer 09.01.2011 08:18 # +5
Школоте для общего развития: http://ru.wikipedia.org/wiki/Устройство_Даффа
;)
bugmenot 09.01.2011 10:40 # +7
Как в мире С всё... эээ, демократично, хоть бы одна знаменитость имела профильное образование и после защиты устроилась работать с компьютерами...
ch 11.01.2011 17:24 # 0
bugmenot 11.01.2011 19:57 # 0
альфа-наложение, facepalm.sgi
вообще у него даже публикация есть, хотя непонятно чего там исследовать, что характерно, тогда работал на мамашу Белл, как и остальные
ch 12.01.2011 08:32 # 0
bugmenot 12.01.2011 08:46 # 0
guest 09.01.2011 12:58 # +7
http://govnokod.ru/5186#comment68340
Так, что думаю удивляются только единицы.
В любом случае даффдевайс, как и этот код - говно говном.
TarasB 09.01.2011 13:49 # +8
Его тоже надо сюда запостить. Бесполезная конструкция, которой зато можно троллить паскалистов (или сишников, смотря как её преподнести).
Govnoeb 09.01.2011 17:41 # +6
цппешники не ебут себе мозги
_func function;
while(1)
std::cout << function();
guest 09.01.2011 17:45 # +7
guest 09.01.2011 20:11 # +2
1)Для многопоточных приложений придётся просить (комметарием) создавать функциональный объект в стеке.
2)Будь код чуток сложнее, например:
- ваш код уже работать не будет. В оригинальном коде управление передаётся сразу к return при повторном входе в функцию.
Впрочем, для данного конкретного случая это намного лучше приведённого выше говнокода 5186. :)
Govnoeb 10.01.2011 16:56 # 0
нет. могут создавать где угодно, главное, чтоб не было совместного использования одного объекта (каждый объект имеет свое состояние).
>>ваш код уже работать не будет. В оригинальном коде управление передаётся сразу к return при повторном входе в функцию.
это костыль, созданный для того, чтобы избежать return
guest 10.01.2011 21:50 # −1
А потом совершенно случайно не заметете, как станете использовать один из объектов в нескольких потоках. ))
bugmenot 10.01.2011 23:12 # +3
krems 12.01.2011 23:24 # +1
При первом входе возвращает 0, потом 1, потом 2 и тд до 9.
Мне понравилась идея - первый раз подобное встретил =)
SmackMyBitchUp 15.05.2011 14:48 # 0
OCETuHCKuu_nemyx 13.08.2020 23:03 # 0
bormand 13.08.2020 23:09 # +1
Контекст пропихнуть, макросом обмазать и вполне практично.
TEH3OPHblu_nemyx 14.08.2020 01:02 # 0