Często podczas prac nad pluginem w kodzie muszę „przeliterować” po elementach tablicy czy wszystkich graczach. Pisanie rozbudowanej pętli for jest meczące i nużące więc pomyślałem że foreach znane z php było by znacznym ułatwieniem.
http://php.net/manual/en/control-structures.foreach.php
Najpierw opis samych funkcji ( które są tak naprawde makrodefinicjami )
- foreach – „przeliterowuje” po całej tablicy i przypisuje wartość aktulnie używanego elementu do zdefiniowanej zmiennej
dwa parametry- 1 – tablica po której trzeba przeliterować
- 2 – nazwa zmiennej do której będzie zapisywany aktualny element
- forrange2 – wylicza kolejne wartości liczbowe i przypisuje je do zmiennej. Inspirowalem się funkcją range w php i python
dwa parametry ( liczba po nazwie określa ilość parametrów )- 1 – nazwa zmiennej do które będzie zapisywana aktualna wartość
- 2 – górny indeks do którego nastąpi odliczanie, odliczanie startuje od 0 do właśnie tego parametru – 1 z krokiem inkrementacyjnym równym 1 np. 0 , 1 , 2 , 3
- forrange3 – to samo co funkcja wyżej
Trzy parametry- 1 – nazwa zmiennej
- 2 – dolny indeks od którego zacznie się odliczanie
- 3 – górny indeks tak jak parametr 2 w funkcji forrange2
Przykład dla dolnego indeksu równego 3. 3 , 4 , 5 , 6
- forrange4 – To samo co funkcje wyżej
Cztery parametry- 1- nazwa zmiennej
- 2- dolny indeks tak jak w forrange3
- 3 – górny indeks tak jak w forrange3
- 4- krok inkrementacji np. możemy ustawić go na 10 więc liczby bedą się zwiększac o 10 co każdy krok
Przykład 0 , 10 , 20 , 30 , 40 , 50
Definicje które trzeba dodać do pluginu
#define foreach(%1,%2) for( new iCurrentElement = 0 , %2 = %1[ 0 ]; iCurrentElement < sizeof %1 ; iCurrentElement++ , %2 = iCurrentElement < sizeof %1 ? %1[ iCurrentElement ] : 0 ) #define forrange4(%1,%2,%3,%4) for( new %1 = %2; %1 < %3 ; %1 += %4 ) #define forrange3(%1,%2,%3) for( new %1 = %2; %1 < %3 ; %1 += 1 ) #define forrange2(%1,%2) for( new %1 = 0; %1 < %2 ; %1 += 1 )
Przykład użycia
#include <amxmodx> #include <amxmisc></amxmisc></amxmodx> #define PLUGIN "New Plugin" #define AUTHOR "DarkGL" #define VERSION "1.0" #define foreach(%1,%2) for( new iCurrentElement = 0 , %2 = %1[ 0 ]; iCurrentElement < sizeof %1 ; iCurrentElement++ , %2 = iCurrentElement < sizeof %1 ? %1[ iCurrentElement ] : 0 ) #define forrange4(%1,%2,%3,%4) for( new %1 = %2; %1 < %3 ; %1 += %4 ) #define forrange3(%1,%2,%3) for( new %1 = %2; %1 < %3 ; %1 += 1 ) #define forrange2(%1,%2) for( new %1 = 0; %1 < %2 ; %1 += 1 ) public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) new testArray[] = { 1 , 2 , 3 , 4 }; foreach( testArray , value ){ log_amx( "each %d" , value ); } log_amx( "Range 1" ); forrange2( value , 5 ){ log_amx( "range1 %d" , value ); } log_amx( "Range 2" ); forrange3( value , 1 , 5 ){ log_amx( "range2 %d" , value ); } log_amx( "Range 3" ); forrange4( value , 0 , 100 , 10 ){ log_amx( "range3 %d" , value ); } }
zwracane wartości
[testFor.amxx] each 1 [testFor.amxx] each 2 [testFor.amxx] each 3 [testFor.amxx] each 4 [testFor.amxx] Range 1 [testFor.amxx] range1 0 [testFor.amxx] range1 1 [testFor.amxx] range1 2 [testFor.amxx] range1 3 [testFor.amxx] range1 4 [testFor.amxx] Range 2 [testFor.amxx] range2 1 [testFor.amxx] range2 2 [testFor.amxx] range2 3 [testFor.amxx] range2 4 [testFor.amxx] Range 3 [testFor.amxx] range3 0 [testFor.amxx] range3 10 [testFor.amxx] range3 20 [testFor.amxx] range3 30 [testFor.amxx] range3 40 [testFor.amxx] range3 50 [testFor.amxx] range3 60 [testFor.amxx] range3 70 [testFor.amxx] range3 80 [testFor.amxx] range3 90
Jak widać funkcje znacznie ułatwiają przeglądanie tablic po za tym kod wygląda lepiej.
na wstępie mówiłem o
po elementach tablicy czy wszystkich graczach
jak widać najlepiej zastosowac tu funkcje forrange3
forrange( currentPlayerID , 1 , 33 )
( zamiast stałej 33 można też wstawić pobieranie ilości slotów )
Faktycznie, bardzo ciekawa alternatywa dla pętli for
Możesz robić też funkcję repeat( num ), czyli funkcja która wykona się num razy. Coś z colobota 😛
Możesz opisać dokładniej 😉 ?
@GT TEAM to nie takie proste jak się wydaje