1. C++ / Говнокод #11750

    +35

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    // стоит простая задача: удалить все узлы из списка
    // чувак думает, как же ему это реализовать через задницу?
    // и получилось же!
    
    if (link * root = list.get_root()) {
        link * next;
        do {
            next = root->next();
            list.remove(next);
        } while (root = next);
    }
    
    // неужели нельзя вот так, по-простому?
    
    link * node = list.get_root();
    while (node) {
        link * next = node->next();
        list.remove(node);
        node = next;
    }

    Запостил: alexzak, 11 Сентября 2012

    Комментарии (48) RSS

    • сентябрь уж наступил
      Ответить
      • Черд, я 1 сентября пропустил. Мама меня оставит без борща...
        Ответить
    • link * next = node->next();
      list.remove(node); // а если node = NULL?
      Ответить
      • Тогда не войдет в цикл, потому что удаляем node а не next. А node на этот момент уже проверен на не NULL.
        А вот в оригинальном коде такое, по-моему, неизбежно случится. Остается надеяться, что list.remove() корректно обработает аргумент NULL.
        Ответить
    • А так?
      link * node;
      while ((node = list.get_root()) != NULL) {
          list.remove(node);
      }
      Ответить
      • Это уже инетересно. Реальный код посложнее будет (я его тут немного упростил). Но вполне возможно эта идея будет работать.
        Ответить
    • procedure delete_list(var node : PNode);
      begin
        if node <> nil then begin
          delete_list(node.next);
          FreeAndNil(node);  
        end;
      end;
      Ответить
      • рекурсия тут ни к чему
        Ответить
        • Ты ничего не понимаешь, пока десять императивных быдл будут делать убогий цикл, нормальный лиспер на рекурсии вас всех надерёт как деток.
          Ответить
          • как ты думаешь, твоя рекурсия - хвостовая?
            Ответить
          • Неправильно. Надо некоторые слова зеленым капсом, с восклицательными знаками в конце (больше - лучше) и с брызжущими на весь тред слюнями.
            Ответить
            • >и с брызжущими на весь тред слюнями.
              жиром
              Ответить
              • Черт, ты прав.
                > там нет таких убогореализованных Тарасом списков.
                А тут прав вдвойне.
                Ответить
            • Да, что-то я побоялся сделать пародию на всл слишком яркой.
              Ответить
          • >пока десять императивных быдл будут делать убогий цикл, нормальный лиспер на рекурсии вас всех надерёт как деток.
            Больше зеленого! И да, там нет таких убогореализованных Тарасом списков.
            Ответить
            • Осень уже, желтеть пора. И облетать.
              Ответить
      • То есть вместо постоянных накладных расходов памяти в стеке (одна локальная переменная) расход стека будет пропорционален длине списка?
        Ответить
        • 2 defecate-plusplus, Vindicar
          Господа, не забывайтесь - Вы на говнокоде.
          Ответить
      • Велосипедист?
        Возьми стандартный лист.

        list.clear();
        ирррр....

        Вдруг с памяти я снял покров:
        В дельфи нет генериков.

        Раз в д7ке нет контейнеров,
        Работадатель не забываеть набирать велотренеров.
        Ответить
        • > Велосипедист?

          А как вы узнали? :)
          Ответить
        • Генериков то нет, но лист из ТОбъектов вроде был, если мне не изменяет память. Ну не совсем типобезопасно, ну надо касты, но все лучше чем эти велосипеды.
          Ответить
        • В д7 ваще-то есть шаблоны.
          Ответить
          • {.$DEFINE TTemplate1}

            ?
            Ответить
            • нет
              http://govnokod.ru/7095
              Ответить
              • >{$I qsort.inc}
                Я почти угадал. Теряю хватку.

                Кстати, оно же не может во много инстансов одной процедуры с разными типами в одном модуле.
                Ответить
                • Может. Объявляешь всё это локально в пределах функции.
                  Ответить
    • но java делает всех:
      list=null;
      Ответить
      • ты забыл System.gc();
        PS И если сцылка на список в другом месте - это тебя не спасёт.
        Так что remove, сударь, remove их всех - GC разберется кто прав, а кто виноват.
        Ответить
        • я знаю, иначе бы не выделил зеленым.

          однако, у меня появилась странная мысль о деструкторах в языках с неявным управлением памятью.
          Ответить
          • я знаю, иначе я бы не плюсонул.
            >странная мысль о деструкторах в языках с неявным управлением памятью.
            а что не так с finalize, weak refs и всем таким?
            Ответить
            • недетерменированное поведение:
              finalize может вызваться или не вызваться (никогда)
              weak references могут оказаться собранными даже если еще нужны
              Ответить
              • > weak references могут оказаться собранными даже если еще нужны
                Если на объект нет ни одной нормальной ссылки - он не нужен.

                А деструкторов не хватает. Открытие файла, которое, в с++ пишется в пару строк с использованием RAII, на яве превращается в дофигастрок с отловом экцепшена и ручным закрытием файла. Можно, конечно, запилить что-то такое:
                WithOpenFile("1.txt", new FileHandler() {
                    void handle(InputStream s) {
                        // ...
                    }
                });
                Но это же извращение и лишний класс на выхлопе.

                P.S. Может быть я явонуб и что-то недопонимаю?
                Ответить
                • http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html ?
                  Ответить
                • >Но это же извращение и лишний класс на выхлопе.
                  Пиши удобные обертки или юзай чужие. Так и живём.
                  Ответить
                • Ты ничего не понимаешь, РАИИ придумали для убогих нативщиков, по-настоящему успешные программисты пишут кроссплатформенные программы на яве с ГЦ, к 20 годам имеют машину представительского класса, к 25 имеют свою квартиру, но пишут они, разумеется, не для нищебродов, не способных доплатиться за лишний жалкий гигабайт.
                  Ответить
                  • What? Я вообще-то про память тут ничего не сказал. Я имел в виду RAII в применении к файлам, процессам, базам данных, и прочим ресурсам, которые важно освобождать в детерминированное время.
                    Ответить
                    • Детерминированное время - удел нищебродов-крестовиков. Успешные программисты такими проблемами не заморачиваются, потому что у них есть ООП, исключения и ГЦ.
                      Ответить
                      • ГЦ, ООП и исключения - удел неосиляторов-явоёбов. Успешные программисты такими проблемами не заморачиваются, потому что у них есть регистры и макросы.
                        Ответить
                        • Вы меряетесь толщиной и зеленостью?
                          Ответить
                        • Фи, это асмоёбы-то успешные?
                          Ответить
                          • Асмоёб смотрит свысока на жабоёбов и крестоблядей. Он не вступает в споры о ООП и монадах, потому что они для него ничтожны. Его программы быстры и компактны, а сам асмоёб богат и успешен.
                            Ответить
                            • Нет, асмоёб - это красноглазый нищий задрот, живущий на дошираках. А Джавист просыпается примерно в 11:00 в своём личном замке, пару часиков пишет небольшую, но очень важную программу (да-да, ведь у него есть Джава-технологии!) и получает за неё сумму, превышающую месячную зарплату асмоёба.
                              Ответить
                • >с отловом экцепшена
                  А вот это не нужно. YAGNI так сказать. Достаточно try-finally.
                  Разве что превратить его в unchecked.
                  Ответить
    • оба куска кода неадекватны.
      что вообще такое лист ?
      намешаны сишный вариант с просто node* и с++ в котором есть класс лист.
      вы уже решите, или котлеты или мухи
      Ответить

    Добавить комментарий