Wskaźniki na zmienne w pawn

Pawn sam w sobie nie zawiera czegoś takiego jak wskaźniki ( zamiast tego mamy przekazywanie przez referencje ) jednak funkcje dostępne w amxx pozwalają na pobieranie adresu zmiennej , ustawianie wartości pod danym adresem itp. czyli wszystko co jest nam potrzebne do obsługi „wskaźników” 🙂

Przydane funkcje w AMXX do obsługi wskaźników:

  • get_addr_val – pobieranie wartość spod danego adresu
  • get_var_addr – pobieranie adresu zmiennej
  • set_addr_val – ustawianie wartości pod adresem

Jednak takie używanie może być trochę niewygodne dlatego zrobiłem mały wrapper który dodaje obsługę wskaźników bardziej podobną do tej znanej z C/C++ http://cpp0x.pl/kursy/Kurs-C++/Wskazniki/304 tzn. możemy używać & i * a dokładnie _& i __* 🙂

Pierwszy przykład kodu

#include <amxmodx>

#include "pointers.inc"

public plugin_init(){
	
	new testVariable = 1;
	
	new Pointer: testPointer = _&(testVariable);
	
	__*( testPointer ) = 2;
	
	testVariable = 3;
	
}

Drugi przykład kodu

#include <amxmodx>

#include "pointers.inc"

public plugin_init(){
	
	new testVariable = 1;
	
	new Pointer: testPointer = _&(testVariable);
	new Pointer: testPointer2 = getPointer( testVariable );
	
	log_amx( "Test 1 : %d | %d | %x" , __*(testPointer) ,getPointerValue( testPointer2 ) , testPointer );
	
	__*( testPointer ) = 2;
	
	log_amx( "Test 2 : %d | %d | %x" , __*(testPointer) ,getPointerValue( testPointer2 ) , testPointer );
	
	testVariable = 3;
	
	log_amx( "Test 3 : %d | %d | %x" , __*(testPointer) ,getPointerValue( testPointer2 ) , testPointer );
}

Logi zwracane przez ten kod

L 08/11/2013 - 15:31:06: [testPointer.amxx] Test 1 : 1 | 1 | 40fc
L 08/11/2013 - 15:31:06: [testPointer.amxx] Test 2 : 2 | 2 | 40fc
L 08/11/2013 - 15:31:06: [testPointer.amxx] Test 3 : 3 | 3 | 40fc

Ostatni parametr może być inny u was ze względu że jest to adres zmiennej.

Download pliku pointers.inc który udostępnia odpowiednie funkcje
Pointers.inc Download

  • _& – służy do pobierania adresu zmiennej
  • __* – służy do wyłuskania wartości spod danego adresu lub jeśli występuje po lewej stronie operatora = do ustawiania wartości pod adresem wskazywanym przez wskaźnik

Oprócz wrapperów na _& i __* dostajemy dostęp dodatkowo do 3 funkcji

  • getPointer( variable ) – zwraca adres zmiennej
    • variable – jakaś zmienna
  • getPointerValue( Pointer: pointer ) – zwraca wartość spod danego adresu
    • pointer – wskaźnik na zmienną
  • setPointerValue( Pointer: pointer , value ) – ustawia wartość pod danym adresem
    • pointer – wskaźnik na zmienną
    • value – wartość na jaką ustawić adres wskazywany przez pointer

2 komentarzy o “Wskaźniki na zmienne w pawn

Dodaj komentarz