1. Си / Говнокод #6720

    +129

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    temp = (NODE *)malloc(sizeof(NODE));
          if (temp == NULL)
          {
            Free(temp);
            Free(task);
            return NULL;
          }

    Курсовик ночью по пьяни. Подстраховался блин.

    Запостил: Enelar, 20 Мая 2011

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

    • Ой ой, сьехал отступ, простите.
      Ответить
      • это баг здешнего пхп
        Ответить
        • А почему ты так относишься к php? Как язык он очень даже ничего. Дело вообще не в php, а в некоторых людях, которые говнокодят программируют на нём.
          Ответить
          • Чёрт, говнокодят
            Ответить
          • Дело в том, что этих некоторых недолюдей - 99,5% и пых им потакает. Говно в лердорфе и двух евреях
            Ответить
          • пхп - говно патамучто там нет СТЛ
            Ответить
            • СТЛ - говно, потому что его нет в пхп!
              Ответить
              • нет STL говно, потому что это стандартная библиотека C++
                Ответить
                • а C++ говно, поэтому я им люблю обмазываться и дрочить

                  PS: ОП ХУЙю
                  Ответить
                • Ты случайно не я?
                  Ответить
                  • О, Тарас, докажи пожалуйста в треде 6700, что я это не ты.
                    Ответить
                    • Докажи мне и Тарасу, что я — это не ты.
                      И что ты — не ТарасБ.

                      Блять, запутался.
                      Ответить
                      • Я докажу тебе, что я это не ты и ты - Тарас.
                        Ответить
                        • латентный тарас
                          Ответить
                        • Было бы интересно частичное доказательство, что он Тарас, а ты это он.
                          Ответить
                          • двоечник, частное доказательство.

                            это - стадия отрицания собственного тарасизма, часто проявляется в виде крайней тарасофобии.
                            Ответить
                      • доктора позовите кто-нибудь...
                        Ответить
    • Чёрт, говнокодят
      Ответить
    • Тут одна первая строчка уже за версту попахивает: ненужное приведение типа, плюс совершенно не оправданное использование типа под 'sizeof'. В разы осмысленнее было бы
      temp  =  malloc(sizeof *temp)


      и никаких лишних ссылок на имена типов.
      Ответить
      • Что вы говорите. А вы warning level 4 поставьте, и сразу станет нужным.
        Такое использование sizeof не встречал и на лекциях не обьяснялось. На первый взгляд выглядит дико, особенно в ситуациях temp == NULL
        Ответить
        • Аргумент 'sizeof' не вычисляется, поэтому чему изначально равно 'temp' никакой роли не играет.

          То, что оно вам "выглядит дико" - плохо. Вышеприведенный вариант - хорошо известная, общепринятая и повсеместно использующаяся идиома. Очень жаль, что вас на лекциях вместо этого учат таким вещам, как приведение типа результата 'malloc' и тупое засорение кода программы именами типов.

          (Приведение результата 'malloc' - это уже, кстати, со всех сторон разобранная классика говнокодирования. Казалось, что каждый пионер знает, что нельзя приводить результат 'malloc'. А нет...)

          Насчет warning level 4 - недоумеваю. Приведение 'void *' к любому объектному указательному типу - фундаментальная фича языка C и любой компилятор, который на это осмелится выдавать варнинг, будет тут же высмеян с рынка под фанфары. Догадываясь, что речь идет о VS, попробовал выставить в VS2010 warning level 4. Никаких варнингов не получил. Как же вы там умудряетесь на это варнинги получать?
          Ответить
          • Точно, моя вина. Дело в том что уже 2 года пишу на спп(или пытаюсь?), а программы принимают только на си.
            Ответить
          • спасибо, Профессор!
            Ответить
      • не велика потеря что так лазить править
        NODE *temp = malloc(sizeof(NODE));
        на
        что то новое *temp = malloc(sizeof(что то новое));
        что на
        что то новое *temp = malloc(sizeof(*temp));
        все равно придется все эти места просматривать если не юзать что то типа
        typedef sometype1 NODE;
        typedef sometype2 NODE;
        если так то тогда похрен имя типа или нет там написано
        переопределил и забил
        Ответить
        • А почему вообще не рекомендуется использовать маллок так как я делаю?
          Ответить
        • Дело не в том, что может поднадобиться "лазить править", а в том, что весь инет забит нытьем от пионеров, делающих какое-нибудь
          double *p = (double *) malloc(n * sizeof(double *));

          и потом возникающих с идиотскими вопросами типа "почему мой код падает, я ведь все правильно делаю".

          Когда им объясняют, что "звездочка не нужна" и должно быть 'sizeof(double)', они начинают петь песни о том, что вот это
          double **pp = (double **) malloc(n * sizeof(double **));

          у них "всегда работало и сейчас работает, несмотря на лишнюю звездочку" (и т.п.)

          Вот если бы им втолковывали сразу, что все вызовы 'malloc' должны выглядеть так
          p = malloc(n * sizeof *p);

          и никаких множественных звездочек и имен типов - тогда и шлака этого было бы на порядки меньше.
          Ответить
          • Сегодня спросил у учителя, он сказал что использовате sizeof от типа в malloc оправданно, а использовать переменную дерьмокод.
            Ибо так приходится лезть и смотреть какого типа переменная.

            А то что ноют пионеры - это их проблемы. Мы же под блондинок стандарты не подгоняем.
            Ответить
            • >Ибо так приходится лезть и смотреть какого типа переменная.
              Зачем/куда/кому лезть?
              Ответить
              • сравните
                malloc(sizeof(id) + sizeof(name)+ sizeof(date) + sizeof(temp));
                malloc(sizeof(int) + sizeof(char *) + sizeof(timestamp) + sizeof(long));
                Пример - работа с сетью генерация разных макак.
                Ответить
                • первая макака человекообразна
                  Ответить
                • Муть какая-то... Это в каком же контексте может понадобиться такая сумма? "Работа с сетью генерация разных макак" - это не объяснение.
                  Ответить
                  • когда не умеют объявлять и паковать структуры, например
                    Ответить
                  • честно - не знаю. трудно сходу придумать пример где лучше типы юзать.
                    Ответить
            • Да, если написать тип, обычно получается информативнее.
              По всем остальным критериям на качество кода - не влияет. В принципе, допустим любой вариант.
              А поменять тип (не переименовать) - проектировать систему надо нормально.
              Ответить
              • правильнее брать sizeof от переменной, а не повторяться дважды с sizeof(type)
                Ответить
            • Что-то ваш учитель несет какой-то ярко выраженный бред сивой кобылы. Все с точностью до наоборот: именно в варианте с 'sizeof(type)' надо лезть и смотреть, какого типа данные мы аллоцируем. Да еще и звездочки тщательно подстчитывать, если их там несколько. А вот вариант c 'sizeof *pointer' - типонезависим, т.е. некуда лезть не надо и ничего смотреть не надо. И этот принцип - максимальная типонезависимость - это один из фундаментальных принципов написания качественного кода.

              Типы используются только в декларациях. Исполняемый же код (читай: алгоритмы) должен реализовываться настолько типонезависимым образом, насколько это возможно. Вот это надо было бы втолковать вашему "учителю"... Хотя, конечно, надежды мало.
              Ответить
          • Я бы написал так, потому что это наиболее очевидно:

            double *p = malloc(n * sizeof(double));

            Я безнадёжен?
            Ответить
            • Да, безнадежен.

              Тогда уж и каст надо было оставить - для пущей очевидности
              double *p = (double *) (double *) (double *) (double *) malloc(n * sizeof(double)); /* allocating an array of `double` */

              Ответить
              • Каст здесь явно не нужен, так что мимо.

                Другой вопрос - чем явное указание типа в sizeof хуже, чем неявное? При условии, что код уже написан и типы переменных меняться не будут.
                Ответить
              • оптимизировать вас не учили?
                double *p = (double *)0, (double *) malloc(n * sizeof(double));
                Ответить
    • if (temp == NULL)
      {
        Free(temp);

      Может я чего-то не понимаю, но не должно ли это вызвать "double free or corruption" ?
      Ответить
      • Вообще, стандартный free(NULL) совершенно корректен и просто ничего не делает.
        Ответить
        • Да, а к тому же это Free, т.е моя функция.

          Блин представил себя программой. Приходит SIGSEGV и говорит. "double free or corruption".))
          Ответить
    • Будет, круто, если у NODE есть конструктор
      Ответить
    • показать все, что скрытоСи — говно.
      Ответить
    • показать все, что скрытососите хуи говнокодеры
      пхп РУЛИТТТ
      Ответить
      • да вобще ничего лучше ПХП не придумали! вот я на пхп даже хакерские проги пишу с лохов ломаю
        Ответить
        • А я люблю обмазываться несвежим пхп и дрочить.
          Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

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