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

    −2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    int** delete_row(int** arr, int &row_count, int  n) 
    {
            delete arr[n-1];
        	for (int i = n-1; i < row_count-1; i++) 
            {
                    arr[i] = arr[i+1];
        	}
        	arr[row_count-1] = NULL;
        	delete arr[row_count-1];
            row_count--; 
        	return arr;
    }

    Запостил: dumiv, 09 Октября 2018

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

    • Автор явно с "PHP" переводил.
      Ответить
    • Не стесняемся...
      Ответить
    • Откройте для себя удивительный мир «STL».
      Ответить
      • Препод сказал, что это STL затрудняет отладку и тормозит программу.
        Ответить
        • перепииши на чистый си
          Ответить
        • > затрудняет отладку
          Факт. Пока продерешься через все эти операторы * и -> от смартпоинтеров...
          Ответить
        • > тормозит программу
          нет

          > STL затрудняет отладку
          потому что с STL ты сразу корректные программы писать начинаешь, и отлаживать становится нечего?

          Закопайте отладчик, пишите юнит-тесты. Я плюсовый отладчик запускаю раз в полгода чтобы в coredump поковыряться.
          Ответить
          • >>Закопайте отладчик
            ничего себе, я не знал что кто-то правда так делает

            ты может и тесты пишешь ПЕРЕД кодом?
            Ответить
            • > ты может и тесты пишешь ПЕРЕД кодом?

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

                Была тулза которая меняла выражения в случайных местах кода (добавляла отрицание) и проверяла что какой-то тест упадет.
                Ответить
            • > я не знал что кто-то правда так делает

              Я уже лет 5 пишу программы, которые работают на другом конце света, и которые крэшатся, если минуту на хартбиты не отвечают. Какой мне толк от отладчика?

              Отладчик я только в Emacs используют, чтобы понять, какой мудак мне в глобальную переменную срёт (я застукал тебя, сраный убогий haskell-mode).
              Ответить
              • ну а тесты ты не дебажишь, когда они падают?
                Ответить
                • Добавляю полезных логов, возвращаю более осмысленные статусы. Всё это в любом случае поможет в проде. Если осилить концепцию владения и писать в нормальном современном стиле, крэшатся программы крайне редко. Как правило, ошибки случаются из-за того, что не до конца понимаешь, как работает какая-нибудь внешняя система.
                  Ответить
                  • >>осилить концепцию владения
                    Всмысле понимать кто каким объектом владеет, вместо того чтобы делать delete в случайном порядке?;)

                    >> не до конца понимаешь

                    А у тебя легаси кода не бывает чтоль? Ну там вот тебе шмоток из чужого кода, надо что-то починить, а как оно работает -- хз
                    Ответить
                • Я работаю как-то так, например: https://github.com/k32/erlstack-mode/raw/master/pictures/screencap.gif (записывалка видео из emacs немного глючная, потому есть иллюзия задержки)

                  Дебаггер не нужен, трассировщик изредка бывает полезен, если знаешь что искать, но практика показывает, что быстрее разобраться в коде, чем в портянке трейсов.
                  Ответить
              • А там Valgrind'ы всякие? Или это не применимо к тому, что вы делаете?
                Ответить
                • CI постоянно гоняет тесты с msan и tsan. Именно поэтому я за "тесты".
                  Ответить
                  • > tsan
                    tsar
                    Ответить
                  • Мне даже интересно стало, как писать тесты для, например, tsan. Это ведь уже не unit test'ы?
                    Ответить
                    • unit test'ы очень условное понятие в наше время.

                      Часть тестов невозможно отнести ни к unit, ни к интеграционным, ни к фунциональным.

                      Все смешалось в доме еблонских
                      Ответить
                • Valgrind это же профилят?
                  Ответить
          • Тесты? После очередного спринта они посыпяться потому что новые требования по функционалу в них не отражены. Потом ты на них тупо забьешь.
            Ответить
            • У него нету скрама:)

              >>новые требования по функционалу в них не отражены
              попрошу бизнес-аналитика переписать .feature файл)

              >>Потом ты на них тупо забьешь.
              Я по той же причине одежду не стираю: всё равно испачкается
              Ответить
    • ПОСОНЫ, что не так? Препод меня говнокодером назвал.
      Ответить
      • Даа? А свинособакой не обзывал случайно? Про багор ничего не говорил? Проверить ничего не предлагал? Мамку не ебал?
        Ответить
      • Поскольку хранить указатели на инты в массиве человек в зравом уме не будет, предполагаю, что там на самом деле динамические массивы. Тогда в коде лютый косяк: для удаления массивов нужно использовать

        delete[] arr[i];

        а не

        delete arr[i];

        Вместо цикла можно впендюрить memmove, ну и, конечно, самый разумный способ реализовать желаемое — использовать вектор векторов
        std::vector<std::vector<int>> rows;
        rows.erase(rows.begin() + n);
        Ответить
        • >>у хранить указатели на инты в массиве человек в зравом уме не будет
          гипотетически можно представить платформу где указатель маленький, а инт большущий
          Ответить
          • И что дальше? В сумме всё равно памяти гораздо больше съешь, да ещё и всю cache locality в окошко выкинешь.
            Ответить
            • >>больше

              ну, нет:) представь себе некую систему где INT занимает гигабайт. Зачем делать из них массив, когда можно сделать просто массив указателей?


              Это бред конечно в случае int, но для структур это вполне реально.

              >>cache locality
              Это правда, ведь рядышком у нас только указатели, а не данные
              Ответить
        • >>delete[] arr[i];
          Теперь я не понимаю почему вообще работает мой код. Я котел освободить память на которую указывает a[k-1], а потом сделать так, чтобы a[k-1] указывал на ту же строку, что и a[k] .
          Ответить
          • > чтобы a[k-1] указывал на ту же строку, что и a[k]
            Бывший питонист или жсник что ли?
            Ответить
          • > Я котел освободить память на которую указывает a[k-1], а потом сделать так, чтобы a[k-1] указывал на ту же строку, что и a[k]

            Ну указатели ты вроде правильно перезаписал, просто память криво освободил, и аллокатору теперь может крышу снести в самом неожиданном месте.
            Ответить
            • > крышу снести
              Да просто утечка, удаление null'а даже не UB.
              Ответить
              • > удаление null'а даже не UB

                при чём тут удаление null'а? он результат new[] передаёт в delete, а не в delete[].

                From the standard (5.3.5/2) :

                In the first alternative (delete object), the value of the operand of delete shall be a pointer to a non-array object or a pointer to a sub-object (1.8) representing a base class of such an object (clause 10). If not, the behavior is undefined.

                In the second alternative (delete array), the value of the operand of delete shall be the pointer value which resulted from a previous array new-expression. If not, the behavior is undefined.

                -- https://stackoverflow.com/questions/4255598/delete-vs-delete
                Ответить
                • А, лол, верхний delete в третьей строке я не заметил.
                  Ответить
                  • Вот поэтому, я, блядь, за "PHP".
                    Ответить
                    • >>Вот поэтому, я, блядь
                      Первую запятую убрать, вторую заменить на дефис
                      Ответить
                • @@ If not, the behavior is undefined.

                  Какое же всё таки унылое гуано, этот Ваш c++. То ли дело php Pascal.
                  Ответить
            • Поэтому я за "PHP" - там нет ни крыши, ни аллокатора.
              Ответить
              • В "PHP" нет памяти, а значит ею и не нужно управлять. Потому я за "PHP"
                Ответить
                • "PHP"
                  Ответить
                • Рано или поздно, всплывёт такая необходимость (если, разумеется, ты пишешь не только вебговно). И тогда ты окажешься в положении обосравшегося младенца.
                  Ответить
                  • Тот, кто владеет "PHP", без труда осилит любую другую технологию.
                    Ответить
                    • Ну да, младенец, совсем не умеющий говорить, рано или поздно осваивает язык.
                      Ответить
                    • Тот, кто владеет "PHP", владеет миром
                      Ответить
                      • Чему "Facebook"и "ВКонтакте" ярчайший пример и, между прочим, без какого-либо сарказма - разве вы будете отрицать, что не осталось в мире ни одной гланды, по которой хотя бы одна из этих сетей не проехалась?
                        Ответить
            • >>просто память криво освободил
              Получается, что я удалил указатель, а потом заставил ссылаться на другую область памяти. Как такое возможно? Я же его уже удалил(delete arr[n-1]).
              Ответить
              • С помощью delete ты не удаляешь указатель, ты удаляешь освобождаешь блок памяти, на который указывал указатель.
                Ответить
                • Чем отличается delete arr[n-1] от delete [] arr[k-1]?
                  Ответить
                  • delete деструктор только у первого элемента массива позовёт. Для массива из интов похер, конечно, но для более сложных объектов это закончится печально.

                    А delete[] каждому элементу массива позовёт деструктор.
                    Ответить
                    • Ухты, segfault: https://wandbox.org/permlink/7JINe7IGvyJwk6Xs

                      Причем Clang даже ворнинг выписывает сразу:
                      prog.cc:12:5: warning: 'delete' applied to a pointer that was allocated with 'new[]'; did you mean 'delete[]'? [-Wmismatched-new-delete]
                          delete arr;
                          ^
                                []
                      prog.cc:11:17: note: allocated with 'new[]' here
                          auto *arr = new Destroyable[4];
                      Ответить
                      • По традиции:
                        1. Watcom C++. s/__PRETTY_FUNCTION__/__FUNCTION__/, s/auto/Destroyable/
                        Выводит:
                        Destroyable::~Destroyable( void )
                        ---


                        2. Digital Mars. Патч такой же. Работает так же, как Watcom.

                        3. Borland C++. Патч похожий (не знаю, чем заменить __PRETTY_FUNCTION__, читать хелп лень).
                        После вывода имени функции падает.

                        4. MSVC. Патч, как в первых двух примерах.
                        Выводит только первую строку. Три минуса выводить не хочет (т. е. что-то молча завершает программу, даже не сообщив об ошибке).
                        Ответить
                        • Добавим:
                          5. Intel C++. Оригинальный исходник (с auto и __PRETTY_FUNCTION__).
                          Выводит только первую строку, как и после MSVC.
                          Ответить
                        • Поэтому я за "PHP".
                          Ответить
        • >Вместо цикла можно впендюрить memmove, ну и, конечно, самый разумный способ реализовать желаемое — использовать вектор векторов

          еще есть boost::matrix
          Ответить
      • Преподу слова svn/git что-то говорят?
        Ответить
        • Бесполезны, только увеличивают размеры архивов с бэкапами prj1_1.zip, prj1_2.zip, etc.
          Ответить
          • Не смешно, в некоторых университетах где учат на программистов до сих пор не отошли от сортировки пузырьком и не знают про них. И это, я полагаю, плохо.
            Ответить
            • Не понимаю как можно учить на программиста и при этом не рассказать даже о сортировке слиянием и быстрой сортировке. Им что, алгоритмы и структуры данных не дают?

              А вот с вершенконтролем хуже..
              Ответить
              • Молча, студенты с инженерных и прочих тех. специальностей, где программирование не основной, а дополнительный предмет вообще думают что С++ только в визуал студио. На Dev-C++, Geany, Code::blocks смотрят как на инопланетную технологию.
                Ответить
                • я до сих пор так думаю
                  Ответить
                • ну так ты определись:
                  >>студенты с инженерных и прочих тех. специальностей, где программирование не основной,
                  или
                  >>>в некоторых университетах где учат на программистов

                  С++ за каким-то хуем дают вообще левым людям, включая чуть-ли не социологов! Зачем им это надо -- ума не приложу. Если они и будут что-то где-то скриптовать от уж явно не на С++
                  Ответить
                  • > С++ за каким-то хуем дают вообще левым людям
                    Чтобы поняли, что программисты не просто так зарплату получают. На каком-нибудь "PHP" это сделать не выйдет.
                    Ответить
                    • Ну и зря. Уверен, многие социологи потом и работают как раз PHP программистами. Могли бы опыт получать!
                      Ответить
                  • А что непонятного? Есть специальности в универах связанные с разработкой ПО, есть технические специальности где просто надо иметь базовый скил программирования (типа вдруг архитектору при проектировании моста нужно какие-то расчеты автоматизировать). Я сам не знаю почему С++, если в принципе хватит Ruby/Python ну и бонусом какой-то матпакет с возможность писать в нем программки.
                    Ответить
                  • Пора понять, что отечественным вузам вообще пох на вашу рациональность, у них одна главная задача - отбить побольше бабла, это делается путём получения и дальнейшего сохранения аккредитации, потому они наваливают кому угодно какие угодно предметы. Ну и кафедрам типа "Прикладного курильского шёлкопрядства", которые были основаны в 1903 году, тоже надо как-то кормиться, вот и их вхерячивают и социологам, и программистам и физвозу блять
                    Ответить
                    • Это правда.
                      У нас был препод математик на факультете, защитивший кандидатскую по какой-то там ненужной абстрактной хуйне в вакууме. Потом эту самую хуйню поставили нам "спецкурсом". Надо же было чем-то его занять.
                      Ответить
                  • Даже у нас в гермашке стротелям в мохнатых годах давали С (какие то бабы почуяв что я русскоязычный припахали меня написать им прогу). Сейчас дай бог на жаву хотя бы перешли.
                    Ответить
                    • жаба для строителей куда хуже сей: в ней больше ненужной строителям хуйни
                      Ответить
        • >>svn
          ого) а cvs застал? а rccs?
          Ответить
          • Неа, но сабвершен использую в домашних проектах с удовольствием. Гит на работе весь мозг заебал.
            Ответить
            • Понятно) а у меня уже практически везде гит
              Ответить
            • Вот я тут спрашивал, сука, нахуй мне дома на локалхосте гит если мне нужен бекап с версиями?
              Ответить
              • Зачем мне помнить и svn и git, если gitа достаточно? Он прекрасно работает локально так-то:)
                Ответить
                • Если ты знаешь гит и не знаешь свн - может и незачем. А я знаю svn и не знаю гит. Просто на локалхосте используется очень базовый набор от функций любой vcs. Svn как по мне лучше потому что нумерация последовательная.
                  Ответить
                  • Зачем вообще нужны "Git" и "SVN? Нынешние программисты настолько тупые, что не способны словами скоординировать свои действия, указав друг другу, какой файл не лапать и когда его обновить в редакторе?
                    Ответить
                    • Ага, блядь, проходили уже. Ну нахуй.
                      Ответить
                  • Я знал svn и даже cvs, но последний раз я имел дело с svn в 2008 году. С тех пор у меня немного побыл perforce (буэ) и стал гит. Svn вымыт из моей памяти, так зачем он мне?

                    >>Svn как по мне лучше потому что нумерация последовательная.
                    Да, ревизии там последовательные, а у гита -- хеши, потому что он распределенный
                    Ответить
                    • >у гита -- хеши, потому что он распределенный
                      Что нахуй не нужно на локалхосте, правда?

                      >--
                      Вы заебали, поставьте себе уже автозамену.
                      Ответить
                      • ----------------------------------------------------------------------------------------------------
                        ———————————————————————————————————————— ———————————————————————————————————————— ————————————————————
                        Ответить
                      • >>Что нахуй не нужно на локалхосте, правда?
                        да, но может понадобиться если ты решишь поделиться с кем-то. С svn это будет сложнее, а с гитом просто добавишь ремоут в пустой удаленный реп и push --force.

                        У svn же ревизионирование на уровне коммитов, а не файлов (как у cvs/rcs?).
                        Если да, то я согласен что это имеет некоторый смысл.

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

                        Зато бранчеваться у гита проще;)
                        Ответить
                        • Поделиться чем? Выложить в инет историю коммитов? Она нахуй никому не нужна. А если вдруг - спокойно гуглится клонирование репозитория (на цели нужны админ права, кстати).
                          Бранчеваться на локалхосте?
                          >У svn же ревизионирование на уровне коммитов, а не файлов (как у cvs/rcs?).
                          Естественно
                          Ответить
                          • > бранчеваться на локалхосте
                            Вай нот? Хотя можно и тупо скопировать каталог.
                            Ответить
                            • Для этого надо знать как работать с бранчами, а разработчик на локалхосте этого может и не уметь.
                              Ответить
                              • Senior Localhost Developer
                                Ответить
                              • Разработал твой локалхост, проверь.
                                Ответить
                              • >>Для этого надо знать как работать с бранчами, а разработчик на локалхосте этого может и не уметь.

                                А кто такой " разработчик на локалхосте"?

                                Человек, чьи веб-приложения работают только на его локалхосте?
                                Ответить
                                • На локалхосте бекапят свои утильки из одного файла или всякую хуету падсибя, разрабатываемую в одно рыло.
                                  Ответить
                                  • ну окей, я написал Оче Полезную Утильку которая мне заказывает пиво через Интернет.

                                    Затем я хочу научить ее еще и пиццу заказывать, но это работы на 4 дня.

                                    Если я буду писать прямо в главном бранче то я сломаю утилку. Как-бы мне сделать так, чтобы работу можно было вести как-бы параллельно, не ломая мастер и не теряя изменения?

                                    Придумал! Мне нужен фича бранч
                                    Ответить
                                    • Ни разу не было нужно.
                                      Ответить
                                      • А ты знаешь что это такое?
                                        Или пока не было необходимости узнавать>?
                                        Ответить
                            • >> Хотя можно и тупо скопировать каталог.

                              Чтоб тебе потом мерджить, ребейзить и черрипикать из шести папок сразу
                              Ответить
                          • >>Поделиться чем? Выложить в инет историю коммитов?
                            да, с бранчами

                            >>спокойно гуглится клонирование репозитория

                            да, но с гитом проще

                            >>Бранчеваться на локалхосте?
                            а что такого?

                            Там где-то есть такое место:
                            BOOL branch(BOOL localhost) {
                              if (localhost) {
                                 return 0;
                             }
                            }

                            ?
                            Ответить
    • > arr[row_count-1] = NULL;
      > delete arr[row_count-1];

      Интересно, догадается ли компилятор оптимизировать? (выкинуть delete)
      Ответить

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