Operacje ma macieRZach RTE

0

Witam, dostałem na zadanie napisać program w ANSI C który będzie wykonywał operacje dodawania mnożenia lub potęgowania macierzy.

Program na przykładowym teście działa ok, ale dla innych już mi nie znanych wywala Runtime error:

 
6
ADD
1 1 //rozmiar macierzy 1
3
1 1 //rozmiar macierzy 2
5
ADD
3 2
1 2
3 4
1 1
3 2
3 3
3 3
2 2
MULTIPLY
2 3
1 1 1
1 1 2
3 3
3 3 1
3 3 1
2 2 1
MULTIPLY
2 2
1 1
1 1
3 2
3 3
3 3
3 3
POWER 4 // 4 znaczy, że do 4 potęgi
2 2
3 3
3 3
POWER 8
2 3
1 2 1
3 1 2

Oto mój kod:

#include <stdlib.h>
#include <stdio.h>


int** load (int *m, int *n)
{
    int i,j;
    scanf ("%d %d", &(*m), &(*n));

    int **A = (int**) malloc( (*m) * sizeof (int) );

    for (i = 0; i < *m; i++)
    {
           A[i] = (int*) malloc ((*n) * sizeof (int));

            for (j = 0; j < *n; j++)
            scanf ("%d", &A[i][j]);
    }
return A;
}


void DISPLAY (int **C, int m, int n)
{
    int i, j;

    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        printf ("%d ", C[i][j]%1000);

     printf ("\n");
    }
}


void FreeMemory (int **A, int m)
{
    int i;

		if (A != NULL)
	{
		for (i = 0; i < m; i++)
			free (A[i]);
		free(A);

	}

}

void ADD (int **A, int **B, int m, int n)
{
    int i, j;

    for (i = 0; i < m; i++)
       {
        for (j = 0; j < n; j++)
            printf ("%d ", (A[i][j] + B[i][j])%1000);


    printf ("\n");
       }
}

int** MULTIPLY (int **A, int **B, int m, int n, int m1, int n1)
{

    int i, j, k;

    int **C = (int**) malloc( (m) * sizeof (int) );

    for (i = 0; i < m; i++)
           C[i] = (int*) malloc ((n1) * sizeof (int));


               for (i = 0; i < m; i++)
                    for (j = 0; j < n1; j++)
                        C[i][j] = 0;



            for (i = 0; i < m; i++)

                for (k = 0; k < n; k++)

                    for (j = 0; j < n1; j++)
                        C[i][j] += A[i][k] * B[k][j];
return C;
}




int ** POWER (int** A, int m, int p)
{
    int i,j;


    int **W = (int**) malloc( (m) * sizeof (int) );

    for (i = 0; i < m; i++)
           W[i] = (int*) malloc ((m) * sizeof (int));

    for (i = 0; i < m; i++)
        for (j = 0; j < m; j++)
            W[i][j] = 0;


    for (i = 0; i < m; i++)
        W[i][i] = 1;



    while ( p > 0)
    {
        if (p % 2 == 1)
                W = MULTIPLY(W, A, m, m, m, m);
        p = p / 2;

        A = MULTIPLY(A, A, m, m, m, m);
    }


return W;
}



int main ()
{
    char command[10];
    int p, z, i;

    scanf ("%d",&z);

    for (i = 0; i < z; i ++)
    {

            scanf ("%s",command);

            if (command[0] == 'P')
                scanf ("%d", &p);



            int m, n;
            int **A = load(&m, &n);



        //*********ADD*******//
            if (command[0] == 'A')
            {
                int m1, n1;
                int **B = load(&m1, &n1);

                if (m != m1 || n != n1)
                    printf ("ERROR");
                else
                ADD(A, B, m, n);

                FreeMemory (B, m);
            }



        //*********MULTIPLY********//
            if (command[0] == 'M')
            {

                int m1, n1;
                int **B = load(&m1, &n1);


                if (n != m1)
                    printf ("ERROR\n");
                else
                {
                    int **C = MULTIPLY (A, B, m, m1, n, n1);

                    DISPLAY (C, m, n1);

                    FreeMemory (C, m);
                }

                    FreeMemory (B, m);
            }



        //*********POWER********//
            if (command[0] == 'P')
            {
                if (m == n)
                {
                    int** C = POWER (A, m, p);
                    DISPLAY(C, m, m);
                    FreeMemory (C, m);
                }
                else
                printf ("ERROR\n");

            }

            FreeMemory (A, m);


    }

    return 0;
}

 

Proszę o pomoc w znalezieniu błędu, pozdrawiam i z góry dziękuję.

0

Znalazłem bład, przy dużej ilości sekwencji ilość pobieranej pamięci rośnie, co świadczy o tym, że chyba moja funkcja delokowania pamięci nie działa poprawnie, czy mógłby się ktoś przyjrzeć funkcji FreeMemory?

1 użytkowników online, w tym zalogowanych: 0, gości: 1