Witamy na GTAOnline Obecny czas to 2017-11-20, 00:54 Użytkowników: 72225
Strona główna | Użytkownicy | Grupy | Faq | Regulamin | Zaloguj

Poprzedni temat :: Następny temat
Lua Kurs Lekcja nr. 6
Autor Wiadomość

marcin778 
Majster Bułeczka.





Informacje
Nick w MP: Ml.Bryg|Marcin
Wiek: 29
Na forum: 1031 dni
Posty: 1960
Piwa: 2680
Respekt: 836,3
Respekt: 836,3Respekt: 836,3

Wysłany: 2017-11-14, 19:00   Lua Kurs Lekcja nr. 6



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
#
[center]

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ę.

_________________
Pomagam w miarę możliwości GG: 49018649
Również robię skrypty na zamówienie.

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

-- obecnie
-- obecnie
-- dawniej
-- dawniej
-- obecnie
Postaw piwo autorowi tego posta
 
Więcej szczegółów
Wystawiono 4 piw(a):
STOPseba, BarteQ03, Szydlo, przemek1835

kamilryb1 
.skrypter. xd





Informacje
Wiek: 13
Na forum: 1148 dni
Posty: 71
Piwa: 10
Respekt: 40,5

Wysłany: 2017-11-14, 19:36   



Panie marcin778, może wytłumaczyłby Pan setTimer? :D

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





Zmiany będą się ukazywać na naszym "blogu". http://mtalife.eu
Postaw piwo autorowi tego posta
 

BarteQ03 
LUA <3





Informacje
Wiek: 15
Na forum: 392 dni
Posty: 354
Piwa: 272
Respekt: 115,3
Respekt: 115,3

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



Lub można też getTickCount :D

Komentarz marcin778 dodany 2017-11-14, 21:20Również poruszę ją w następnej części.
_________________

addEventHandler("onPlayerJoin"source, function()
setElementData(source"Pseudoskrypter"true)
setPlayerName(source"Pseudoskrypter")
end)





Postaw piwo autorowi tego posta
 

Szydlo 





Informacje
Nick w MP: Szydlo
Wiek: 17
Na forum: 467 dni
Posty: 315
Piwa: 3
Respekt: 55,3

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



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
 

przemek1835 
Ja wiem lepiej





Informacje
Nick w MP: Przemek19
Wiek: 18
Na forum: 471 dni
Posty: 318
Piwa: 159
Respekt: 80,5

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



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

_________________
Skype: Przemek19
GG: 63328662

Usługi programistyczne:
http://gtao.pl/oferuje-us...5471.htm#734722
Postaw piwo autorowi tego posta
 
Tagi: lua :: kurs :: lekcja :: nr.
Anonymous



Dołaczył: Wczoraj 0:00
Posty: 1
Skad: google.com


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
Wersja do druku

Skocz do:  


phpBB by Przemo modified by xXx 2003-2016

Template GTAONLINE created by gtaonline.pl



Strona wygenerowana w 0,78 sekundy. Zapytań do SQL: 18