Os pongo en situacion. Estoy intentando hacer un procedimiento con el cual, pasandole como parametro una matriz, me halle el determinante de esa matriz. Los casos basicos ya los tengo, que la matriz no sea cuadrada, sea de rango uno o sea de rango dos. Pero si el rango pasa de 3 ya me da error de ejecucion. Ma da el siguiente error:
Error durante ejecucion escribió:cm0151:~/Desktop/Programacion DSurf$ ./a.out
Filas de la matriz: 3
Columnas de la matriz: 3
Escribe los numeros de la matriz: 3
Escribe los numeros de la matriz: 5
Escribe los numeros de la matriz: 6
Escribe los numeros de la matriz: 2
Escribe los numeros de la matriz: 9
Escribe los numeros de la matriz: 76
Escribe los numeros de la matriz: 54
Escribe los numeros de la matriz: 32
Escribe los numeros de la matriz: 12
Determinante = Segmentation fault
Marcado en negrita podeis ver el error q me da.
Os paso el codigo q tengo hecho para q le echeis un vistazo, a ver si me podeis ayudar.
PROGRAM Matriz (INPUT, OUTPUT);
{$ extended-pascal}
TYPE
tArray (Fila, Colum: INTEGER) = ARRAY [1..Fila, 1..Colum] OF REAL;
tpArray = ^tArray;
VAR
Matriz1, Matriz2: tpArray;
PROCEDURE ObtenerLongMatriz (VAR Matriz: tpArray);
VAR
Filas, Colum: INTEGER;
BEGIN
WRITE ('Filas de la matriz: ');
READLN (Filas);
WRITE ('Columnas de la matriz: ');
READLN (Colum);
new (Matriz, Filas, Colum);
END; {Fin procedimiento Obtener longitud matriz}
PROCEDURE ObtenerNumMatriz (VAR Matriz: tpArray);
VAR
contFila, contColum: INTEGER;
BEGIN
FOR contFila := 1 TO Matriz^.Fila DO
FOR contColum := 1 TO Matriz^.Colum DO BEGIN
WRITE ('Escribe los numeros de la matriz: ');
READLN (Matriz^ [contFila, contColum]);
END;
END;{Fin procedimiento Obtener numeros matriz}
PROCEDURE Det (PROTECTED VAR Matriz: tpArray);
FUNCTION Determinante (PROTECTED VAR Matriz: tpArray; Rango: INTEGER): REAL;
VAR
contFila, contColum, Ncolum: INTEGER;
esc1, esc2, esc3, esc4, esc: REAL;
deter: REAL;
MatrizAux: tpArray;
BEGIN
IF (Matriz^.Fila = 2) AND (Matriz^.Fila = 2) THEN
BEGIN
esc1 := Matriz^ [1,1];
esc2 := Matriz^ [2,2];
esc3 := Matriz^ [1,2];
esc4 := Matriz^ [2,1];
Determinante := (esc1 * esc2) - (esc3 * esc4);
END {Fin del IF}
ELSE
BEGIN
deter:= 0;
FOR Ncolum:= 1 TO Rango DO
{ A continuacion meto en la Matriz Auxiliar (MatrizAux)
los valores que quedan eliminando la fila y la columna
correspondientes de la Matriz principal (Matriz1) }
FOR contFila := 2 TO Rango DO BEGIN
FOR contColum := 1 TO (Ncolum - 1) DO
MatrizAux^ [contFila - 1, contColum] := Matriz^[contFila, contColum];
FOR contColum := Ncolum + 1 TO Rango DO
MatrizAux^ [contFila - 1, contColum - 1] := Matriz^[contFila, contColum];
END;{Fin del FOR}
IF (1 + Ncolum) MOD 2 = 0 THEN { Con este IF-ELSE }
contFila := 1 { averiguamos el signo }
ELSE { de complementario }
contFila := -1;
esc := Matriz^ [1, Ncolum];
deter := deter + contFila * esc * determinante (MatrizAux, Rango - 1); {Llamada recursiva de la funcion}
determinante := deter;
END; {Fin del ELSE}
END; {Fin FUNCION Determinante}
VAR
Rango: INTEGER;
MatrizAux: tpArray;
BEGIN
IF (Matriz^.Fila > 1) AND (Matriz^.Fila = Matriz^.Colum) THEN
BEGIN
Rango := Matriz^.Fila;
WRITELN ('Determinante = ', Determinante (Matriz, Rango):2);
END
ELSE IF (Matriz^.Fila = 1) AND (Matriz^.Colum = 1) THEN
WRITELN ('El determinante vale: ', Matriz^ [1,1]:2)
ELSE
WRITELN ('La matriz no es cudrada');
END; {Fin PROCEDIMIENTO Det}
BEGIN
ObtenerLongMatriz (Matriz1);
ObtenerNumMatriz (Matriz1);
Det (Matriz1);
END.
Salu2