Odwrócenie tablicy dynamicznej o 90 stopni

0

Witam,
mam problem z programem mającym obrócić tablicę dynamiczną o 90 stopni. Program kompiluje się, działa poprawnie, gdy macierz jest kwadratowa, ale przy różnych współrzędnych przy wykonywaniu wyskakuje błąd (w załączniku). Domyślam się, że chodzi o jakiś wyciek pamięci w funkcji dokonującej obrotu, ale nie potrafię określić, w czym problem.

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

void obrot(int i, int j, int r1, int r2, int **tab)
{
    int **b;
    b = (int**)malloc(r1 * sizeof (*b));
    for (i = 0; i < r1; ++i)
    {
        b[i] = (int*)malloc(r2 * sizeof (**b));
    }

    for (i = 0; i < r1; ++i)
    {
        for (j = 0; j < r2; ++j)
        {
            b[i][j] = tab[i][j];
        }
    }

    for (i = 0; i < r1; ++i)
    {
        for (j = 0; j < r2; ++j)
        {
            *(*(tab + j) + i) = b[r1 - 1 - i][j];
        }
    }

    for (i = 0; i < r2; ++i)
    {
        for (j = 0; j < r1; ++j)
        {
            printf("%d\t", tab[i][j]);
        }
        printf("\n");
    }

    for (i = 0; i < r1; ++i)
        free(b[i]);
    free(b);
    b = NULL;
}


int main()
{
    int **a;//macierz 
    int rozmiar1, rozmiar2, i, j;

    srand(time(NULL));
    rozmiar1 = rand() % 7;
    rozmiar2 = rand() % 5;
    printf("wylosowany rozmiar tablicy: %d, %d\n", rozmiar1, rozmiar2);

    a = (int**)malloc(rozmiar1 * sizeof (*a));
    for (i = 0; i < rozmiar1; ++i)
    {
        a[i] = (int*)malloc(rozmiar2 * sizeof (**a));
    }

    for (i = 0; i < rozmiar1; ++i)
    {
        for (j = 0; j < rozmiar2; ++j)
        {
            a[i][j] = rand() % 99;
        }
    }
    printf("kolejne elementy tablicy: \n");
    for (i = 0; i < rozmiar1; ++i)
    {
        for (j = 0; j < rozmiar2; ++j)
        {
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }

    printf("\n");

    obrot(i, j, rozmiar1, rozmiar2, a);

    for (i = 0; i < rozmiar1; ++i)
        free(a[i]);
    free(a);
    a = NULL;

    return 0;

}
 

b85b6c2d70.png

0

Bo sam sobie wykopałeś dół, jak nazwałeś zmienne r1 i r2 to już się pogubiłeś co jest wysokością a co szerokością, pogubiłeś się zanim skończyłeś pisać nagłówek funkcji.
Kolejna sprawa, ale też utrudniająca tobie pisanie, sprawdzenie oraz szukanie błędów: - po kiego przekazujesz do metody i,j ?

  1. Zamień r1 i r2 na Y i X odpowiednio.
  2. Zamień i i j na y i x odpowiednio.
  3. Usuń przekazywanie zbędnych parametrów

Jeżeli po tym wszystkim sam nie zobaczysz błędu, to wklej ten kod tu na jeszcze raz.

0

Przeczytałam dalszą część Twojej odpowiedzi (tę o x i y) już po dodaniu komentarza. Ironia jest niepotrzebna, ja naprawdę chcę to zrozumieć.
Zmieniłam tak, jak mówiłeś, dzieje się to samo co do tej pory.

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

void obrot(int Y, int X, int **tab)
{
    int y, x;
    int **b;
    b = (int**)malloc(Y * sizeof (*b));
    for (y = 0; y < Y; ++y)
    {
        b[y] = (int*)malloc(X * sizeof (**b));
    }

    for (y = 0; y < Y; ++y)
    {
        for (x = 0; x < X; ++x)
        {
            b[y][x] = tab[y][x];
        }
    }

    for (y = 0; y < Y; ++y)
    {
        for (x = 0; x < X; ++x)
        {
            *(*(tab + x) + y) = b[Y - 1 - y][x];
        }
    }

    for (y = 0; y < X; ++y)
    {
        for (x = 0; x < Y; ++x)
        {
            printf("%d\t", tab[y][x]);
        }
        printf("\n");
    }

    for (y = 0; y < Y; ++y)
        free(b[y]);
    free(b);
    b = NULL;
}


int main()
{
    int **a;//macierz
    int rozmiar1, rozmiar2, i, j;

    srand(time(NULL));
    rozmiar1 = rand() % 7;
    rozmiar2 = rand() % 5;
    printf("wylosowany rozmiar tablicy: %d, %d\n", rozmiar1, rozmiar2);

    a = (int**)malloc(rozmiar1 * sizeof (*a));
    for (i = 0; i < rozmiar1; ++i)
    {
        a[i] = (int*)malloc(rozmiar2 * sizeof (**a));
    }

    for (i = 0; i < rozmiar1; ++i)
    {
        for (j = 0; j < rozmiar2; ++j)
        {
            a[i][j] = rand() % 99;
        }
    }
    printf("kolejne elementy tablicy: \n");
    for (i = 0; i < rozmiar1; ++i)
    {
        for (j = 0; j < rozmiar2; ++j)
        {
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }

    printf("\n");

    obrot(rozmiar1, rozmiar2, a);

    for (i = 0; i < rozmiar1; ++i)
        free(a[i]);
    free(a);
    a = NULL;

    return 0;

}

 
0

Nadal nie widzisz tego ostatniego błędu (tym razem konceptualnego) ponieważ w main zostawiłaś idiotyczne nazewnictwo. Takie nazewnictwo to sabotaż własnej pracy.

0

Zostawiając nazewnictwo, czy mógłbyś powiedzieć co właściwie się dzieje, że program nie działa poprawnie? Samo obracanie się dokonuje, co widać na screenie.

0

Chcesz rozumieć czy chcesz gotowe rozwiązanie?

0

Po co mi gotowe rozwiązanie, jeśli nie będę go rozumieć? Po prostu wydaje mi się, że to powinno działać, zresztą samo obracanie działa dobrze przy macierzy kwadratowej, i nie wiem co robię źle

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