Определитель матрицы C ++ / распределение памяти

Я пытаюсь написать матричный определитель функции в C ++. Однако мой код не компилируется и не знаю почему (я использую онлайн-компилятор c ++, а сообщения об ошибках я вижу «* Ошибка в `/var/www/service/usercode/519646917/a.out ‘: free (): неверный следующий размер (быстрый): 0x00000000019c1180 * «). Кажется, проблема в функции Free.

Может кто-нибудь сказать мне, что не так в моем коде?

заранее спасибо
С уважением

    #include <iostream>
#include <cmath>
#include <fstream>
#include <vector>
#include <numeric>
#include <iterator>
#include <map>
#include <string>

//C++ clang

using namespace std;

void Free(double** a, unsigned int n)
{
if (a!=NULL)
{
for (unsigned int j=0 ; j<n ; j++)
{
delete[] a[j];
}
delete[] a;
}
}

double mDeterminant(double** a, unsigned int n)
{
if (n==1)
{
return a[0][0];
}
else if(n==2)
{
return a[0][0]*a[1][1]-a[0][1]*a[1][0];
}
else
{
double res=0.0;
for (unsigned int i=0 ; i<n ; i++)
{double** A=new double*[n-1];
for (unsigned int j=0 ; j<n-1 ; j++)
{
A[j]=new double[n-1];
}

for (unsigned int j=1 ; j<n ; j++)
{
unsigned int g=0;
for (unsigned int k=0 ; k<n ; k++)
{
if (k!=i)
{
A[j-1][g]=a[j][k]; g++;
}
}
}

res+=a[0][i]*pow(-1, i)*mDeterminant(A, n-1);
Free(A,n-1);
}
return res;
}

}

int main()
{
unsigned int N=4;
double** a=new double*[N];
for (unsigned int i=0 ; i<N ; i++)
{
a[i]=new double[N];
}

for (unsigned int i=0 ; i < N ; i++)
{
for (unsigned int j=0 ; j < N ; j++)
{
a[i][j]=(1+i)*(2+j-i);
cout << a[i][j] << ";";
}
cout << endl;
}cout << "----------------------------------" << endl;
cout << "mDeterminant = " << mDeterminant(a, N) << endl;

}

-1

Решение

Я полагаю, что единственная ошибка, которая у вас есть (кроме размеров массива ‘a’ в main), связана с местом, где вы определяете g. г должен быть определен здесь:

 for (unsigned int j=1 ; j<n ; j++)
{
unsigned int g= 0;
for (unsigned int k=0 ; k<n ; k++)
{
if (k!=i)
{
A[j-1][g]=a[j][k]; g++;
}
}
}

Что касается других n-1 вещей, я понимаю, что вы имели в виду с ними, и я думаю, что они верны

0

Другие решения

У вас слишком много ошибок:

a[i]=new double; должно быть a[i]=new double[N];,
double** A=new double*[n-1]; должно быть либо double** A=new double*[n]; или петли ниже должны быть до п-1.
A[j]=new double[n-1]; должно быть либо A[j]=new double[n]; или петли ниже должны быть до п-1.
Вот A[j-1][g]=a[j][k]; g++; ваш g выходит за пределы массива. Вы также не освобождаете a массив. Я думаю, что легче переписать ваш код с нуля, на этот раз подумайте о том, что вы делаете.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector