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
#include
#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