Poslao: 27 Sep 2014 22:13
|
online
- Srki94
- Mod u pemziji
- Pridružio: 14 Feb 2008
- Poruke: 12391
|
Testiram neki kod i naleteo sam na bug koji se vratio ...
Da li ste ikada videli ovakvu petlju ?
var QCnt : int = 0;
for (var i = 0; i <= linije.Length-1; i++){
test[QCnt].QID= parseInt(linije[i]);
i++;
test[QCnt].QTXT= linije[i];
i++;
test[QCnt].A1TXT= linije[i];
i++;
test[QCnt].A2TXT= linije[i];
i++;
test[QCnt].A3TXT= linije[i];
i++;
test[QCnt].A4TXT= linije[i];
i++;
test[QCnt].C1= parseInt(linije[i]);
i++;
test[QCnt].C2= parseInt(linije[i]);
i++;
test[QCnt].C3= parseInt(linije[i]);
i++;
test[QCnt].C4= parseInt(linije[i]);
QCnt++ ;
}
Da li vidite neki potencijalni problem sa tim kodom ili neku nelogičnost ?
Šta još treba da znate o kodu :
test je niz klase sačinjene od različitih tipova promenljivih - koji se mogu videti u kodu iznad (QID, QTXT, ID... )
Dakle test = ImeKlase[20];
Imeklase{
QID :int;
QTXT : string;
...
}
//
Test niz izgleda ovako ako sve bude ok :
test[0].QID = 23;
...
test[1].QID = 25;
...
//
Postoji jedan storage fajl sa istim formatom unosa :
23 [end]
Test [end]
Mycity
forum [end]
bla[end]
...
Ja delim taj storage fajl upotrebom .Split() u niz linije i zatim prolazim kroz ceo niz i brišem sve \n i \r charove.
Tako da taj niz na kraju dobije ovakav izgled :
linije[0] = 23
linije[1] = Test
linije[2] = MyCity forum
linije[3] = bla
I sada dolazimo do onog prvog koda gore, koji iz tog niza popunjava niz klase.
I šta je tu problem ?
Kod nekada perfektno radi, kod nekada ne radi uopšte, kod nekada radi ali dobijem grešku poput :
Array Index Out of Range ili da je unos u pogrešnom formatu kod parseInta ... Što nagoveštava da grešim negde sa i brojačem ali to nije istina jer i kada se pojavi greška sve radi perfektno... Dok ne dodam neki novi unos u storage fajlu.
Svi predlozi dobrodošli ...
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 27 Sep 2014 22:49
|
offline
- vasa.93
- Moderator foruma
- Pridružio: 17 Dec 2007
- Poruke: 14809
- Gde živiš: Niš
|
Da li je broj linija uvek jednak proizvodu broja atributa i broja objekata koji se čitaju?
Inače, ovakav način pisanja petlji je uvek rizičan za "Array Index Out of Range" izuzetke. Zašto? Zato što se promenljiva i menja i u zaglavlju petlje, ali i u telu petlje, a koristi se kao indeks unutar petlje. Uzmi za primer da ti je linije.Length = 3. Tada je početni uslov za petlju zadovoljen, ali si ti već nakon trećeg inkrementiranja van dužine niza linije.
|
|
|
|
|
Poslao: 28 Sep 2014 07:52
|
offline
- Rastafarii
- Moderator foruma
- Pridružio: 22 Mar 2006
- Poruke: 3747
- Gde živiš: 127.0.0.1
|
vasa.93 ::ovakav način pisanja petlji je uvek rizičan za "Array Index Out of Range" izuzetke
U ovom konkretnom slucaju "Array Index Out of Range" nije rizican, vec skoro siguran, osim ako duzina niza "linije" nije deljiva sa 10 bez ostatka.
Ja bih pre uradio ovako nesto:
//uvek izbaci kalkulacije van petlje
var limit = Math.ceil(linije.length / 10);
for (var i = 0; i < limit; i++){
var idx = (i - 1) * 10;
var tmp = {
QID : typeof linije[idx] !== "undefined" ? linije[idx] : "n/a",
QTXT : typeof linije[idx+1] !== "undefined" ? linije[idx+1] : "n/a",
A1TXT : typeof linije[idx+2] !== "undefined" ? linije[idx+2] : "n/a",
A2TXT : typeof linije[idx+3] !== "undefined" ? linije[idx+3] : "n/a",
A3TXT : typeof linije[idx+4] !== "undefined" ? linije[idx+4] : "n/a",
A4TXT : typeof linije[idx+5] !== "undefined" ? linije[idx+5] : "n/a",
C1 : typeof linije[idx+6] !== "undefined" ? linije[idx+6] : "n/a",
C2 : typeof linije[idx+7] !== "undefined" ? linije[idx+7] : "n/a",
C3 : typeof linije[idx+8] !== "undefined" ? linije[idx+8] : "n/a",
C4 : typeof linije[idx+9] !== "undefined" ? linije[idx+9] : "n/a",
};
test.push(tmp);
}
uz napomenu da nemam pojma o kom se jeziku radi, ali da jako lici na javascript, pa sam u njemu napisao kod iznad.
|
|
|
|
Poslao: 28 Sep 2014 10:51
|
offline
- morando
- Građanin
- Pridružio: 19 Maj 2011
- Poruke: 297
|
var repeat: int = linije.Length - 1 / 10;
Pazi ovde, deljenje ima prednost!
Da bi ti kod bio citljiviji i sigurniji prvo sto upises u fajl bi trebalo da bude sam broj unosa.
var count : int = parseInt(linije[0]);
var test : ImeKlase [count];
for (var iUnos = 0; iUnos < count; ++iUnos) {
test[iUnos].QID = parseInt(linije[iUnos * 10 + 1 + 0]); // +1 zato sto preskacemo prvu liniju (broj unosa)
test[iUnos].QTXT = linije[iUnos * 10 + 1 + 1];
...
test[iUnos].C4 = parseInt(linije[iUnos * 10 + 1 + 9]);
}
Kad si vec korisito Debug.Log trebao si ispisivati sadrzaj instanci a ne kauntera (i) da bi bolje video sta se dogadja.
Mozda sam pogresio u sintaksi jer ne poznajem Unity javascript-like skript jezik.
|
|
|
|
|
Poslao: 28 Sep 2014 11:50
|
offline
- morando
- Građanin
- Pridružio: 19 Maj 2011
- Poruke: 297
|
Da, puta deset, to sam zaboravio.
Dodje mi komsija i dok smo pili kafu seti se toga ali ne stigoh da ispravim.
|
|
|
|
|
Poslao: 28 Sep 2014 20:02
|
offline
- Rastafarii
- Moderator foruma
- Pridružio: 22 Mar 2006
- Poruke: 3747
- Gde živiš: 127.0.0.1
|
Srki, a jesi li razmisljao da umesto plain-text storage fajla koristis JSON? Tako ti ne treba ovaj kod uopste
|
|
|
|
|