Skocz do zawartości

11. Zmienne tablicowe


# CSH External VIP Project

Masz dosyć problemów z czynnikiem zaufania w CS2 lub notorycznymi banami?

Sprawdź CSH External VIP Project.


Więcej informacji  

Rekomendowane odpowiedzi

Ta lekcja będzie trochę dłuższa od poprzednich, ponieważ tablice, to dość spory dział wiedzy.

 

Zmienne tablicowe/ Tablice (ang. Array) - to specyficzny rodzaj zmiennych, łączący kilka zmiennych w jedną. Tablice to taki twór, który pozwala na stworzenie kilku zmiennych pod jedną nazwą.

 

Najpierw przykładzik potem omówienie.

Global $tablica[3];deklaracja tablicy z 3 elementami

;przypisanie danych do tablicy
$tablica[0]="Pierwszy elememt o indeksie 0"
$tablica[1]="Drugi elememt o indeksie 1"
$tablica[2]="Trzeci elememt o indeksie 2"

;odwołanie do tablicy
MsgBox(0,"Tablice", $tablica[0] & @LF &     $tablica[1] & @LF &     $tablica[2]);jak widać razem mamy trzy osobne zmienne.

Deklaracja tablicy

Tablice to takie zmienne, które zawsze muszą być deklarowane.

Global/Local - określa zasięg zmiennej; Global- zmienna widoczna w całym programie; Local - zmienna widoczna tylko w danym bloku kodu (np If...EndIf), po zakończeniu bloku zmienna znika z programu.

$nazwatablicy - tak samo jak w zmiennych tutaj także podajemy nazwę.

[zakrestablicy] - zakres to inaczej ile elementów(czyli tak jakby zmiennych) zawierać będzie w sobie tablica.

 

Przypisanie danych/Odwołanie do tablicy

Tutaj wystarczy podać nazwę tablicy i INDEKS elementu tablicy, z którego chcemy skorzystać.

Tablice indeksowane są od zera

Czyli: pierwszy element ma indeks 0

drugi element ma indeks 1

......

n-ty element ma indeks n-1

 

Trzeba sobie zapamiętać różnicę między elementem, a indeksem!

 

Co się stanie gdy wykroczymy poza tablicę?

Jeśli zrobimy coś takiego:

Global $tablica[3];deklaracja tablicy z 3 elementami
;wykroczenie poza rozmiar tablicy
$tablica[3]="Czwarty element?? hmm "
Kompilator od razu wychwyci błąd i program się nie skompiluje. Otrzymamy wówczas komunikat:

==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

Nie mniej jednak kompilator czasem od razu błędu nie zauważy, gdy go odpowiednio zakamuflujemy np:

Global $tablica[3]
$tablica[0]="Pierwszy elememt o indeksie 0"
$tablica[1]="Drugi elememt o indeksie 1"
$tablica[2]="Trzeci elememt o indeksie 2"

For $x=0 to 3 Step +1
     TrayTip("Tablica",$tablica[$x],10)
     Sleep(2000)
Next

MsgBox(0,"Działą", "Wszystko jest OK")
Skompilujcie sobie program. Wydaje się, że wszystko działa, ale czemu nie zobaczyliśmy msgboxa?? Otóż zmienna $x utworzona w pętli for rośnie aż do wartości 3, a my nie mamy w tablicy indeksu 3. Najwyższy indeks tablicy wynosi 2. Kompilator(właściwie to interpreter :D, bo program już został skompilowany) zauważył to dopiero w trakcie działania programu i w tym momencie przerwał go i wyświetlił komunikat (zerknijcie sobie do okna konsoli w edytorze ScITe).

Autoit ma to do siebie, że przerywa program gdy tylko wykroczymy poza zakres tablicy.

 

Po co nam są tablice, skoro mamy zwykłe zmienne?

Tablice są dość dużym ułatwieniem dla programisty. Wyobraźcie sobie, że chcecie wylosować 100 liczb. Można by zrobić:

$los1=Random(1,100,1)
$los2=Random(1,100,1)
;...
$los100=Random(1,100,1)
ale po co pisać 100 linijek kodu skoro można zrobić to w 4 linijkach:

Global $los[100];deklaracja tablicy 100 elementowej (indeksy 0-99)
For $x=0 To 99 Step +1
     $los[$x]=Random(1,100,1)
Next

Wykorzystałem tu pętlę for (takie wykorzystanie jest jak najbardziej wskazane i dozwolone :D) i zmienną $x, która posłużyła mi jako indeks tablicy. Trzeba jednak uważać, by przez pętlę nie wykroczyć poza zakres tablicy. Poprawmy więc kod który pisaliśmy kilka linijek wyżej:

