[Pragramacion/Pascal] Problema con un procedimiento

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
0 respuestas