gns_ua: (Default)
gns_ua ([personal profile] gns_ua) wrote2011-09-07 05:11 pm

(no subject)

то что ты сейчас пытаешься сделать (использовать ассемблер в программах на Delphi) — ошибка. Генетическая. Российская. Всей образовательной системы страны. Таких преподов надо увольнять сразу же. Если выжигать эту дурь из мозгов каленым железом не получается. Правильно им копейки платят. Они это заслужили.

http://lurkmore.ru/Pascal#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80.D1.8B_.D0.9F.D0.A0.D0.90.D0.92.D0.94.D0.AB_.D0.BF.D1.80.D0.BE_Delphi

А я говорил!

[identity profile] v-l-a-d.livejournal.com 2011-09-07 09:17 pm (UTC)(link)
Странно, что никто не предложил единственный расово верный способ прерывания двойного цикла - return.
Потому как если в функции вначале два вложенных цикла, а после них ещё что-то делается, то это явный признак того, что задачу надо декомпозировать.

[identity profile] v-l-a-d.livejournal.com 2011-09-07 09:17 pm (UTC)(link)
Под "декомпозировать" я в данном случае подразумеваю "бить на более мелкие функции", если что

[identity profile] st-archer.livejournal.com 2011-09-08 10:34 am (UTC)(link)
Кстати, педивикия нам намекает:

Другие варианты решения этой проблемы — помещение вложенных циклов в отдельную процедуру и использование команды досрочного выхода из процедуры, а в языках с поддержкой исключений — генерацию исключения, обработчик которого располагается за пределами циклов. Однако подобные решения могут снижать производительность, в особенности если этот участок кода вызывается многократно (поскольку и вызовы процедур, и операторы работы с исключениями транслируются далеко не в одну машинную инструкцию).

[identity profile] gns-ua.livejournal.com 2011-09-08 10:46 am (UTC)(link)
Педивикию писали задроты, дрочащие на машинные такты.

> Однако подобные решения могут снижать производительность, в особенности если этот участок кода вызывается многократно (поскольку и вызовы процедур, и операторы работы с исключениями транслируются далеко не в одну машинную инструкцию).

Инлайн!

Или, к примеру, посмотри на хаскел и осознай что вот ЭТО хуйзнаетшо компилируется в вообще хуй проссышь ассемблерную кашу - но работает, сцуко, быстро и решительно.

[identity profile] v-l-a-d.livejournal.com 2011-09-08 01:18 pm (UTC)(link)
Все нормальные компиляторы цэ/цэ-плюс-плюс сами умеют инлайнить функции, когда надо.

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

[identity profile] st-archer.livejournal.com 2011-09-08 01:22 pm (UTC)(link)
А ведь, к слову, риальне соблазнительный вариант: к примеру, надо считать число из строки. Лабаешь

String str = "четотам";
try
{
int temp = (int)str;
}
catch(ArgumentException e)

И вуаля.

[identity profile] ctype.livejournal.com 2011-09-07 09:54 pm (UTC)(link)
использование нескольких returnов в одной функции - еще более расово неверно, чем goto

[identity profile] ctype.livejournal.com 2011-09-08 04:03 pm (UTC)(link)
потому что нарушает "линейность" логики, как и goto

[identity profile] gns-ua.livejournal.com 2011-09-08 04:04 pm (UTC)(link)
O_o

[identity profile] st-archer.livejournal.com 2011-09-08 04:34 pm (UTC)(link)
Ничуть. Вы блок-схемку простую нарисуйте для такой процедуры.

[identity profile] ctype.livejournal.com 2011-09-08 05:16 pm (UTC)(link)
goto в блок-схемках также хорошо выглядит :)

[identity profile] st-archer.livejournal.com 2011-09-08 05:18 pm (UTC)(link)
Ненене. В случае return концовка-то у всех будет общая :)

[identity profile] ctype.livejournal.com 2011-09-08 05:25 pm (UTC)(link)
это в случае goto EndOfFunction концовка будет общая :)
а в случае return мы получаем несколько семантически несвязных концовок

