Użycie float - tag mismatch
Best Answer wiwi249 06.04.2016 13:24
public WymaganyExp( PoziomGracza )
zamien na
public Float:WymaganyExp( PoziomGracza )
Skoro funkcja ma zwracać typ float, to musisz o tym powiadomić kompilator.
po drugie
Float:Pow( Float:PoziomGracza, Float:2 );
czemu tak? Skoro jest funkcja która przyjmuje 2 argumenty, jak mniemam podstawa i wykładnik, to po prostu podajesz te argumenty, bez typów, bo typy danych określa funkcja (to samo tyczy się returna)
W sourcemod, tak jak w AMXX, jak chcesz przekonwertować typ int na float to musisz użyć funkcji float():
Pow( float(PoziomGracza), float(2) );
Bo zakładam że funkcja Pow przyjmuje oba argumenty typu float.
OKCancel
Go to the full post
wonsz żeczny
06.04.2016
Witam.
Uczę się sourcemoda bo pawn już trochę stary itd. i w ramach nauki piszę sobie exp moda.
Napotkałem pewien problem, w pawnie by mi tak pewnie działało
Otóż do ustalenia wymaganego doświadczenia na kolejny poziom postanowiłem użyć potęgowania.
public WymaganyExp( PoziomGracza ) { return Float:Pow( Float:PoziomGracza, Float:2 ); }
Tak wywala 1 błąd Tag Mismatch do tej linijki w środku.
Oczywiście próbowałem
public WymaganyExp( Float:PoziomGracza ) { return Float:Pow( Float:PoziomGracza, Float:2 ); }
Gdzie wyżej w kodzie rejestrując ten public dałem też float w indeksie ale też lipa.
public WymaganyExp( PoziomGracza ) { return Float:Pow( PoziomGracza, 2 ); }
Tak też nic a nawet usunąłem wszędzie floata i nic z tego.
Dlaczego tak się dzieje?
Best Answer
wiwi249
06.04.2016
public WymaganyExp( PoziomGracza )
zamien na
public Float:WymaganyExp( PoziomGracza )
Skoro funkcja ma zwracać typ float, to musisz o tym powiadomić kompilator.
po drugie
Float:Pow( Float:PoziomGracza, Float:2 );
czemu tak? Skoro jest funkcja która przyjmuje 2 argumenty, jak mniemam podstawa i wykładnik, to po prostu podajesz te argumenty, bez typów, bo typy danych określa funkcja (to samo tyczy się returna)
W sourcemod, tak jak w AMXX, jak chcesz przekonwertować typ int na float to musisz użyć funkcji float():
Pow( float(PoziomGracza), float(2) );
Bo zakładam że funkcja Pow przyjmuje oba argumenty typu float.
OKCancel
Edited by wiwi249, 06.04.2016 13:25.
plx211
06.04.2016
Wyjasnione, ale pozwole wtracic swoje 4 grosze.
LVL, Exp wedlug mnie powinny byc typu integer, float nie jest precyzyjny.
Twoja fn zapisal bym tak (nowa skladnia):
public int WymaganyExp(int lvl) { return lvl * lvl; // pow() jedynie gdybys chcial do wiekszej potegi podniesc }
Jak twoja zmienna jest typu float (i jest to wymuszone czyms) to wtedy:
float zmienna = float(WymaganyExp(12));
p.s.
w codmod'zie nowym z cs1.6, exp byl generowany wzorem:
lvl^2 * lvl_ratio
polecam ci ten sposob
grankee
07.04.2016
LVL, Exp wedlug mnie powinny byc typu integer
Dobrze gada, polać mu.
Przeczytaj poradnik o wadach floata.