- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 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),
после одного прохода рекурсии, с чем это связано? Помогите разобраться :)
byss 07.12.2014 02:31 # 0
Кто-то сказал "Xcode"?
byss 07.12.2014 02:32 # 0
// КОДНЕЧИТАЙСРАЗУОТВЕЧАЙ
bormand 07.12.2014 10:40 # +2
А краш из-за строки 45 скорее всего.
P.S. Лабы и вопросы по ним на ГК не нужны.
1024-- 07.12.2014 10:47 # +1
minor может спокойно возвращать и указатель на std::vector<std::vector<double> >, который никто не удалит.
P.S. Автору: ну и гурман же!
> int result
> (unsigned)pow(-1.f,(unsigned)j)
bormand 07.12.2014 11:08 # 0
P.S. Ну разве что если кешировать определители миноров.
codemonkey 07.12.2014 11:59 # +2