[identity profile] gns-ua.livejournal.com 2011-09-08 05:37 pm (UTC)(link)
o_0

Смысл существования функции - вернуть результат. Она его возвращает. В зависимости от разных условий, результат может возвращаться разный.

def mod(a):
    if a > 0:
        return a
    else:
        return -a

Ну давай на стеке поднимать int res, присваивать его в двадцати местах делать, а потом извращаться с готой либо управляющими конструкциями чтобы оказаться в конце и вернуть res. Правда, где этот res образовался потом хуй отследишь, но кого это волнует, лишь бы ретурнили его в одном месте.

Бывает конечно, иногда, что надо не просто ретурн а ещё и финалайзить, снимать мутексы какие-нибудь и всё такое. Решается return finalize([мойтекущийрезультат]). Где финалайз - ЛОКАЛЬНАЯ субфункция.

[identity profile] ctype.livejournal.com 2011-09-08 05:55 pm (UTC)(link)
так я не спорю. я и к goto спокойно отношусь, если оно по месту. да что уж там, ассемблерные вставки и то, редко-редко но нужны

но с точки зрения "расовой чистоты" return нарушает линейность flow , вместе со всем комплексом проблем goto - т.е. в последующем сопровождении ведет к ошибкам исполнителя

[identity profile] gns-ua.livejournal.com 2011-09-08 06:00 pm (UTC)(link)
Да нет никакой линейности флоу.

ретурн это не какой-то там обходной путь для решения какой-то там конкретной проблемы - ретурн это, именно смысл функции. Она возвращает значение. И нет совершенно, вообще, никакой проблемы его возвращать из многих мест.

Давай, взорву мозг :

def myfunc(a,b):
return someotherfunc

myfunc(a,b)(args)

Расскажи про линейность флоу, неподдерживаемый спагетти и ошибки исполнителя %)

(no subject)

[identity profile] gns-ua.livejournal.com - 2011-09-08 18:04 (UTC) - Expand

(no subject)

[identity profile] ctype.livejournal.com - 2011-09-08 18:40 (UTC) - Expand

(no subject)

[identity profile] v-l-a-d.livejournal.com - 2011-09-08 20:15 (UTC) - Expand

[identity profile] st-archer.livejournal.com 2011-09-08 05:54 pm (UTC)(link)
Эм, ну да, оди фиг, вощимто. Просто блок-схема то подразумевает понятя "начало"и "конец", а оно таки конец :) Вопрос в том, что все ретурны сходятся в одной точке - и соответственно, спагетти-кода не будет. Впрчоем, как и в случае использования гото. Тут - вопрос вкуса.

[identity profile] gns-ua.livejournal.com 2011-09-08 05:30 pm (UTC)(link)
Хлопцы, что вы курили и где такое дают ?

Какие, в жопу, блоксхемы? На блок-схеме вот это говно совершенно идентично вот этой питонятине:

def test(a):
    if a > 30:
        print "a>30"
    elif a > 20:
        print "A>20"
    elif a > 10:
        print "A>10"
    else:
        print "A TOO SMALL!"
        return False
    # maybe something more
    print "DONE"

[identity profile] st-archer.livejournal.com 2011-09-08 05:54 pm (UTC)(link)
Ээээ, ну да, действительно. С гото просто почти не работал :)

[identity profile] ctype.livejournal.com 2011-09-08 04:05 pm (UTC)(link)
это еще со времен обструкции goto

[identity profile] gns-ua.livejournal.com 2011-09-08 04:06 pm (UTC)(link)
жж0шь.

[identity profile] st-archer.livejournal.com 2011-09-08 10:29 am (UTC)(link)
Кстати, тоже подумал об этом, но есть один недостаток - в случае, если нужно выйти не из всех циклов сразу. муша в таком случае использование ретурнов рискует вылиться в написание кучи процедур. Или к рекурсиям. Или к косвенным рекурсиям.

[identity profile] gns-ua.livejournal.com 2011-09-08 10:50 am (UTC)(link)
> Или к рекурсиям. Или к косвенным рекурсиям.

Дорогой двачик, есть одна scheme....

SICP читал?:)