Страница 1 из 1

Указатели, не могу разобраться

Добавлено: 02 мар 2011, 20:55
Soundkilla
Есть такой код, матрицу беру из файла, при вычислении определителя вылазит систем эксепшн, дебаггер ругается на что-то в 20ой строчке, я думаю, что напутал с указателями. Не могли бы помочь исправить ошибку (возможно, не правильно считаю определитель?), и подсказать, как добавить вычисление сумм элементов главной, и 2ух диагоналей под главной? Спасибо.

Код: Выделить всё

#include "stdafx.h"
#include <stdio.h>
#include <math.h>
 

int * Minor(int *a,int n, int i,int j)
{
	if (n<=1) return a;
	else
	{int **mass = new int *[n-1];
	for(int k=0; k<n-1;k++)
	{
		mass[k] = new int[n-1];
	}

	for(int k = 0; k<n;k++)
	{
		for(int l = 0; l<n;l++)
		{
			if(l!=j || k!=i) mass[k][l] = a[k*(n-1)+l];
		}
	}

	return *mass;
	}
}

double Det(int *a, int n, int i, int j)
{
	double res = 0;
	double p=-1;
	for(int k=0; k<n;k++)
	{
		res+=a[k*n]*pow(p,i+j)*Det(Minor(a,n,i,j),n,i+1,j);
	}
	return res;
}


int main()
{
	int n = 0;
	int m = 0;

	//открываем файл
	FILE * fp = fopen("matrix.txt", "r");
	if (fp)
	{
		fscanf(fp,"%d %d",&n,&m);
	}
	else return 0;

	int **a = new int *[n];
	for(int i = 0; i<n;i++)
	{
		a[i] = new int[m];
	}

	for(int i = 0; i<n;i++)
	{
		for(int j = 0; j<m;j++)
		{
			fscanf(fp,"%d",&a[i][j]);
		}
	}

	fclose(fp);

	for(int i =0; i<n;i++)
	{
		for(int j =0; j<m;j++)
		{
			printf("%d\t",a[i][j]);
		}
		printf("\n");
	}	


	printf("\n %d \n", Det(*a,n,0,0));

	//return 0;
}
Прошу помочь, завтра сдавать(

Re: Указатели, не могу разобраться

Добавлено: 03 мар 2011, 09:01
Albor
Поставь точку останова в эту строчку и проверь куда указывают указатели. Скорее всего либо указатель нулевой, либо указывает на недоступную память. На будущее: считать 20-ю строчку ни кто не будет. Можно было бы добавить в неё комментарий.

Re: Указатели, не могу разобраться

Добавлено: 03 мар 2011, 09:31
BBB
Например, сомнения вызывают следующий момент.
mass выделяется размером n-1 (new int *[n-1]) (т.е. корректные значения индекса массива - от 0 до (n-2)).
Каждый элемент mass также указывает на массив размерностью n-1 (new int[n-1]).
Но в то же время в цикле идет обращение к mass[k][l], где переменные цикла k и [/b]l[/b] меняются от 0 до (n-1). Т.е. налицо при обращении к массиву выход за диапазон значений индекса массивов.

Кроме того, вы выделяете память (вызов new), но нигде ее впоследствии не освобождаете. Дурной тон-с :)