Global $tablica[3]
$tablica[0]="Pierwszy elememt o indeksie 0"
$tablica[1]="Drugi elememt o indeksie 1"
$tablica[2]="Trzeci elememt o indeksie 2"

For $x=0 to 2 Step +1
     TrayTip("Tablica",$tablica[$x],10)
     Sleep(2000)
Next

MsgBox(0,"Działa", "Wszystko jest OK")
No i już działa.

Czasem są takie sytuacje, w których nie idzie się obejść bez tablic dlatego warto się tych tablic nauczyć.

 

Tablice wielowymiarowe

Fajnie to brzmi prawda? Do tej pory pracowaliśmy na tablicach jednowymiarowych, ale mamy też tablice wielowymiarowe. Pokażę przykład:

Global $tablica[3];jednowymiarowa
Global $tablica[3][4];dwuwymiarowa
Global $tablica[3][3][2];trójwymiarowa
;itd
Zastanawialiście się czemu: Film 3D?? 3D to skrót od 3dimension(z ang.3wymiar).

Dlaczego tablice są "wielowymiarowe"? Bo najłatwiej przedstawić je w danych wymiarach. Tablicę 2wymiarową w dwóch wymiarach itd.

Tablicę 2 wymiarową najłatwiej wyobrazimy sobie w 2wymiarowej tabeli. Pokarzę Wam przykład ze strony: http://xion.org.pl/files/texts/mgt/html/1_5.html, gdzie Was także odsyłam jeśli nie zrozumiecie tablic:

Global $tab[4][5]
powyższą tablicę, można sobie wyobrazić w tabeli właśnie tak:

 

Nie będę tego już bliżej tłumaczył. Jeśli czegoś nie rozumiecie to polecam przeczytajcie właśnie teraz na powyższej stronie (tam jest to dokładniej wytłumaczone) i później wróćcie tutaj by kontynuować lekcję.

 

Jak odebrać zwracaną przez funkcję tablicę?

Przykładowo spójrzmy na funkcję StringSplit(). Zwraca ona tablicę o różnym, w zależności od podanych argumentów, rozmiarze. Jak więc taką tablicę odebrać od funkcji?? Jak pisałem powyżej każda tablica w autoit musi być zadeklarowana. Inaczej kompilator wypluje błąd. Pisałem także, że tablica to specyficzny rodzaj zmiennej. Zadeklarujmy więc zwykłą zmienną, a funkcja sama przerobi ją na tablicę:

Global $tablica
$tablica=StringSplit("a|b|c|d","|")
No i odebraliśmy tablicę od funkcji. W helpie pod hasłem: StringSplit możecie dowiedzieć się co znajduje się teraz w tej tablicy,

 

Jak sprawdzić rozmiar tablicy?

Do tego służy funkcja UBound(). Jako pierwszy argument podajemy nazwę tablicy, a jako drugi argument podajemy wymiar tablicy, którego zasięg chcemy poznać. Jeśli pod drugi argument podamy liczbę 0 to funkcja poda nam ile wymiarów ma dana tablica. Przykład:

Global $tablica[3];jednowymiarowa
MsgBox(0,"Tablica1", UBound($tablica));drugi argument domyslnie przyjmuje wartosc 1
Global $tablica2[3][4];dwuwymiarowa
MsgBox(0,"Ile wymiarow", UBound($tablica2,0))
MsgBox(0,"Tablica2", UBound($tablica2,2));rozmiar drugiego wymiaru
Należy pamiętać, że funkcja ta zwraca rozmiar tablicy. Jeśli więc chcemy otrzymać ostatni indeks tej tablicy trzeba od rozmiaru odjąć 1.

 

Jak zwiększyć/zmniejszyć rozmiar tablicy?

Służy do tego operator ReDim. Za jego pomocą można zwiększać/zmniejszać rozmiar, a nawet dodawać/odejmować wymiary.

Global $tablica[3];jednowymiarowa

ReDim $tablica[4];powiekszenie
MsgBox (0,"Tab1",UBound($tablica))

ReDim $tablica[7][5];zmiana wymiaru
MsgBox (0,"Tab1",UBound($tablica))
MsgBox (0,"Tab1",UBound($tablica,2))
Myślę, że przykład jest jasny. Uważajcie jednak przy tych zmianach, bo podczas pomniejszania tablicy, możecie bezpowrotnie utracić jej elementy, a co za tym idzie stracicie dane, które w sobie zawierały.

 

To by było na tyle.

 

Pozdrawiam i życzę udanej kompilacji.

 

Pozdrawiam,

Yubasek.

Odnośnik do komentarza

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Regulamin. Polityka prywatności