Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Wskaźniki na zmienne w pawn

wskaźniki na zmienne pawn

  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
Brak odpowiedzi do tego tematu

#1 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 553
Godlike

  • Postów:11 976
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 12.09.2013 22:43

*
Popularny

http://darkgl.amxx.p...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/kurs... /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.

Plik pointers.inc udostępnia takie funkcje
  • _& - 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
Załączony plik  pointers.inc   703 bajtów  54 Ilość pobrań

  • +
  • -
  • 8





Również z jednym lub większą ilością słów kluczowych: wskaźniki, na, zmienne, pawn

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych