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

    +123.5

    1. 1
    printf(" %f %f %f %f %f %f %f %f\n",Xk[0],Xk[1],Xk[2],Xk[3],Xk[4],Xk[5],Xk[6], Xk[7]);

    Рад бы был, если б это написали китайцы. К сожалению, дело рук наших соотечественников.

    Запостил: mkaz, 25 Октября 2009

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

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

      для 8 элементов плодить лишний цикл для вывода тоже не всегда айс. например в такой форме проще дописать названия параметров в выводную строку если они разные для элементов.
      Ответить
      • Соглашусь. У меня как-то выводились кватернионы поворотные, очень удобно одной строкой пользоваться.
        Бывало и говнокодее -- два-три таких printf.
        Подобные выводы, скорее всего, просто отладочные, хочется глазами уследить, что там происходит. А для счёта перекомпилировать, закомментировав вывод.
        Ответить
        • Я вот понимаю, когда в строку пишется 4 элемента. Но не 8. В приведённом случае как раз глазами не уследишь, что там в конце строки происходит. Цикл был бы более гибким решением. И если кодинг идёт в какой-нить более-менее вменяемой среде, то закомментарить это дело - один HOT KEY.
          Ответить
          • в если vim? и во времена широких экранов вся строка видна без проблем..
            Ответить
            • У человека всё равно глаза не как у стрекозы. Длинную строку всю целиком "не осилишь".

              Доведём вашу идею до абсурда и поставим человеку монитор шириной с комнату. И что? Сразу можно писать ВСЮ программу в одну строку?
              Ответить
          • Не соглашусь с вами.

            Типичный printf:

            printf("%.8f %.8f %.8f %.8f %.8f %.8f %.8f %.8f %.5f %d", q[0], q[1], q[2], q[3], q.norm(), fabs(q[1]), fabs(q[2]), fabs(q[3]), rot.angle,rot.madeIter());

            Как такое в цикл?
            А без него у меня всё в точности так, как в командной строке. И переставить легко местами. Захочу, буду рядом выводить q[1] и fabs(q[1]), а захочу и не буду... Всякие циклы, лишние строки, они от дела отвлекают.
            Обычно printf служит именно для быстрой проверки того, что творится внутри кода, а не для красивой записи. То, что в файл, скажем, печатается, ещё может быть определённым образом структурировано для той программы, куда потом отправится, а на экран выводить данные, только чтобы глазом проследить кривую, основные моменты, ошибку отловить.
            Ответить
            • В цикл такое никак. Только в несколько строк.

              Посмотрю я на вас, когда вы случайно поменяете местами выражения разных типов, а команды их форматирования (%d %.8f) забудете. Если не лениться и написать агрегат в несколько строк, то такой проблемы не возникнет. И переставлять легче строки, а не конструкции внутри строки.

              printf прежде всего печатает в консоль. И служит он много для чего. Чем отличается печать отладочных данных от не отладочных? Почему во втором случае разрешается делать говнокод? Непонятно.
              Ответить
              • Написание такого printf у меня происходит на уровне "рефлексов". Я даже не думаю, что пишу. Я пишу и уже вижу столбцы в консоли -- мнемоника. Я отсчитываю слева направо столбики и данные и нахожу ключевые, проблемные имена.
                Я не знаю ни одного живого человека, который бы разбивал такую строку данных на две.
                Уж фортрановцы и подавно всё в одной строке пишут.
                Ответить
              • Да, если перепутать формат и тип данных, то можно ушибиться больно.
                Но со мной это происходило только на младших курсах.
                Ответить
                • Если программа на С++, а не Си, то можно через << (stream) сделать. Там не чего не перепутаешь. А на чистом Си такая проблемка имееться...
                  Ответить
                  • В потоках есть флаги-манипуляторы выводом. Это из части iomanip. Так если под восьмиричный флаг oct вывести число с точкой, то тоже можно попасть в просак.
                    Ответить
    • Жаль, нельзя написать

      float Xk[8] = {...};
      printf(" %f %f %f %f %f %f %f %f\n", Xk);

      ((
      Ответить
      • Грязный, нелегальный хак, возможно, работающий на некоторых компиляторах

        int main()
        {
        struct X{
        double Xk[8];
        } x = {1,2,3,4,5,6,7,8};
        printf(" %f %f %f %f %f %f %f %f\n", x);
        }
        Ответить
        • just грязные фантазии
          Ответить
        • только что проверил, действительно иногда работет)))
          #include <stdio.h>
          #define A 9
          #define B A

          int main()
          {
          int x[]={B,012,11,12};
          printf("%d %d %d %d\n");
          }
          Ответить
    • ахаха, убило)
      Ответить

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