Dynamiczna tablica-dwuwymiarowa w funkcji ANSI C

0

Cześć, uczę się języka c. Przerobiłem już trochę zadań, ale napotkałem mur, którego nie jestem wstanie przebić.. Mianowicie, chce utworzyć oddzielne funkcje "tworzenie_tablicy", "wypisywanie_tablicy" i "kasowanie". Wiem, że jest to najprawdopodobniej problem z implementacją wskaźników. Wiem, że jest też możliwość, stworzenia wskaźnika na funkcję, ale to już chyba co innego, choć nie pogardzę wiedzą. Jak byłby ktoś wstanie mi pomóc byłoby świetnie :D

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

int tworzenie_tablicy(int n, int m, int **tablica2d)
{
    int i, j;
    srand(time(NULL));
    tablica2d = (int**)malloc(n*sizeof(int*));
    for(i=0; i<n; i++)
    {
        tablica2d = (int*)malloc(m*sizeof(int));
        for(j=0; j<m; j++)
        {
            tablica2d[i][j] = rand()%10;
        }
    }
    return **tablica2d;

}

int wypisywanie_tablicy(int n, int m, int **tablica2d)
{
    int i, j;
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            printf("Tablica[%d][%d] = %d", i, j, tablica2d[i][j]);
        }
    }
    return 0;
}

int kasowanie_tablicy(int n, int m, int **tablica2d){
    int i;
    for(i=0; i<n; i++)
    {
        free(tablica2d[i]);
    }
    free(tablica2d);
    return 0;
}

int main()
{
    int n, m;
    int **tablica2d;
    printf("Podaj n i m:\n");
    scanf("%d\n%d", &n, &m);
    tworzenie_tablicy(n, m, tablica2d);
    wypisywanie_tablicy(n, m, tablica2d);
    kasowanie_tablicy(n, m, tablica2d);
    return 0;
}
2

Kasowanie i wypisywanie wyglądają dobrze (choć typ zwracany zmień na void i nie będziesz musiał zwracać bzdurnej wartości)

tworzenie ma ten problem, że operujesz na kopii wskaźnika: Przekazywanie parametru przez wartość i referencję

Rozwiązaniem jest przekazanie wskaźnika na wskaźnik na wskaźnik (int***), albo - lepiej - zwrócenie wskaźnika do zaalokowanej macierzy z funkcji:

int** tworzenie_tablicy(int n, int m)
{
    int i, j;
    srand(time(NULL));
    int** tablica2d = (int**)malloc(n*sizeof(int*));
    for(i=0; i<n; i++)
    {
        tablica2d[i] = (int*)malloc(m*sizeof(int));
        for(j=0; j<m; j++)
        {
            tablica2d[i][j] = rand()%10;
        }
    }
    return tablica2d;
}
// ...
    int n, m;
    printf("Podaj n i m:\n");
    scanf("%d\n%d", &n, &m);
    int **tablica2d = tworzenie_tablicy(n, m)
// ...

Poprawiłem też tablica2d = (int*)malloc(m*sizeof(int)); na tablica2d[i] = (int*)malloc(m*sizeof(int));, zakładam, że to typo

0

Ooo okej, dziękuję Ci za odpowiedź. Wygląda to jeszcze prościej niż napisanie tego posta.
Pozdrawiam

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