Alokacja tablicy 2-wymiarowej w funkcji

0

Witam. Mam pewien problem, którego nie mogę rozwiązać... Potrzebuję dynamicznie zaalokować tablicę 2-wymiarową, tylko chciałbym, aby alokacja odbywała się w innej funkcji. Mam wcześniej zadeklarowane 3 tablice wskaźników. W mainie wczytuję wysokość i szerokość tablicy (zmienne globalne), potem chciałbym przekazać do funkcji te 3 tablice i tam je zaalokować. Funkcję wywołuję tak:

  alokacja(tab1,tab2,tab3);

A jej definicja wygląda następująco:

int alokacja(int **tab1,int **tab2,int **tab3)
{
 tab1=(int**)malloc(N*sizeof(int*)); 
 tab2=(int**)malloc(N*sizeof(int*)); 
 tab3=(int**)malloc(N*sizeof(int*)); 
	 if((tab1 || tab2 || tab3) == NULL)  
		return -1;

	 for(i=0;i<M;i++) 
	   { 
	    tab1[i]=(int*)malloc(M*sizeof(int));
	    tab2[i]=(int*)malloc(M*sizeof(int));
	    tab3[i]=(int*)calloc(M,sizeof(int));
		     if((tab1 || tab2 || tab3) == NULL)  
				return -1;
   	  } 	
}

Program się kompiluje, ale alokacja nie przebiegła prawidłowo, gdyż przy próbie wpisania czegoś do tablicy, program kończy się błędem

Additional information: Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.
.
Czy to ja coś źle robię, czy nie można alokować pamięci w ten sposób?

0

Skoro chcesz alokować 2 wymiarową tablicę brakuje Ci jednej gwiazdki w parametrach funkcji. Teraz modyfikujesz tylko kopię wskaźnika a nie oryginalny wskaźnik.

0

Hmm brakuje gwiazdki przy wywołaniu funkcji czy przy jej definicji? Próbuję tak i tak, niestety bez skutku. Mógłbyś to pokazać na tym moim programie? Bo sprawdziłem, to alokacja faktycznie działa tylko w funkcji 'alokacja', poza nią nie. Jak zmieniam ilość gwiazdek, to dostaję taki komunikat:

error C2664: 'alokacja' : cannot convert parameter 1 from 'int *' to 'int **'

1

Popatrz na to tak:

int foo(int a)
{
    a = 5;
}

Czy zmienna a zmieni się poza funkcją? Zakładam że jest dla Ciebie oczywiste że się nie zmieni. To patrz na to:

typedef int** array2d;

int alokacja(array2d tab1, array2d tab2, array2d tab3)
{
    tab1=(array2d)malloc(N*sizeof(int*)); 
    tab2=(array2d)malloc(N*sizeof(int*)); 
    tab3=(array2d)malloc(N*sizeof(int*)); 
    if(!(tab1 || tab2 || tab3))  
        return -1;

    for(int i=0;i<M;i++) 
    { 
        tab1[i]=(int*)malloc(M*sizeof(int));
        tab2[i]=(int*)malloc(M*sizeof(int));
        tab3[i]=(int*)calloc(M,sizeof(int));
        if(!(tab1 || tab2 || tab3))  
            return -1;
    }         
}

Jak widać, przekazujesz tablice właściwie przez wartość - tzn. mimo że przekazujesz wskaźniki, nic nie zwracasz w ten sposób do funkcji wywołującej. Drobna poprawka:

typedef int** array2d;

int alokacja(array2d *tab1, array2d *tab2, array2d *tab3)
{
    *tab1=(array2d)malloc(N*sizeof(int*)); 
    *tab2=(array2d)malloc(N*sizeof(int*)); 
    *tab3=(array2d)malloc(N*sizeof(int*)); 
    if(!(tab1 || tab2 || tab3))  
        return -1;

    for(int i=0;i<M;i++) 
    { 
        (*tab1)[i]=(int*)malloc(M*sizeof(int));
        (*tab2)[i]=(int*)malloc(M*sizeof(int));
        (*tab3)[i]=(int*)calloc(M,sizeof(int));
        if(!(tab1 || tab2 || tab3))  
            return -1;
    }         
}

W ten sposób powinno działać. Typedefa oczywiście jeśli chcesz można się pozbyć przez ręczne zamienienie z powrotem na int**.

0

Dziękuję za dokładne wytłumaczenie. Teraz działa. Faktycznie, pogubiłem się w tych gwiazdkach, nie pomyślałem w ten sposób.
Pozdrawiam :)

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