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

    +111

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    double f_x (double x, double y, int nom)
    {
      double f_x[]={x+y, x*y, x*y, sqrt(x*x + y*y), cos(x)/sin(y)};
      return f_x[nom];
    }

    Нужна одна из функций :-)

    Запостил: Goga, 01 Июля 2010

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

    • Однако. Такого ещё не видел. Но лучше конечно 4 разных функции. А ещё лучше - вообще без функций.
      Ответить
      • да, особенно считать каждый раз клево
        Ответить
        • Особенно использовать эту хрень в программе для построения графиков или итеративных численных методов, когда надо посчитать более 9000 значений.
          Давайте до кучи в массив функцию Бесселя воткнём, чтобы ещё тормознее было.
          Ответить
    • Угу, порадовалсо :)
      Тут бы enum какой-нибудь для int nom не помешал бы ишшо.
      Скромно умолчим о случае y == 0
      Ответить
      • и так же промолчим когда nom<0 || nom>4
        Ответить
      • Я конечно с флоатами не работаю, но что не так когда y==0? (естественно не принимая в расчет кривость конструкции).
        Ответить
        • >Я конечно с флоатами не работаю ...
          А с тригонометрией работаете ?
          Ответить
          • Тьфу, точно, синус нуля это ноль, да позор на мои тапочки, с косинусом перепутал.
            Извините за беспокойство.
            Ответить
    • круто!
      я бы пошел дальше:
      void func2() {
        printf("f2");
      }
      
      void func1() {
        printf("f1");
      }
      
      void* get_func(int index) {
         void (*func[2])() = {&func1, &func2};
         return func[index];
      }
      
      int main() {
         void (*func)();
         func = get_func(1);
         func();
      }


      Взял такой функцию по индексу -- и вызвал.
      Ответить
      • Ну, массивы указателей на функции — это классика. Когда с переменным числом аргументов, вообще наступает полный... э... промискуитет.
        Я вот у нас в проекте вырвиглазные свичи на тысячи строк все намереваюсь переписать через хитромудрые хендлеры. Результатом обязательно поделюсь!
        Ответить
        • > Когда с переменным числом аргументов, вообще наступает полный... э... промискуитет

          Если у функций разные сигнатуры - то я особо смысла не вижу, зачем нужен массив таких совершенно разных функций. Ведь такие массивы делаются для своего рода полиморфизма. А если у функций разные типы - зачем это? Нет смысла их обобщать. Или что?
          Ответить
          • Ну, в принципе, можно их привести к одной гребенке, сделать какую-нибудь структуру юнионов структур. Делают, в принципе, по сути своей одно и то же — обрабатывают данные, разнокалиберные, в зависимости от, скажем, типа сообщения.
            Тут не до жиру, коду больше 10 лет и от внутренней структуры там уже ничего не осталось, спастись для начала хочется от функций на тысячи строк и 10-кратной вложенности конструкций.

            PS. У меня-то емакс бегает по конструкциям, а кто-то до сих пор пишет комментарии у закрывающих скобок. Вот, кстати, один из признаков говнокода — комментарии типа «А вот эта скобка относится к тому ифу — ну да, конечно вы про него забыли, он был в прошлой серии»
            Ответить
            • Ну я подобное делаю свитчами + varargs.
              Ответить
            • >>«А вот эта скобка относится к тому ифу — ну да, конечно вы про него забыли, он был в прошлой серии»

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

          В мире ООП это называлось бы "стратегией":)
          Ответить
    • Ещё можно массив указателей на функции сделать, и чтобы внутри вызывалась f[Num].
      А вообще говнецо оригинальное, такого тут ещё не было.
      _____
      Блин, сначала пост написал, а потом http://govnokod.ru/3620#comment37041 прочитал.
      Ответить
      • .
        Ответить
      • >> А вообще говнецо оригинальное, такого тут ещё не было.

        Я еще и не так могу, когда голодный или испуганный
        Ответить
    • Да, учитывая что sqrt/cos/sin не самые быстрые на свете функции, глупо их пересчитывать каждлый раз.
      Ответить
      • Ну что поделаешь... Студенты и школьники часто себя так ведут на лабах и уроках информатики...
        Ответить
    • что только говнокодеры не придумают, лишь бы ленивые функциональные языки не изучать
      Ответить
      • Точняк, может просто автор недавно пересел с ФЯ, потому такая фигня.
        Ответить
        • Нифига, первокурсег :-)
          Ответить
          • Значит он типа в душе функциональщик и надо срочно учить его хацкелу, чтобы его задатки не пропали зря.
            Ответить
            • >> Значит он типа в душе функциональщик и надо срочно учить его хацкелу, чтобы его задатки не пропали зря.

              блин, мою судьбу предрекли... Игорь Николаевич, это ж на основе моего прошлогоднего перла с программой для численного интегрирования делалось... Так что авторство сего говнокода беру на себя
              Ответить
    • Если уж быть совсем точным, то в "классическом" стандартном Си запрещается такая инициалиация. В аггрегатном инициализаторе разрешается использовать только константы времени компиляции. С99 такой номер пройдет, но не в С90.
      Ответить

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