[ ljube @ 14.09.2004. 20:34 ] @
Zdravo, imam sledece strukture kojima zelim da pristupim preko pointera:

Code:

typedef struct _PROPERTYITEM
{
  char  propName[255];
  char  curValue[255];
  int  nItemType;
  char  cmbItems[255];
  char  Description[255];
}PROPERTYITEM, *LPPROPERTYITEM;


typedef struct _PropertyDescriptor
{
  int      count;
  struct _PROPERTYITEM*  pit_pointer;
}PropertyDescriptor, *LPPROPERTYDESCRIPTOR;


U programu mi je potrebno da dinamicki kreiram broj PROPERTYITEM-a pa ih allociram kao:
Code:

static PropertyDescriptor PropertySpaceHoldeer;
static int     PropertySpaceHoldeerPointer; 
static int     p_items;
p_items =  24; // alociraj prostor za 24 property item-a
PropertySpaceHoldeer.pit_pointer=calloc(p_items+1,sizeof(PROPERTYITEM));


Problem mi je da ne znam kako da pridjem clanovima struktura.
Za clanove tipa char uspio sam to rijesiti kao:

Code:

strcpy(PropertySpaceHoldeer.pit_pointer->propName+(sizeof(PROPERTYITEM)*PropertySpaceHoldeerPointer), PropertyName);

gdje mi varijabla PropertySpaceHoldeerPointer pokazuje na indeks kojem zelim pristupiti ali ne znam kako da pridjem int clanu (nItemType) na odredjenom indeksu.

Ovo vjerovatno spada u pocetnicka pitanja, ali nikad do sada nisam imao potrebu radim sa pointerima na array jedne strukture koja se nalazi unutar druge.

Pokusao sam ovo:
PropertySpaceHoldeer.pit_pointer->nItemType = 2 // ovaj je na 0-tom indeksu i to je OK, ali kako de pristupim recimo 15 indeksu.

PropertySpaceHoldeer.pit_pointer->nItemType[15] = 2 // to ne radi :(

Pozdrav,
Ljubisa
[ cicika @ 14.09.2004. 22:02 ] @
Citat:
PropertySpaceHoldeer.pit_pointer->nItemType[15] = 2 // to ne radi


To i ne može da radi s obzirom da ti je nItemType deklarisana kao celobrojna promenljiva a ne kao niz.
[ Marko Stankovic @ 14.09.2004. 22:09 ] @
Samo si promasio mesto gde trebas staviti zagrade, ako zelimo da pristupimo 16. clanu u nizu, odnosno clanu sa indeksom 15 mozemo to uraditi ovako:

Code:

((PropertySpaceHoldeer.pit_pointer)+15)->nItemType = 2

a moze i ovako:
Code:

PropertySpaceHoldeer.pit_pointer[15].nItemType = 2

u prvom primeru mislim da ti nisu potrebne unutrasnje zagrade ali sam ih ja stavio za svaki slucaj jer sam zaboravio prioritete :) Ovo sto si ti napisao imalo bi neki smisao da je nItemType niz celih brojeva i time bi u taj niz upisao 2 na 16. mestu i to u strukturu koja je na prvom mestu tvog niza struktura (sta li sam sada rekao ni meni nije jasno :). U svakom slucaju ne bi uradio ono sto si mislio.
Da probam malo jasnije da odgovorim na sve ovo. Znaci tebi je PropertySpaceHoldeer.pit_pointer pokazivac na niz koji si alocirao. E sada kada hoces da pristupis nekom n elementu iz niza dovoljno je da taj pokazivac povecas za n. Odnosno

PropertySpaceHoldeer.pit_pointer+n

ovaj izraz ce pokazivati na n-ti clan. i sada samo dodas operator -> i to je to.
U drugom primeru mozemo slobodno koristiti operator '.' jer kada stavimo zagrade i indeks unutra mi dobijamo podatak na koji pokazuje pokazivac povecan za n (n je broj koji smo stavili u zagradi) a to je vec trazena struktura sa indeksom n i unutar nje pristupas sa tackom.


e da samo jedno pitanje, kod alociranja
Code:

PropertySpaceHoldeer.pit_pointer=calloc(p_items+1,sizeof(PROPERTYITEM))

sta ce ti p_items+1. To ce alocirati 25 mesta, a tebi je potrebno 24 koliko ja vidim.

Ako ti je nesto od ovog jasno vici da jos malo zakomplikujem ;)
poz
[ Marko Stankovic @ 14.09.2004. 22:32 ] @
Hm sta se to desilo ovde jel nam se to filmil javlja iz buducnosti :) pise da je filmil poslao poruku 15.09. u 01:11 a trenutno je jos uvek 14. :)

evo i attachment cu ostaviti kao dokaz :)
[ filmil @ 15.09.2004. 00:11 ] @
Citat:
PropertySpaceHoldeer.pit_pointer-nItemType[15] = 2 // to ne radi :(
Ovo ti ne radi zato što je nItemType deklarisan kao int.

Pogledaj tabelu prioriteta operatora. Ovaj izraz je ekvivalentan sa:

Code:
((PropertySpaceHoldeer.pit_pointer)-nItemType)[15]
 
 
što je očigledno sintaksna greška, jer tražiš indeks od inta, a ne od niza.

Dobitna kombinacija:

Code:
PropertySpaceHoldeer.pit_pointer[15].nItemType
 
 
(operator „tačka“ ti treba jer je izraz ekvivalentan sa: (*(PropertySpaceHoldeer.pit_pointer + 15)).nItemType. )

f

[Ovu poruku je menjao filmil dana 15.09.2004. u 01:19 GMT]
[ ljube @ 15.09.2004. 10:00 ] @
PropertySpaceHoldeer.pit_pointer[p_index].nItemType radi odlicno.
Ja sam pokusavao sa PropertySpaceHoldeer.pit_pointer[p_index]->nItemType - ali naravno nije radilo.

Još uvijek ne razumijem najbolje kako ovo radi, čak je u suprotnosti sa nekom logikom kako sam ja mislio da treba, ali bitno je da radi, a ja ću ,malo eksperimentisati sa sličnim strukturama da shvatim ispravnu logiku.

Mnogo hvala svima!




Citat:

e da samo jedno pitanje, kod alociranja
Code:

PropertySpaceHoldeer.pit_pointer=calloc(p_items+1,sizeof(PROPERTYITEM))


sta ce ti p_items+1. To ce alocirati 25 mesta, a tebi je potrebno 24 koliko ja vidim.


Tacno, nek se nađe još jedan, za svaki slučaj (to je neki bug u mojoj glavi ali uvijek to radim - dodam još jedan)