Citat:
aster:
new int; ali, je problem sto se pomocu aritmetike pokazivaca, ovde *iScore++ ili iScore++ pokazivac ne pomera za jedno (int)
U tvom kodu postoji vise logickih gresaka.
Prva je u sledecem:
Ako je
iscore pointer, na sledeci element niza postavices ga sa
iscore++. Ono sto si ti napisao,
*iscore++, uvecava za 1 ono na sta pokazuje
iscore, znaci isto je kako i
(*iscore)++.
Drugi problem je u tome sto je to uvecavanje za 1 nepotrebno. Stvar je u tome sto
new uvek vraca pointer na mesto na kom je alocirao novu vrednost za tvoju promeljivu. Ti ne mozes da uvecavanjem
iScore za 1 naredis
new da alocira novi integer odmah iza prethodnog cak ni principijeno jer postoji rezijski prostor koji sadrzi podatke o bloku kog si alocirao itd. Mozda si iz toga izvukao "zakljucak" da uvecavanje za 1 "ne radi".
Jedini (dobar) nacin da imas niz promenljive duzine jeste da alociras prvo niz fiksne duzine i pamtis broj validnih elemenata u njemu, zatim ga popunjavas a onda realociras: napravis novi, duplo veci niz, prekopiras validne elemente iz prethodnog u novi, namestis pointer za trenutni niz na novi i zatim unistis prethodni. E sad i ovo je samo principijelno resenje posto ako imas niz cija duzina osciluje oko duzine jednog segmenta niza, kada se niz produzuje i skracuje u segmentima, imas i veliki
performance hit jer ces stalno smanjivati i produzavati niz.
Da se ne bi zamlacivao pisanjem programa koji sve ovo ume, posto su ljudi vec "seli i napisali", uradi ovo:
Code:
#include <vector>
using namespace std; /* Ne znam da li je ovo potrebno posto koristim G++ kome je svejedno */
...
vector<int> niz;
Normalno, mozda ces nekada hteti da vidis kako to izgleda i ispod haube. Za sada ovo radi to sto hoces i to radi vrlo efikasno.
niz sada mozes koristiti kao da je deklarisan kao obican niz.
Vrlo je dobra ideja i napustiti kretensku Madjarsku notaciju (kodiranje tipa u imenu promenljive) jer je to cista glupost i pisati recimo this_score umesto ThisScore.
f.