Wywala error przy obliczaniu zmiennej float
Sniper Elite
26.02.2014
Witam. Ostatnio mam problem z lagami i żeby napisać do hostingu muszę wyeliminować wszystkie error logi. Mam taki oto problem:
{ xp_now = float(doswiadczenie_gracza[id])-float(doswiadczenie_poziomu[poziom_gracza[id]-1]) xp_need = float(doswiadczenie_poziomu[poziom_gracza[id]])-float(doswiadczenie_poziomu[poziom_gracza[id]+1]) perc = xp_now*100.0/xp_need }
Dokładnie chodzi o linijkę:
xp_now = float(doswiadczenie_gracza[id])-float(doswiadczenie_poziomu[poziom_gracza[id]-1])
Zmienna jest zdefiniowana jako float:
new Float:xp_now
A error jaki pokazuje się w logach:
L 02/26/2014 - 10:35:23: [AMXX] Run time error 4: index out of bounds L 02/26/2014 - 10:35:23: [AMXX] [0] QTMCodMod.sma::PokazInformacje (line 9796) L 02/26/2014 - 10:35:23: [AMXX] Displaying debug trace (plugin "QTMCodMod.amxx")
Próbowałem go wyeliminować sam, ale ja tu błędu nie widzę.
Dzięki za pomoc
kyriuch
26.02.2014
Sniper Elite
26.02.2014
Nie, zmienna od poziomu ma na start wartość 1, a jeżeli jest równa 1 odpalany jest inny warunek.
new poziom_gracza[33] = 1;
kyriuch
26.02.2014
- cos nie tak z id, jesli to jest w petli,
- piszac kiedys zapis sql z floatami zauwazylem, ze dosc dziwnie one dzialaja w Pawnie
rozumiem, ze dwie pozostale zmienne to integery? probowales zamienic je na floaty? i po prostu inaczej formatowac przy wyswietlaniu?
Sniper Elite
26.02.2014
Pętli nie ma i to zapis nvault. Cała funkcja wygląda tak:
public PokazInformacje(id) { id -= ZADANIE_POKAZ_INFORMACJE; set_task(0.1, "PokazInformacje", id+ZADANIE_POKAZ_INFORMACJE); if(!is_valid_ent(id)){ return PLUGIN_CONTINUE; } new Float:xp_now new Float:xp_need new Float:perc if(!is_user_alive(id)) { new target = entity_get_int(id, EV_INT_iuser2); if(!target) return PLUGIN_CONTINUE; if (poziom_gracza[target] == 1) { xp_now = float(doswiadczenie_gracza[target]) xp_need = float(doswiadczenie_poziomu[poziom_gracza[target]]) perc = xp_now*100.0/xp_need } else { xp_now = float(doswiadczenie_gracza[target])-float(doswiadczenie_poziomu[poziom_gracza[target]]-1) xp_need = float(doswiadczenie_poziomu[poziom_gracza[target]])-float(doswiadczenie_poziomu[poziom_gracza[target]]+1) perc = xp_now*100.0/xp_need } new ileMa = doswiadczenie_gracza[target],ilePotrzeba = doswiadczenie_poziomu[poziom_gracza[target]],ilePotrzebaBylo = doswiadczenie_poziomu[poziom_gracza[target]-1] new Float:fProcent = 0.0; fProcent = (float((ileMa - ilePotrzebaBylo)) / float((ilePotrzeba - ilePotrzebaBylo))) * 100.0; set_hudmessage(0, 255, 0, 0.02, 0.23, 0, 0.0, 0.3, 0.0, 0.0); ShowSyncHudMsg(id, SyncHudObj, "Klasa : %s^nPoziom : %i (%0.1f%%)^nItem : %s^nZdrowie : %i^nWykonanych Misji : %i^nZdrowie : %i^nWytrzymalosc : %i^nKondycja : %i^nInteligencja : %i^nGrawitacja : %i^nNiewidzialnosc : %i^nCelne Oko : %i", nazwy_klas[klasa_gracza[target]], poziom_gracza[target], fProcent, nazwy_przedmiotow[item_gracza[target]], get_user_health(target), ile_wykonano[target], zdrowie_gracza[target], wytrzymalosc_gracza[target], kondycja_gracza[target], inteligencja_gracza[target], grawitacja_gracza[target], niewidzialnosc_gracza[target], celneoko_gracza[target]); return PLUGIN_CONTINUE; } //Calculate percentage of xp required to level if (poziom_gracza[id] == 1) { xp_now = float(doswiadczenie_gracza[id]) xp_need = float(doswiadczenie_poziomu[poziom_gracza[id]]) perc = xp_now*100.0/xp_need } else { xp_now = float(doswiadczenie_gracza[id])-float(doswiadczenie_poziomu[poziom_gracza[id]-1]) xp_need = float(doswiadczenie_poziomu[poziom_gracza[id]])-float(doswiadczenie_poziomu[poziom_gracza[id]+1]) perc = xp_now*100.0/xp_need } new ileMa = doswiadczenie_gracza[id],ilePotrzeba = doswiadczenie_poziomu[poziom_gracza[id]],ilePotrzebaBylo = doswiadczenie_poziomu[poziom_gracza[id]-1] new Float:fProcent = 0.0; fProcent = (float((ileMa - ilePotrzebaBylo)) / float((ilePotrzeba - ilePotrzebaBylo))) * 100.0; set_hudmessage(0, 255, 0, 0.02, 0.23, 0, 0.0, 0.3, 0.0, 0.0); ShowSyncHudMsg(id, SyncHudObj, "[Klasa : %s]^n[Poziom : %i (%0.1f%%)]^n[Item : %s]^n[Wytrzymalosc itemu : %i]^n[Zdrowie : %i]^n[Zloto : %i]^n[Punkty Honoru : %i]^n[Odwiedz CsFifka.pl]", nazwy_klas[klasa_gracza[id]], poziom_gracza[id], fProcent, nazwy_przedmiotow[item_gracza[id]], wytrzymalosc_itemu[id], get_user_health(id), monety[id], honor[id]); return PLUGIN_CONTINUE; }
A tych 2 zmiennych nie będę zmieniał na float bo nie ma takiej potrzeby i nie wiem czy nvault nie zgłupieje.
kyriuch
26.02.2014
i linia 9796 to
xp_now = float(doswiadczenie_gracza[id])-float(doswiadczenie_poziomu[poziom_gracza[id]-1])
tak?
GwynBleidD
27.02.2014
Podaj rozmiar tablic: doswiadczenie_gracza, doswiadczenie_poziomu i poziom_gracza.
Sniper Elite
27.02.2014
new doswiadczenie_gracza[33];
new const doswiadczenie_poziomu[] = { 0,50,125,225,340,510,765,1150,1500,1950,2550,3300,4000,4800,5800,7000,8500,9500,10500,11750,13000, //21 14300,15730,17300,19030,20900,23000,24000,25200,26400,27700,29000,30500,32000,33600,35300,37000,39000,41000,43000,45100,//41 47400,49800,52300,55000,57800,60700,63700,66900,70200,73700,77400,80000,82400,84900,87500,90000,92700,95500,98300,101000,//61 104000,107000,110000,113000,116000,120000,123000,126700,130000,134000,138000,142000,146000,150000,154000,158000,163000,168000,173000,178000,//81 183000,188000,194000,200000,206000,212000,218000,225000,232000,239000,246000,253000,261000,269000,277000,285000,294000,303000,500000,9999999/*101*/}
new poziom_gracza[33] = 1;
O to chodzi?
GwynBleidD
27.02.2014
Ta, może być...
1. Sprawdzaj, czy zmienna target nie jest większa od 32, np zamiast tego:
if(!target)
daj to:
if(!target or target>32)
2. Tak samo sprawdzaj, czy id nie jest większe od 32, np zamiast tego:
if(!is_valid_ent(id)){
daj:
if(!id or !is_valid_ent(id) or id>32){
3. Upewnij się, że level gracza nie jest większy od 101