LINUX.ORG.RU
ФорумTalks

RAD портит мозги юных программистов


0

0

Принесли мне прогу для тестирования. Написана в Багланд C++. Основной алгоритм закодирован в подпрограмме на 245 строк, goto наличествует, потенциальные баги видно невооруженным глазом. Но зато какой GUI... глаз не оторвать.

★★★★★

> Но зато какой GUI... глаз не оторвать.

GUI там гвоздями прибит? =)

anonymous
()
Ответ на: комментарий от redgremlin

> 1. Там это обосновано.

первое что попалось под руку

--- fs/fcntl.c ---

static int locate_fd(struct files_struct *files,
                struct file *file, unsigned int orig_start)
{
    unsigned int newfd;
    unsigned int start;
    int error;
    struct fdtable *fdt;

    error = -EINVAL;
    if (orig_start >= current->signal->rlim[RLIMIT_NOFILE].rlim_cur)
        goto out;

repeat:
    fdt = files_fdtable(files);
    /*
     * Someone might have closed fd's in the range
     * orig_start..fdt->next_fd
     */
    start = orig_start;
    if (start < files->next_fd)
        start = files->next_fd;

    newfd = start;
    if (start < fdt->max_fds)
        newfd = find_next_zero_bit(fdt->open_fds->fds_bits,
                       fdt->max_fds, start);

    error = -EMFILE;
    if (newfd >= current->signal->rlim[RLIMIT_NOFILE].rlim_cur)
        goto out;

    error = expand_files(files, newfd);
    if (error < 0)
        goto out;

    /*
     * If we needed to expand the fs array we
     * might have blocked - try again.
     */
    if (error)
        goto repeat;

    /*
     * We reacquired files_lock, so we are safe as long as
     * we reacquire the fdtable pointer and use it while holding
     * the lock, no one can free it during that time.
     */
    if (start <= files->next_fd)
        files->next_fd = newfd + 1;

    error = newfd;

out:
    return error;
}
--- fs/fcntl.c ---

было бы небезынтересно послушать обоснование использования именно
goto в указанном примере. причём пример более чем характерный.

ps: конечно, я понимаю, с точки зрения практики работает и с goto,
без вопросов. солнце всходит и заходит..

> 2. Пользуются они этим очень аккуратно.

мне не совсем понятен термин "аккуратно" в указанном контексте.
что значит аккуратно? табы не забывают расставлять?

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

>было бы небезынтересно послушать обоснование использования именно

Да, вместо goto repeat здесь do-while лучше бы смотрелось, а вместо goto out лучше break, почему тут goto не понял.

redgremlin ★★★★★
()
Ответ на: комментарий от tailgunner

Условный оператор осуществляет передачу управления разными операторам в зависимости от текущего состояния памяти программы. goto - всегда одному и тому же. Линейный участок программы - такой участок в котором последовательность выполнения операторов однозначно задана и не зависит от состояния памяти программы.

Burbaka ★★
()
Ответ на: комментарий от Burbaka

> Условный оператор осуществляет передачу управления разными операторам в зависимости от текущего состояния памяти программы. goto - всегда одному и тому же.

То есть, если выражаться менее наукообразно, в goto точность предсказания перехода составляет 100%, так?

tailgunner ★★★★★
()
Ответ на: комментарий от Burbaka

> Условный оператор осуществляет передачу управления разными операторам
в зависимости от текущего состояния памяти программы. goto - всегда
одному и тому же.

mmm... не понял всей глубины мысли. чем отличаются фрагменты:

while (1) {
    sleep(1);
}

и

l:
    sleep(1);
    goto l;

?

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от tailgunner

Умный компилятор может сообразить, что условие всегда ложно и выкинуть весь код условного оператора, для goto это не пройдет.

Sun-ch
()
Ответ на: комментарий от Sun-ch

> Умный компилятор может сообразить, что условие всегда ложно и выкинуть весь код условного оператора, для goto это не пройдет.

Это если goto на ровном месте. Но какой в них смысл? Обычно goto стоит под условием.

tailgunner ★★★★★
()
Ответ на: комментарий от klalafuda

>while (1) {
> sleep(1);
>}
for(;;)sleep(1);
---
минусы goto в том, что им можно портить ясность исходников.
если бы это еще было целесообразно это можно было бы понять, но, в большинстве случаев, можно обойтись и без него.
при сложной логике код лучше разбивать на процедуры и писать код уже с их использованием. без всяких goto.

saahriktu ★★★★★
()
Ответ на: комментарий от tailgunner

> Это если goto на ровном месте. Но какой в них смысл? Обычно goto стоит под условием.

Классики использовали термины: Условный переход и безусловный переход. Branch vs. Jump

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

> Классики использовали термины [...]

Классики использовали разные термины, да мы и не классики. OP использовал термин goto.

tailgunner ★★★★★
()
Ответ на: комментарий от seiken

>Дело в том, что RAD'иевые программисты сначала мастерят GUI

+1 Так оно и есть, так их учат. Учат алгоритм изобретать, сидя за компом.

Deleted
()
Ответ на: комментарий от klalafuda

>было бы небезынтересно послушать обоснование использования именно goto в указанном примере

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

anonymous
()
Ответ на: комментарий от Sun-ch

Санчо, и много ты нюхал промышленного программирования? ;-)

Deleted
()
Ответ на: комментарий от anonymous

>> было бы небезынтересно послушать обоснование использования именно goto в указанном примере

> перепиши этот код без goto

как раз размер _этого_ кода почти не изменится :) замени goto out на break, goto repeat - на do {} while.

tailgunner ★★★★★
()
Ответ на: комментарий от Sun-ch

>Умный компилятор может сообразить, что условие всегда ложно и выкинуть весь код условного оператора, для goto это не пройдет.

$ cat goto.c
#include <stdio.h>

int main()
{
    goto next;
    puts("-- 1 --");
next:
    puts("-- 2 --");
    return 0;
}
$ gcc -O2 -S goto.c
$ cat goto.s
        .file   "goto.c"
        .section        .rodata.str1.1,"aMS",@progbits,1
.LC0:
        .string "-- 2 --"
        .text
        .p2align 4,,15
.globl main
        .type   main, @function
main:
.L2:
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %ecx
        subl    $4, %esp
        movl    $.LC0, (%esp)
        call    puts
        addl    $4, %esp
        xorl    %eax, %eax
        popl    %ecx
        popl    %ebp
        leal    -4(%ecx), %esp
        ret
        .size   main, .-main
        .ident  "GCC: (GNU) 4.1.2 20070925 (Red Hat 4.1.2-33)"
        .section        .note.GNU-stack,"",@progbits

--

ГыГыГы

anonymous
()
Ответ на: комментарий от klalafuda

> ну что касается ядра одной небезызвестной системы, то оно в общем и целом с трудом дотягивает до мерила чего либо...

И не говори! Они даже кода никому не показывают. И штаб-квартира в каком-то убогом Редмонде (даже не представляю, где это).

annoynimous ★★★★★
()
Ответ на: комментарий от seiken

> Вот многие, например, ругают пользователей винды, что они мол такие сякие тупые маздайные юзеры. А всё из-за низкого порога вхождения. И здесь то же самое.

Это точно. На ЛОРе очень низкий порог вхождения.

atrus ★★★★★
()

> goto наличествует

Ты шаблонно мыслишь.

Agent666
()
Ответ на: комментарий от klalafuda

второе - слишком низкоуровнево

луговского на таких не хватает

anonymous
()
Ответ на: комментарий от atrus

>Это точно. На ЛОРе очень низкий порог вхождения.

Это ты зря, злобнее анонимных линуксоидов может быть только ВСЛ.

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

>>Это точно. На ЛОРе очень низкий порог вхождения.

>Это ты зря, злобнее анонимных линуксоидов может быть только ВСЛ.

И обосрут, и пошлют куда подальше, и срач в теме разведут. Приличным людям неудобно вопросы задавать.

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

> И обосрут, и пошлют куда подальше, и срач в теме разведут.

Вот об этом и говорю. На ЛОРе и обезьяна за человека сойдёт. Тут только одно умение нужно: кидаться говном. :)

atrus ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.