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

Funkcja zwracającaZwrot przez referencje


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
2 odpowiedzi w tym temacie

#1 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 17.05.2010 22:53

Witam.
Otóż jako, że dawno tu nie wtrącałem swoich trzech groszy, a właśnie przez własną pomyłkę wpadłem na sposób (kombinowałem i zapomniałem dopisać na początku 'public' :lol:) jak zwracać zmienne przez referencje, postanowiłem napisać poradnik.


public test(id)
{
new num=0,slowo[7]
sprawdz(num,slowo)
client_print(id,print_chat,"num=%d | slowo:%s",num,slowo)
return 1
}
sprawdz(&num,slowo[])
{
num=16
add (slowo,6,"123456")
return 0
}



Oczywiście Graczowi zostanie wypisane to co w funkcji sprawdz() ustalono.

Warunki działania:
1)Deklaracja funkcji nie zawiera przedrostka
 public

sprawdz(&num,slowo[])     // DOBRZE!!!

public sprawdz(&num,slowo[])     // ŹLE!!!



2)Każda zmienna typu integer musi mieć przed nazwą znaczek
&

sprawdz(&num,slowo[])     // DOBRZE!!!

sprawdz(num,slowo[])     // ŹLE!!!

Chociaż w drugim przypadku sama konstrukcja funkcji jest poprawna, jednak zmienna num zostanie jedynie przyjęta do funkcji jako parametr, ale w przypadku zmiany jej wartości wewnątrz funkcji "sprawdz" nie zostanie ona przekazana do funkcji "test" (jej wartość w funkcji test nie ulegnie zmianie).

3)Każda zmienna typu string (ciąg znaków char[]) nie może być poprzedzona znakiem
&
ponieważ kompilator wywali błąd. Mimo braku owego znaczka wartość zostanie zwrócona przez referencję do wnętrza unkcji "test"

Oczywiście zmienna typu char[] może mieć określoną liczbę znaków, na przykład:
sprawdz(&num,slowo[15])     // DOBRZE!!!


Nie jestem pewny, ale chyba nie ma narzuconej kolejności, że np. najpierw muszą być parametry zwykłe, a później te, które coś zwracają przez referencję. Gdyby jednak się okazało, że są jakieś błędy przy kompilacji lub po kompilacji w czasie używania coś jest nietak, są jakieś błędy, to prawdopodobnie trzeba umieścić najpierw zmienne niereferencyjne, a później referencyjne, na przykład:
sprawdz(param1,&num,slowo[])     // DOBRZE!!!

ale raczej wydaje mi się, że kolejność jest bez znaczenia.
  • +
  • -
  • 4

#2 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

  • Postów:3 563
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 18.05.2010 09:16

Grankee wrociles :D

btw referencja jest to dzialanie na oryginalnej zmiennej i jej adresie a nie na lokalnej kopii jak to jest w przypadku normalnych parametrow :D

nie pisales nic o tablicach ale zeby tablice przekazac przez referencje uzywamy chyba konstrukcji &(tablica)[] ale nie jestem pewien wiem ze w C++ musialem tak robic :D

// aha co sie stanie jak nie dam public i nie uzyje referencji jak zostanie uzyta powstala funkcja :?: bo sie nad tym zastanawialem troche :D
  • +
  • -
  • 0
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#3 grankee

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 18.05.2010 11:18

W PAWNie nie ma wskaźników tak więc nie da się zadziałać dosłownie na oryginalnej zmiennej, ale jest to rozwiązane w ten właśnie sposób.
 

sprawdz(&num,slowo[])     // DOBRZE!!!
sprawdz(num,slowo[])     // ŹLE!!!
Chociaż w drugim przypadku sama konstrukcja funkcji jest poprawna, jednak zmienna num zostanie jedynie przyjęta do funkcji jako parametr, ale w przypadku zmiany jej wartości wewnątrz funkcji "sprawdz" nie zostanie ona przekazana do funkcji "test" (jej wartość w funkcji test nie ulegnie zmianie)

 

Co do tablic to jest tak jak napisałem, sprawdzałem.


Użytkownik grankee edytował ten post 17.11.2014 02:15

  • +
  • -
  • 0




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

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