LINUX.ORG.RU
ФорумTalks

кто тут не любит goto?


0

2

Зачастую оператор goto поможет сильно упростить жизнь или же вообще является единственной вменяемой возможностью.

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

★★★★★
Ответ на: комментарий от AptGet

AptGet

В первом попавшемся на глаза драйвере:

http://lxr.linux.no/linux v3.3.5/drivers/net/ethernet/atheros/atl1e/atl1e_main.c...

да, у меня было «счастье» использовать данный драйвер на одной из машин - он поднимался с вероятностью 50%. Пришлось сбегать в магазин за простой PCI карточкой на RTL чипе за $5. ИЧСХ, в венде ТОТ ЖЕ САМЫЙ интерфейс подымается во всех 100% случаях, т. ч. дело тут не в кривом железе.

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

Ты либо не скромничай, либо не бросайся фразами типа «быдлокодер с вероятностью 146%».

дык то понятно - если программа то работает, то не работает, то это не быдлокод, ибо ЯДРО СВЯТО. Типа «сперва добейся», и «скажи спасибо, что хоть такой драйвер есть». А по моему - лучше-бы никакого драйвера не было, чем такой.

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

а зачем он там, если есть break, и continue?

А как при помощи break/continue выполнить переход внутрь цикла или условия?

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

http://lxr.linux.no/linux v3.3.5/drivers/net/ethernet/atheros/atl1e/atl1e_main.c...

да, у меня было «счастье» использовать данный драйвер на одной из машин - он поднимался с вероятностью 50%. Пришлось сбегать в магазин за простой PCI карточкой на RTL чипе за $5.

$ cd drivers/net/ethernet/realtek
$ grep goto *.c | wc -l
78
$

Ну или:

$ cd drivers/ata
$ grep goto *.c | wc -l
341
$

Чем ты заменишь свой ATA? %)

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

Так вот почему я его не использовал! :)

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

если программа то работает, то не работает, то это не быдлокод, ибо ЯДРО СВЯТО

Я еще раз прошу показать, как должен выглядеть без goto этот код:

static int
sb1000_probe_one(struct pnp_dev *pdev, const struct pnp_device_id *id)
{
        struct net_device *dev;
        unsigned short ioaddr[2], irq;
        unsigned int serial_number;
        int error = -ENODEV;

        if (pnp_device_attach(pdev) < 0)
                return -ENODEV;
        if (pnp_activate_dev(pdev) < 0)
                goto out_detach;

        if (!pnp_port_valid(pdev, 0) || !pnp_port_valid(pdev, 1))
                goto out_disable;
        if (!pnp_irq_valid(pdev, 0))
                goto out_disable;

        serial_number = pdev->card->serial;

        ioaddr[0] = pnp_port_start(pdev, 0);
        ioaddr[1] = pnp_port_start(pdev, 0);

        irq = pnp_irq(pdev, 0);

        if (!request_region(ioaddr[0], 16, "sb1000"))
                goto out_disable;
        if (!request_region(ioaddr[1], 16, "sb1000"))
                goto out_release_region0;

        dev = alloc_etherdev(sizeof(struct sb1000_private));
        if (!dev) {
                error = -ENOMEM;
                goto out_release_regions;
        }


        dev->base_addr = ioaddr[0];
        /* mem_start holds the second I/O address */
        dev->mem_start = ioaddr[1];
        dev->irq = irq;

        if (sb1000_debug > 0)
                printk(KERN_NOTICE "%s: sb1000 at (%#3.3lx,%#3.3lx), "
                        "S/N %#8.8x, IRQ %d.\n", dev->name, dev->base_addr,
                        dev->mem_start, serial_number, dev->irq);

        /*
         * The SB1000 is an rx-only cable modem device.  The uplink is a modem
         * and we do not want to arp on it.
         */
        dev->flags = IFF_POINTOPOINT|IFF_NOARP;

        SET_NETDEV_DEV(dev, &pdev->dev);

        if (sb1000_debug > 0)
                printk(KERN_NOTICE "%s", version);

        dev->netdev_ops = &sb1000_netdev_ops;

        /* hardware address is 0:0:serial_number */
        dev->dev_addr[2]        = serial_number >> 24 & 0xff;
        dev->dev_addr[3]        = serial_number >> 16 & 0xff;
        dev->dev_addr[4]        = serial_number >>  8 & 0xff;
        dev->dev_addr[5]        = serial_number >>  0 & 0xff;

        pnp_set_drvdata(pdev, dev);

        error = register_netdev(dev);
        if (error)
                goto out_free_netdev;
        return 0;

 out_free_netdev:
        free_netdev(dev);
 out_release_regions:
        release_region(ioaddr[1], 16);
 out_release_region0:
        release_region(ioaddr[0], 16);
 out_disable:
        pnp_disable_dev(pdev);
 out_detach:
        pnp_device_detach(pdev);
        return error;
}
tailgunner ★★★★★
()
Ответ на: комментарий от drBatty

приравнять счётчики обхода к своему конечному значению

Это ж вроде нездоровая фигня — изменять счётчики в теле цикла.

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

С вероятностью 146% goto написано быдлокодером.

Ничего подобного. Зачем бояться goto? Везде, где он улучшит читабельность кода и упростит запись, его нужно использовать.

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

Сам такие конструкции использую, когда в конце функции вызывается уйма деструкторов (в смысле - free), а переход к конкретному осуществляется по goto в случае, если память для очередной структуры выделить не получилось.

Подозреваю, что без goto здесь придется вводить 100500 флагов, или 1 флаг и switch.

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

Это ж drBatty! Что написано докторОм, того не вырубишь топором. :)

По теме:

Зачем бояться goto? Везде, где он улучшит читабельность кода и упростит запись, его нужно использовать.

Полностью согласен. Поддерживаю. Хотя сам использовал goto считанные разы - там, где после долгих размышлений лучшего ничего не придумалось.

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

повторяю ещё раз: я и не против goto. Но ваши примерчики с atl == говнокод. Причём совсем не из-за goto я такой вывод сделал, а по работе этой вашей atl. Совсем не удивлён, что быдлокодеры юзали там goto...

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

tailgunner

Я еще раз прошу показать, как должен выглядеть без goto этот код:

наверное ЭТОТ код есть смысл писать вообще на ассемблере.

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

повторяю ещё раз: я и не против goto.

Ты всего лишь считаешь, что это 146% признак быдлокодера.

Но ваши примерчики с atl == говнокод

Я не приводил примеров с atl.

быдлокодеры юзали там goto...

Спердобейся, мальчик. Развей внимание, потом логическое мышление. Пока что засчитываю тебе жидкий слив.

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

Это ж вроде нездоровая фигня — изменять счётчики в теле цикла.

угу. Как из него выпрыгивать. Ну это лучше, чем некоторые тут занимаются - ВНУТРЬ цикла запрыгивают. Таким точно нужно два кондома - один на голову, что-бы все видели, какой он кондом, а второй на ***, что-бы больше таких программистов не было...

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

tailgunner

Ты всего лишь считаешь, что это 146% признак быдлокодера.

угу. и кривой Свободный драйвер atl это только подтверждает.

tailgunner

Спердобейся, мальчик.

если честно - никогда не писал дрова для разных железок. ну разве что в детстве для ZX Spectrum'а. Потому и не знаю. Может В ЭТИХ дровах goto и имеет смысл. Но таки, между нами мальчиками, ты разве будешь утверждать, что дрова, которые привязаны к какой-то конкретной железки, не являются очень специфическим случаем среди программ на C?

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

Конечно можно. Типичный юзкейс - ошибка в днк

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

да, у меня было «счастье» использовать данный драйвер на одной из машин - он поднимался с вероятностью 50%. Пришлось сбегать в магазин за простой PCI карточкой на RTL чипе за $5. ИЧСХ, в венде ТОТ ЖЕ САМЫЙ интерфейс подымается во всех 100% случаях, т. ч. дело тут не в кривом железе.

WORKSFORME

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

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

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

А как при помощи break/continue прострелить себе голову?

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

Блджад, всё в действительности реализуется через goto и флаги. Вообще всё. Поэтому давайте отменим полвека прогресса и станем писать в кодах.

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

Вот не нужно спорить. Нужно просто писать код так, чтобы тебе было удобно, и чтобы ты в нем не запутался.

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

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

повторюсь:

Таким точно нужно два кондома - один на голову, что-бы все видели, какой он кондом, а второй на ***, что-бы больше таких программистов не было...

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