[C] Przekazywanie tablicy dwuwymiarowej do funkcji


(Wiesia913) #1

Witam,

Jestem początkujący w programowaniu i natrafiłem dziś na taki problem. Mam napisać podprogram, w którym będzie tworzona macierz górnotrójkątna z losowo wybranymi liczbami. Do tego wyznaczam z tych liczb: liczbę maksymalna i minimalną. Następnie mam przekazać tę macierz, max i min do programu głównego. No i tu utknąłem.. Gdy to skompiluje to wyświetlają mi się w macierzy same 0. Nie wiem gdzie mam wrzucić max i min, aby mi się wyświetliło w macierzy głównej. Próbowałem już na wiele sposobów, ale zawsze mi wychodziły jakieś duże liczby.

Z góry dzięki za jakąkolwiek podpowiedź ! ;D

#include 

#include 

#include 


void f(int *tab[100][100], int N)

{

int i,j,max,min;

for(i=0;i
	for(j=0;j
		if(j>=i)

		      printf("%d\t", tab[i][j]);

           else

             printf("%d\t",0);


             if(tab[i][j]>max || i==0) max=tab[i][j];

   if(tab[i][j]

    }

	printf("\n");

	}

}



int main(){

	int i,j,N,tab[100][100];

	srand(time(0));


printf("podaj N:");

scanf("%d",&N);

	for(i=0;i
	for(j=0;j
		tab[i][j]=rand()%6+5;

		}}


   f(&tab[i][j],N);


    printf("%d\t",tab[i][j]);



system("pause");

return 0;

}

(Rolek0) #2
int *tab[100][100]

to tablica 100x100 wskaźników na int. Wskaźnik na tablicę 100x100 intów to

int (*tab)[100][100]

Tablice jako argumenty zawsze są przekazywane przez wskaźnik do pierwszego elementu tablicy, zapis np.

int foo(int x[20][30]);

jest równoznaczy z

int foo(int (*x)[30]);

Podobny temat: http://forum.dobreprogramy.pl/przekazywanie-tablic-wielowymiarowych-funkcji-t503220.html


(Manonim93) #3

Po pierwsze skoro funkcja ma tworzyć tą macierz to powinna alokować dla niej pamięć (calloc)? Twoja natomiast używa tablicy statycznej. Tablica statyczna JEST ZAWSZE KWADRATOWA / PROSTOKĄTNA:D.

Poniżej zamieszczam kod jak ja bym to rozwiązał, funcje min i max chyba dasz radę sobie napisać wystarczy po prostu przechodzić po tablicy podobnie jak funkcja fill_table.

#include 

#include 

#include 


int** create_table(int n)

{

	int i, cols = n;

	int **tab = NULL;


	tab = calloc(n, sizeof(int*));

	for(i=0; i
	{

		tab[i] = calloc(cols, sizeof(int));

		cols--;

	}


	return tab;

}


void fill_table(int **tab, int n)

{

	int i, j, cols = n;

	for(i=0; i
	{	

		for(j=0; j
		{

			tab[i][j] = (int)(rand()%10);

		}

		cols--;

	}


}


void show_table(int **tab, int n)

{

	int i, j, cols = n;

	for(i=0; i
	{	

		/*Ta pętla wyświetla spacje, aby uzyskać efekt górnotrójkątnej macierzy*/

		for(j=0; j< n-cols; j++)

		{

				printf("%s", " ");

		}


		for(j=0; j
		{

			printf("%d ", tab[i][j]);

		}

		cols--;

		printf("\n");

	}

}


void destroy_table(int **tab, int n)

{

	int i;

	for(i=0; i
	{

		free(tab[i]);

	}

	free(tab);

}


int main()

{

	const int N = 10;

	int **table = NULL;

	srand(time(NULL));


	table = create_table(N);

	show_table(table, N);

	fill_table(table, N);

	show_table(table, N);


	destroy_table(table, N);

	return 0;

}

(Wiesia913) #4

Dzięki wielkie ! Tablicę już udało mi się wyświetlić ;D

Głowie się jednak dalej na tym max i min. @michal_93 robię tak jak mówisz [chodź nie wiem czy o to chodzi] i nic mi z tego nie wychodzi. Czy to ma polegać na czymś takim ?

void fp( int N,int (*tab)[100])

{

	int i,j,max,min;

  for(i=0;i
   for(j=0;j

	if(tab[i][j]>max || i==0) max=tab[i][j];

   if(tab[i][j]

}}


      printf("\n");

}


int main(){

   int i,j,N,tab[100][100],max,min;

   srand(time(0));


printf("podaj N: ");

scanf("%d",&N);

   for(i=0;i
   for(j=0;j
      tab[i][j]=rand()%6+5;

      }}


   f(&tab[0][0],N);

fp(N,&tab[0][0]);


printf("%d\t",tab[i][j]);

    printf("min=%d max=%d\t",min, max);



system("pause");

return 0;

}

([alex]) #5

Musisz te max i min zwrócić.

Ponieważ to dwie wartości to możesz to zrobić przez strukturę (zawierającą dwa pola) lub przez wskaźniki:

void zwracaj_dwie_wartosci(int *x,int *y)

  {

   *x=3;

   *y=4;

  }


int main()

  {

   int a,b;

   zwracaj_dwie_wartosci(&a,&b);

   printf("a=%d; b=%d;\n",a,b);

   return 0;

  }

(Manonim93) #6

Ja bym napisał raczej dwie funkcje jedną co zwraca min, a drugą co max. Robienie tego przez struktury lub wskaźniki to tylko niepotrzebny wysiłek.

meryomega chyba nie rozumiesz czegoś co się nazywa zakresem zmiennych. Zmienne min i max w funkcji f() to zupełnie inne zmienne niż te z funkcji main(). Gdy wywoływana jest funkcja f() w pamięci tworzone są zmienne min i max (zupełnie niezwiązane z tymi z main !!

Użyj polecenia return min; , żeby zwrócić wynik obliczeń funkcji. Możesz również wypisać wynik w samej funkcji f() ale nie jest to polecane ponieważ należy oddzielać logikę od prezentacji.

Kilka uwag praktycznych:

  • Nie wklejaj kodu bez wcięć, bo będziesz czekać na odpowiedź przynajmniej dzień dłużej. Osobiście jak widzę taki kod to mi się odechciewa czytać po sekundzie.

  • Znajdź sobie jakiś fajny edytor który zamiast tabulatorów daje np. 4 spacje. W kodzie nie powinno się używać znaków tabulatora.

  • Nie warto pisać tab[0][0] tylko tab. Pamiętaj nazwa tablicy to ADRES / WSKAŹNIK NA JEJ PIERWSZY ELEMENT.

  • Staraj się używać tablic dynamicznych (tak jak w kodzie który zamieściłem), a nie statycznych. Czyli żadnego takiego int (tab*)[100] Po co marnować pamięć i zaciemniać kod?