Poslao: 27 Sep 2014 22:13
|
offline
- Srki94

- Mod u pemziji
- Pridružio: 14 Feb 2008
- Poruke: 12405
|
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: 14825
- 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: 3760
- 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: 3760
- 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
|
|
|
|
|