Jak zabezpieczyć się przed wyjściem poza tablicę dwuwymiarową?

Jak zabezpieczyć się przed wyjściem poza tablicę dwuwymiarową?
L8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 99
0

Witam,

Mam taki problem: potrzebuję porównać ze sobą element tablicy wraz z elementami otaczającymi go, czyli na górze, po lewej, na dole i po prawej stronie. Sprawa jest prosta, jeśli element jest otaczany przez pozostałe, ale jeśli zaczynamy od brzegu lewego-górnego, to wtedy nie mamy nic po lewej i na górze...Jak zabezpieczyć się przed taką sytuacją?

Kopiuj
for (a = 0; a < wiersze, a++){
	for (b = 0; b < kolumny, b++){
		tab[a][b-1] - element po lewej - tu już mamy OutOfBounds
		tab[a][b+1] - element po prawej
		tab[a-1][b] - element na górze - tu też
		tab[a+1][b] - element na dole
	}
}
hauleth
  • Rejestracja: dni
  • Ostatnio: dni
0

Zależy co chcesz zrobić. Czy tablica jest "sferą", tzn. czy "zawija" się na brzegach, czy może jeśli element jest na krawędzi, to elementy "wystające" zawsze są takie same. Opisz dokładniej.

grzesiek51114
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2442
0

Skorzystaj z tab.length oraz tab[i].length https://ideone.com/UCppRj

EDIT: być może nie zrozumiałem zagadnienia ;) Ale post zostawię, bo może będzie Ci pomocny.

L8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 99
0

Tablica ma pewną stałą ilość wierszy i kolumn. Wygląda mniej więcej tak:

22 15 24 24 26 22 23 18 15 15 26 24 20
26 26 20 20 14 13 24 16 24 17 18 24 14
13 23 18 18 25 25 13 20 13 11 21 17 18
15 14 19 12 17 15 25 24 15 21 21 19 19

I teraz zaczynając od:

Kopiuj
tab[0][0]

...czyli 22 w tym przypadku, nie mogę odnieść się do:

Kopiuj
tab[a][b-1]
tab[a-1][b]

...gdyż będzie OutOfBounds.

vpiotr
  • Rejestracja: dni
  • Ostatnio: dni
0

Udaj że tych elementów nie ma (czyli gdy masz po nie sięgnąć to nie sięgaj bo ich nie ma).
W Twoim przykładzie nie wiadomo co to oznacza bo nie masz żadnego przypisania.

L8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 99
0

Ale muszę się do nich odnieść wchodząc do pętli od początku tablicy...muszę przejść przez całą tablicę porównując sąsiadujące elementy po lewej, po prawej, na górze i na dole, zaczynając od pierwszego...to wszystko mam w jednej pętli zewnętrznej i wewnętrznej...4 instrukcje IF, po jednej dla każdej strony.

carlosmay
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Pabianice
0

Iteruj po tablicy od 1?

L8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 99
0
carlosmay napisał(a):

Iteruj po tablicy od 1?

OK, a jak porównasz elementy na brzegach i rogach z sąsiadami?

gk1982
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 541
0
Kopiuj
for (a = 0; a < wiersze, a++){
    for (b = 0; b < kolumny, b++){
	
		if(a+1<wiersze)
		{
		tab[a+1][b] - element na dole
		}
		if(a-1>=0))
		{
		tab[a-1][b] - element na górze - tu też
		}
		if(b-1>=0)
		{
		tab[a][b-1] - element po lewej - tu już mamy OutOfBounds
		}
		if(b+1<kolumny)
		{
		tab[a][b+1] - element po prawej
		}
		 
    }
}
L8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 99
0
gk1982 napisał(a):
Kopiuj
for (a = 0; a < wiersze, a++){
    for (b = 0; b < kolumny, b++){
	
		if(a+1<wiersze)
		{
		tab[a+1][b] - element na dole
		}
		if(a-1>=0))
		{
		tab[a-1][b] - element na górze - tu też
		}
		if(b-1>=0)
		{
		tab[a][b-1] - element po lewej - tu już mamy OutOfBounds
		}
		if(b+1<kolumny)
		{
		tab[a][b+1] - element po prawej
		}
		 
    }
}

Hehe, rozwiązanie było na widoku :) Że też na to nie wpadłem...dzięki!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.