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

    +49

    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
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    #include <stdio.h>
    #include <math.h>
    #include "determinant.h"
    
    double det(double **matrix, int size)
    {
        if(size==2)
        {
            return matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];
        }
        else if(size==1)
            {
                return matrix[0][0];
            }
        int result = 0;
        for(int j=0; j<size; j++)
        {
            if(matrix[0][j]!=0)
            {
                result+=matrix[0][j]*(unsigned)pow(-1.f,(unsigned)j)*det(minor(matrix, size, 0, j), size-1);
            }
        }
        return result;
    }
    
    double **minor(double **matrix, int size, int str, int col)
    {
        double **minor=new double *[size-1];
        int m_str = 0;
        int m_col;
        for(int i=0; i<size; i++)
        {
            if(i!=str)
            {
                m_col = 0;
                minor[m_str]=new double[size-1];
                for(int j=0; j<size; j++)
                {
                    if(j!=col)
                    {
                        minor[m_str][m_col]=matrix[i][j];
                        m_col++;
                    }
                }
                m_col++;
            }
        }
        return minor;
    }

    Считаю определитель рекурсией, во время теста в этом сорце вылетает ошибка EXC_BAD_ACCESS(code=1, access=0x8),
    после одного прохода рекурсии, с чем это связано? Помогите разобраться :)

    Запостил: aesc_smirnov, 07 Декабря 2014

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

    • > EXC_BAD_ACCESS(code=1, access=0x8)
      Кто-то сказал "Xcode"?
      Ответить
    • А вообще 0x8 намекает на обращение к полю NULL'овой структуры.
      // КОДНЕЧИТАЙСРАЗУОТВЕЧАЙ
      Ответить
    • Этот код течет как сучка... Не стоит без причины и опыта заниматься ручным управлением памятью, юзай контейнеры типа std::vector.

      А краш из-за строки 45 скорее всего.

      P.S. Лабы и вопросы по ним на ГК не нужны.
      Ответить
      • > std::vector
        minor может спокойно возвращать и указатель на std::vector<std::vector<double> >, который никто не удалит.

        P.S. Автору: ну и гурман же!
        > int result
        > (unsigned)pow(-1.f,(unsigned)j)
        Ответить
        • На самом деле, метод с минорами не имеет никакого смысла. Такая же факториальная сложность, как и у наивной суммы произведений + оверхед от копирования или вьюх.

          P.S. Ну разве что если кешировать определители миноров.
          Ответить
          • Гаусса подключай @ "только" кубическую сложность получай
            Ответить

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