Zaloguj się by uzyskać pełen dostęp. Nie masz jeszcze konta? Założ je już teraz w kilka sekund.
Wysłany: 2017-11-14, 19:00


marcin778

Krytyk serwerów MTA






Wiek: 31
Na forum: 1522 dni
Posty: 2215
Nick w MP: Marcineg

Piwa: 4969

Respekt: 1306,8
Respekt: 1306,8


Witam!

W części szóstej moich poradników, głównym tematem będą tabele lub jak kto woli tablice. Poznamy ich zastosowanie,rodzaje etc.


wielowymiarowe

Ja osobiście będę posługiwał się słowem "tabela", aczkolwiek można tez "tablica".
Tabela wielowymiarowa posiada tę ilość wymiarów. Mamy jednowymiarowe,dwuwymiarowe,trójwymiarowe itd. Dlatego ogólną nazwą jest "tablica wielowymiarowa". Ta 'ilość' wymiarów to ilość indeksów/wartości w tej tabeli.

local tbl = {}

tbl[1] = 10
tbl[2] = 20

print(tbl[1],tbl[2])
taki kod zwróci nam
Kod:


10
20
, ponieważ otrzymujemy wartość indeksu pierwszego i drugiego.

local tbl = {}

tbl[1] = {1,2,3,4,5}
tbl[8] = {5,4,3,2,1}
print(tbl[1],tbl[8])
W takim przypadku nasz kod jest już błędny, co prawda nie zwróci on błędu tylko
Kod:

table: numer
W przypadku mojego testu:
Kod:

table: 0x8127c0
Numer ten za każdym razem jest inny. Aczkolwiek nie ma on dla nas znaczenia. Aby poprawnie wyświetlić wartość 2 z indeksu 1 z tabeli, musimy podać numer tego indeksu z którego chcemy pobrać wartość.

local tbl = {}

tbl[1] = {1,2,3,4,5}
tbl[8] = {5,4,3,2,1}
print(tbl[1][2])
taki kod poprawnie zwróci nam
Kod:

2
Tych indeksów/tabel/komórek możemy wstawiać ile trzeba, można też i tak


local tbl = {}

tbl[1] = {100,{1,2,3,4,5}
print(tbl[1][2])
, nasz kod jest już zły, ponieważ tbl[1][2] czyli tablica 'tbl' indeks '1' i indeks/komórka '2' to tabela, czyli ponownie zwróci nam
Kod:

table: numer
Aby pobrać wartość z pierwszego indeksu czyli te 100 to robimy tbl[1][1], natomiast jeśli chcemy teraz z naszej tabeli pobrać powiedzmy liczbę 4 to musimy podać indeks w tabeli gdzie znajduje się nasza wartość. Czyli tbl[1][2][4] to zwróci nam 4, ponieważ tbl[1] czyli tabela 'tbl' indeks 1, [2] indeks 2 z tabeli, czyli również tabela (tak, tabela w tabeli) i [4] czyli numer indeksu z którego chcemy pobrać wartość, w tym przypadku 4 czyli 4. Każda wartość po przecinku w tabeli to nowy kolejny indeks. Czyli tak na prawdę nasza tabela wygląda tak:

tbl = {{100,{1,2,3,4,5}}}
2 tabele w głównej tabeli 'tbl', jedna tabela zawiera 100 i drugą tabelę, w której znajdują się wartości od 1 do 5. Indeksy w przypadku tabeli w tabeli, czyli tbl[1][2][3] 3 to ten indeks, indeks nie może być mniejszy niż 1, nie damy rady zrobić przecież mniejszego indeksu w tej tabeli {100,{1,2,3,4,5}} indeks jest liczony od 1 wzwyż. Natomiast możemy zrobić tak
local tbl = {}
tbl[0] = 1000
wtedy
print(tbl[0])
pozytywnie zwróci nam wartość czyli w moim przypadku 1000. Wartością nie koniecznie musi być liczba, może to być string, boolean,tabela,nil a nawet function. To po prostu przypisana zmienna danego rodzaju. Budowa tabeli może też być taka

local tbl = {
{1,2,3},
{3,2,1},
}
To jest to samo, tyle że w innej formie, zamiast dodawać do tabeli indeksy to sami je "ręcznie" tam pakujemy. W tym przypadku tbl[2][1] zwróci nam 3, ponieważ [2] to indeks z głównej tabeli a [1] to indeks w tej tabeli z indeksu 2. Czyli

local tbl = {
{1,2,3}, -- {1,2,3to index 11 to index 12 to index 23 to index 3
{3,2,1}, -- {3,2,1to index 23 to index 12 to index 21 to index 3
{20,50,560}, -- to index 320 to index 150 to index 2 560 to index 3
}
Czyli tbl[index][index z komórki] Czyli jeszcze prościej to w tabeli tbl te {1,2,3} {3,2,1} to są jakby komórki a w nich są wartości, gdzie każda wartość to indeks. tbl[3][2] to 50.
Tutaj tak samo może też być string,nil,itd.

local tbl = {
{"tekst",nil,100,true},
}

print(tbl[1][1],tbl[1][2],tbl[1][3],tbl[1][4])
Wynikiem będzie:
Kod:

tekst,nil,100,true
W poprzedniej części (piątej) tematem były pętle, była tam taka pętla jak "for" za jej pomocą również możemy wyciągnąć dane z tablicy a nawet ilość indeksów/kluczy.

local tbl = {
{"tekst1"},
{"tekst2"},
{"tekst3"}
}

for klucz,wartosc in ipairs(tbl) do
print(klucz,wartosc)
end
wynik:
Kod:


1 table: numer
2 table: numer
3 table: numer
Dlatego też w tym przypadku musimy podać indeks, nie musimy podawać już każdego indeksu głównej tabeli, wystarczy samej wartości, czyli:

local tbl = {
{"tekst1"},
{"tekst2"},
{"tekst3"}
}

for klucz,wartosc in ipairs(tbl) do
print(klucz,wartosc[1])
end
Wynik:
Kod:


1 tekst1
2 tekst2
3 tekst3
Możemy tam umieścić nawet funkcje:

local tbl = {
{"tekst1"},
{function() print("wykonalo funkcje"end},
{"tekst3"}
}

for klucz,wartosc in ipairs(tbl) do
print(klucz,wartosc[1])
end
Co prawda taki kod zwróci nam
Kod:


1 tekst1
2 function: numer
3 tekst3
Dlatego też warto zrobić warunek, który sprawdzi czy typem wartości jest funkcja, jeśli tak to ją wywoła.

local tbl = {
{"tekst1"},
{function() print("wykonalo funkcje"end},
{"tekst3"}
}

for klucz,wartosc in ipairs(tbl) do
if type(wartosc[1]) ~= "function" then
print(klucz,wartosc[1])
else
wartosc[1]()
end
end
No i wynik
Kod:


1 tekst1
wykonalo funkcje
3 tekst3
W nawiasach możemy podać ewentualne potrzebne argumenty do funkcji. Jest to tak zwany 'switch', aczkolwiek nie do końca, o switchah to potem. Następną możliwą formą tabeli jest coś takiego

local tbl = {
10
b 20
c 30
}
W takim przypadku możemy użyć również pętli for lub też zrobić tak

print(tbl.a,tbl.b,tbl.c)
Wynikiem będzie
Kod:


10
20
30
W przypadku pętli for

for klucz,wartosc in pairs(tbl) do
print(k,v)
end
Wynik
Kod:


a 10
b 20
c 30
Warto zwrócić uwagę, że jest tutaj pairs nie ipairs Gdyż ipairs iteruje tylko po kluczach, które są kolejnymi liczbami naturalnymi, a jak wiadomo a,b,c to nie liczba. Kolejna forma

local tbl = {
[1] = {"tabela"},
[2] = 10,
[3] = nil,
[4] = true,
Wtedy indeksem jest liczba w nawiasie kwadratowym, czyli jeśli chcę uzyskać np true to tbl[4]. Jeśli "tabela" to tbl[1][1]. Gdyż pierwsze [1] to indeks w tabeli "tbl" a drugie [1] to indeks w tej tabeli {"tabela"} a indeksem pierwszym jest "tabela". Nazwa tabeli to po prostu zmienna, może być inna niż tbl i może też być globalna (bez przedrostka 'local'). Z budowy tabel zdaje mi się, że to chyba wszystko jeśli chodzi o wielowymiarowe.


asocjacyjne

Tablica asocjacyjna to prawie to samo co tablica wielowymiarowa, aczkolwiek tutaj indeksami nie są liczby, tylko identyfikatory znakowe czyli klucze (string).

local tbl = {}
tbl['Jamajka'] = "4000 zł"
tbl['Karaiby'] = "3000 zł"

print("Cena wycieczki na jamajkę to: "..tbl['Jamajka'].." a na karaiby: "..tbl['Karaiby'])
Tutaj zamiast indeksu jest klucz czyli w naszym wypadku Jamajka oraz Karaiby, wielkość liter ma znaczenie, podany klucz musi być identyczny jak jest w tabeli. Klucz może być podany w cudzysłowiu, ja używam apostrofu aczkolwiek to bez różnicy. Drugim sposobem jest podobny do tego z wielowymiarowej,

local tbl = {
['klucz1'] = 100,
['klucz2'] = 200,
['klucz3'] = 300,
}

for klucz,wartosc in pairs(tbl) do
print(k,v)
end
Wynik:
Kod:


klucz3 300
klucz2 200
klucz1 100
W przypadku takiej tabeli nie uzyskamy ilości indeksów z pętli, możemy jedynie zrobić zmienną + wartość

local tbl = {
['klucz1'] = 100,
['klucz2'] = 200,
['klucz3'] = 300,
}

0

for klucz,wartosc in pairs(tbl) do
print(k,v)
1
end
Na pewno nie które osoby zrozumieją co mam na myśli.
Równie dobrze, możemy zrobić bez pętli czyli

print(tbl['klucz1'],tbl['klucz2'],tbl['klucz3'])
Wynik będzie taki sam czyli
Kod:


100
200
300
Możemy też zrobić przecież tabelę "mieszaną"

local tbl = {
['market'] = {
   ['biedronka'] = {
     [1] = "napoje",
     [2] = "nabiał",
     olej true,
 },
}
}
Tylko jak teraz z tego wyciągnąć poszczególne wartości? A no bardzo prosto albo pętla albo bez.

print(tbl['market']['biedronka'][1])
i wynik to
Kod:


napoje

A z pętlą

for p,t in pairs(tbl['market']['biedronka']) do
 print(p,t)
end
Wynik to:
Kod:


Olej true
1 napoje
2 nabiał
Trzeba podać klucz czyli market i w nim jeszcze drugi klucz z którego chcemy wyciągnąć dane czyli biedronka. Z tabel asocjacyjnych z kluczami to raczej też chyba już na tyle.

switch
Na początku pragnę poinformować, że te switche w lua to są pseudo switche, gdyż nic takiego nie zostało domyślnie zaimplementowane do lua, możemy jedynie naśladować ich działanie. Co to jest switch? Switch to funkcja w tabeli, coś na zasadzie tego przykładu z funkcją w wielowymiarowych tabelach. Indeksem może być zarówno liczba jak i klucz.

local switch = {
 [1] = function() print("Wykonano funkcje 1"end,
 [2] = function() print("Wykonano funkcje 2"end,
}
Jak teraz taką funkcję wywołać? Tak

switch[1]()
te [1] to indeks. W przypadku asocjacyjnej czyli kluczy:

local switch = {
 ['a'] = function() print("Wykonano A"end,
 ['b'] = function() print("Wykonano B"end,
}
Wywołujemy tak:

switch['a']()
Jako iż jest to funkcja to musimy dodawać nawiasy aby ją wywołać jako normalną funkcję. Wynik:
Kod:


Wykonano funkcje 1
Wykonano funkcje 2
Klucze
Kod:


Wykonano A
Wykonano B

Prosty przykład na bindKey'ach z mta.

local keys = {
  ['enter'] = function(plr,k,ks) if ks == "down" then outputChatBox("Wciśnięto enter",plr,255,255,255end end,
 ['space'] = function(plr,k,ks) if ks == "down" then outputChatBox("Wciśnięto spacje.",plr,255,255,255end end,
}

for k,v in pairs(keys) do
 bindKey(k,"down",keys[v])
end
Jest to w miarę fajne rozwiązanie.

Funkcje tabel
table.concat
Funkcja table.concat dodaje nam podany ciąg znaków w otrzymane wartości, przykładowo

local tbl = {1,2,3,4,5}
print(table.concat(tbl))
Wynik
Kod:

12345
Drugi przykład:
local tbl = {1,2,3,"cztery",5}
print(table.concat(tbl"."))
Wynik
Kod:


1.2.3.cztery.5
Można też podać konkretny indeks,

local tbl = {1,2,3,cztery,5}
print(table.concat(tbl".",3,5))
Wynik
Kod:


3.cztery.5
Argument ten wyznacza od którego do którego indeksu ma zostać "wstawiony" ten znak.
tbl to tabela, "." to znak, 3 to indeks od którego ma być wstawiany znak, 5 to indeks do którego ma być wstawiany znak. Wymaganym argumentem jest jedynie tabela.

table.insert
Funkcja table.insert dodaje nam do tabeli podaną wartość,

local tbl = {1,2,3}
table.insert(tbl,4,"cztery")
print(tbl[4])
Wynik:
Kod:


cztery
Argument tbl to tabela, 4 to opcjonalny numer indeksu na który ma zostać dodana wartość a "cztery" to wartość, która ma zostać dodana. Jeśli nie podamy indeksu to domyślnie będzie to następny wolny indeks. Wymaganym argumentem jest jedynie tabela oraz wartość.
table.remove
Funkcja table.remove usuwa nam podany index/podaną wartość z tabeli. Przykładowo

local tbl = {}

for 1,do
table.insert(tbl,i)
end

table.remove(tbl,2)
Taki kod doda nam do tabeli 3 indeksy gdzie wartość to kolejna liczba od 1 do 3. Następnie usuwa z tabeli indeks 2, czyli dwójkę z tabeli. Wymaganym argumentem jest jedynie tabela, drugi argument jest opcjonalny. Jeśli podamy tylko tabelę to usuniemy wszystko z tabeli.

table.sort
Funkcja table.sort jak sama nazwa wskazuje, sortuje nam dane.
local tbl = {"A","B","G","S","C"}

for k,v in pairs(tbl) do
print(v)
end
Taki kod zwróci nam
Kod:

1: A
2: B
3: G
4: S
5: C
Czyli w takiej kolejności jak są te wartości umieszczone.


local tbl = {"A","B","G","S","C"}
table.sort(tbl) -- sortujemy tabele

for k,v in pairs(tbl) do
print(k..": "..v)
end
Natomiast taki kod posortuje nam w tym przypadku wartości alfabetycznie.
Kod:


1: A
2: B
3: C
4: G
5: S
To jak posortować liczby?

local tbl = {1,3,2,7,4}

for k,v in ipairs(tbl) do
print(k..": "..v)
end
Przecież taki kod zwróci nam
Kod:


1: 1
2: 3
3: 2
4: 7
5: 4
Jak to posortować od największej do najmniejszej? Użyjemy do tego własnej funkcji,

local tbl = {1,3,2,7,4}

function sort(t,o)
  local keys = {}
    for k in pairs(t) do keys[#keys+1] = k end
     if o then
      table.sort(keys,function(a,b) return o(t,a,bend)
     else
      table.sort(keys)
     end
     
     local i 0
     return function()
     1
     if keys[ithen
       return keys[i], t[keys[i]]
     end
   end
end

for k,v in sort(tbl,function(t,a,b) return t[b] < t[aend) do
print(v)
end
Wynik
Kod:


7
4
3
2
1
Jeśli od najmniejszej do największej to zamieniamy
return t[b] < t[aend
na
return t[b] > t[aend
I otrzymamy nasz efekt.

table.maxn
Funkcja table.maxn nie jest już używana w lua, aczkolwiek MTA korzysta ze starszej wersji lua gdzie takowa funkcja jeszcze jest dostępna. Funkcja table.maxn
zwraca nam największy dodatni indeks, jeśli takowego nie ma no to zwraca nam 0.

local tbl = {[1] = 1,[450] = 5}

print(table.maxn(tbl))
Taki kod zwróci nam
Kod:

450
Ponieważ to największy indeks. UWAGA Funkcja table.maxn to nie to samo co operator długości
#


Operator długości tabeli
Operator ten zwraca "wielkość/długość" tabeli.

local tbl = {[1] = 1, [450] = 5, [5000] = 10}

print(#tbl)
Taki kod zwróci
Kod:

3
Ponieważ operator ten zwraca ilość wszystkich indeksów w tabeli, table.maxn zwróciło by
Kod:

5000


Przydatne linki


Funkcje tabel: https://www.lua.org/manua...df-table.insert
Funkcja print: https://www.lua.org/pil/2.html (Funkcja print wyświetla tekst na ekranie, w przypadku mta w debuggerze)
Edytor lua online: https://www.lua.org/cgi-bin/demo - Bardzo dobra rzecz do testowania sobie kodów i uczenia się. Nie jest to narzędzie pod mta tylko pod lua, czyli funkcje mta tam nie działają bo nie istnieją.

W razie jakichś przeoczeń, lub jeśli czegoś zapomniałem to piszcie z chęcią poprawię.

Podpis
Pomagam w miarę możliwości Discord: marcin778#7316
Również robię skrypty na zamówienie.

Moje prace: https://www.youtube.com/c...MuaWGHPp1mhlGnw

Jak to rzekł pewien mądry człowiek, są ludzie, którym lepiej ustąpić. Nie z powodu strachu lecz z powodu ich głupoty, która prowadzi donikąd.

-- obecnie
-- obecnie
-- dawniej
-- dawniej
-- obecnie
Ostatnio zmieniony przez marcin778 2017-11-22, 17:37, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 

 
Więcej szczegółów
Wystawiono 7 piw(a):
STOPseba, Avenged, Szydlo, Pevo, Kuksss, kaksonek, Devileczek
Wysłany: 2017-11-14, 19:36


kamilryb1

Giełda mój dział






Wiek: 14
Na forum: 1639 dni
Posty: 134

Piwa: 38

Respekt: 7,3


Ostrzeżeń: 20%
Panie marcin778, może wytłumaczyłby Pan setTimer? :D

Komentarz marcin778 dodany 2017-11-14, 21:20W następnym poradniku poruszę te funkcję.
Podpis


Fanpage: https://www.facebook.com/mtaliferpg

_________



Strona o charakterze informacyjnym mojej osoby: http://kamildeveloper.pl

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-11-14, 20:18


Avenged

Młodszy Szkrypter






Wiek: 16
Na forum: 883 dni
Posty: 643
Nick w MP: Avenged

Piwa: 771

Respekt: 306,3
Respekt: 306,3Respekt: 306,3Respekt: 306,3


Lub można też getTickCount :D

Komentarz marcin778 dodany 2017-11-14, 21:20Również poruszę ją w następnej części.
Podpis
LUA, JS, PHP, C++



Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-11-14, 21:02


Szydlo

Stance Works






Wiek: 18
Na forum: 958 dni
Posty: 343
Nick w MP: Szydlo

Piwa: 3

Respekt: 85,3


W końcu, polać mu! Dzięki za kurs, oraz jesteś jedyny który zrobił więcej niż dwa kursy. Mam nadzieje że będą następne.
Oczywiście zimne :piwo: i R*

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-11-15, 18:51


Pevo

Ja wiem lepiej






Wiek: 17
Na forum: 962 dni
Posty: 364
Nick w MP: Pevo

Piwa: 462

Respekt: 335,8
Respekt: 335,8Respekt: 335,8Respekt: 335,8


Kolejny dobry kurs dla początkujących i dla tych, którym nie chcę się wchodzić na manuala :D Masz tu zimne :piwo:

Podpis
Discord: Pevo#3511
GG: 64700204
Usługi programistyczne: http://gtao.pl/<font-c...ne-vt125761.htm
X-MTA: https://gtao.pl/gm-x-mta-vt128400.htm#804971
Postaw piwo autorowi tego posta
 

 
Wysłany: 2018-01-07, 19:45


PolskiSebek12

Programista






Wiek: 21
Na forum: 1719 dni
Posty: 363
Nick w MP: CrosRoad95

Piwa: 2661

Respekt: 288,8
Respekt: 288,8Respekt: 288,8Respekt: 288,8


Ostrzeżeń: 100%
tabele wielowymiarowe to tylko abstrakcja w świecie programowania, w praktyce da się stworzyć TYLKO 2 wymiarowe tabele które mogą w sobie posiadać inne 2 wymiarowe tabele.

Nie pokazałeś ważnej rzeczy - jak posortować wielokolumnowe tabele, jak sortować po kluczu
nie pokazałeś również jak sprawdzić długość tabeli o nienumerycznych kluczach
brakuje też informacji jak działają funkcje do tworzenia własnych iteratorów

Podpis
Postaw piwo autorowi tego posta
 

 
Wysłany: 2018-07-14, 00:14


ST4GE

RoyalMTA






Wiek: 15
Na forum: 258 dni
Posty: 195
Nick w MP: ST4GE

Piwa: 83

Respekt: 76,3


Przeczytalem caly wyzej napisany poradnik, lecz za duzo nie zrozumialem. Chcialbym zapytac wprost jakie lub gdzie mozemy zastosowac taka tabele? Moglbys napisac jakis przyklad?

Postaw piwo autorowi tego posta
 

 
Wysłany: 2018-07-16, 18:35


marcin778

Krytyk serwerów MTA






Wiek: 31
Na forum: 1522 dni
Posty: 2215
Nick w MP: Marcineg

Piwa: 4969

Respekt: 1306,8
Respekt: 1306,8


ST4GE, Tabele mają bardzo wiele zastosowań, choćby losowanie markera do jakiejś pracy. Losujemy punkt z tabeli.


local punkty = {
 {x,y,z,kasa},
 {x,y,z,kasa},
}

function stworzpunkt()
   local r math.random(1,#punkty)
   local punkt createMarker(punkty[r][1],punkty[r][2],punkty[r][3],"cylinder",1.4,255,255,0,255)
end
To jedno z wielu zastosowań.

Podpis
Pomagam w miarę możliwości Discord: marcin778#7316
Również robię skrypty na zamówienie.

Moje prace: https://www.youtube.com/c...MuaWGHPp1mhlGnw

Jak to rzekł pewien mądry człowiek, są ludzie, którym lepiej ustąpić. Nie z powodu strachu lecz z powodu ich głupoty, która prowadzi donikąd.

-- obecnie
-- obecnie
-- dawniej
-- dawniej
-- obecnie
Postaw piwo autorowi tego posta
 

 
Wysłany: 2018-11-30, 22:08


Hinvx







Wiek: 15
Na forum: 236 dni
Posty: 6
Nick w MP: Hinox



Respekt: 50


Świetny kurs!

Postaw piwo autorowi tego posta
 

 
Tagi: lua :: kurs :: lekcja :: nr.
Anonymous





Na forum: 245 dni
Posty: 1



Anonymous Koniecznie zajrzyj na:







Wyświetl posty z ostatnich:   

Odpowiedz do tematu

Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Dodaj temat do Ulubionych
Wersja do druku

Skocz do: