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

    +6

    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
    21. 21
    22. 22
    23. 23
    #include <iostream>
    
    using std::cout;
    using std::endl;
    
    auto power(double x, int n)-> double*;
    
    int main()
    {
    	void * c = power(5,2);
    
    	std::cout << *(double*)c << std::endl;
    
    	return 0;
    }
    
    auto power(double x, int n)-> double* 
    { 
    	double* result(new double(1.0));
    	for(int i = 1; i <= n; i++)
    	*result *= x;
    	return result;
    }

    Запостил: taburetka, 21 Августа 2013

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

    • auto double power megatron assemble!
      Ответить
    • Кэп помоги!
      Ответить
      • Он в отпуске
        Ответить
      • Я не кэп, рад бы был помочь, но, увы, не знаю в чем тут дело - самому интресно

        Сделаю пару предположений
        1. Auto
        Auto - аналог шарповского Var - никогда не видел в контексте объявления функций - ну да я с плюсами почти не работал, может все норм.
        2. void * c = power(5,2);
        Таки почему ссылка на void, а потом конвертация в double?
        Ответить
        • >Auto - аналог шарповского Var - никогда не видел в контексте объявления функций
          Таки используется для объявления возвращаемого типа. В основном в шаблонных функциях если возвращаемый тип зависит от типов параметров
          Ответить
      • > Таки почему ссылка на void, а потом конвертация в double?
        1. Какого хрена вообще double*, а не просто double.
        2. Функция возвращает double*, зачем его туда-сюда кастовать через void * - непонятно.
        3. Тип результата не зависит от типа аргументов, declspec не юзается - авто не нужно.
        4. Утечка памяти, выделенной в строке 19.
        5. Неэффективный алгоритм возведения в степень, имеющий сложность О(n).
        6. Нет отступа в строке 21.

        Достаточно? :)
        Ответить
        • >Неэффективный алгоритм возведения в степень, имеющий сложность О(n).

          А как выглядит эффективный?

          что то такое?
          while (pow>1)
                      {
                          x = (x*x) * (x*(pow%2));
                          pow /= 2;
                      }


          Это так, навскидку
          Ответить
          • Блин, пишу бред, а удалить нельзя)
            Ответить
          • Тип того.
            while (pow > 0) {
                if (pow % 2) // if (pow & 1)
                    result *= x;
                pow /= 2; // pow >>= 1;
                x *= x;
            }
            > Блин, пишу бред, а удалить нельзя)
            Да почему бред, почти попал же ;)
            Ответить
            • Рекурсивно на шарпике (хотя рекурсия не желательна, я знаю)
              int InPow(int x, int pow)
                      {
                          return (pow == 1) ? x : InPow(x*x, pow>>1)*((pow&1)==0?1:x);
                      }
              Ответить
              • При pow == 0 повиснет, если не туплю :)
                Ответить
                • да, повиснет. ибо я писал с расчетом pow=>1

                  фикс

                  int InPow(int x, int pow)
                  {
                  return (pow == 0) ? 1 : InPow(x * x, pow >> 1) * ((pow & 1) == 0 ? 1 : x);
                  }
                  Ответить
                  • Хвостовая рекурсия (есть вероятность, что компилятор оптимизнет ее в цикл):
                    int InPow2(int x, int pow, int result) {
                        return pow == 0 ? result : InPow(x * x, pow >> 1, result * ((pow & 1) == 0 ? 1 : x));
                    }
                    int InPow(int x, int pow) {
                        return InPow2(x, pow, 1);
                    }
                    Ответить
        • Это какое-то синтетическое говно, почему его плюсуют?
          Оно даже на лабу не тянет.
          Ответить

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