[ Nikolavlasotince @ 14.04.2007. 16:31 ] @
Moze li mi neko objasniti kako se koriste pointeri u Delphi-u i zasta sluze. Mislim da imaju nekakve veze sa nizovima ali ne znam bas kakve. Pozdrav |
[ Nikolavlasotince @ 14.04.2007. 16:31 ] @
[ Miloš Baić @ 14.04.2007. 17:32 ] @
Pokazivači, Pointers, su promenljive koje mogu sadržati adresu nekog podatka u memoriji. Opisuju se sa ^Tip. Na osnovu operatora @ može da se definiše adresa nekog podatka. Pristup do podataka na osnovu adrese se vrši sa Ime_Pokazivaca^.
Code: type Ptip = ^Real; //pokazivacki tip var Prvi, Drugi: Real; Broj: Ptip; //pokazivacka promenljiva begin Broj:= @ Prvi; //adresa promenljive Prvi Broj^:= 55.22; // Prvi := 55.22 Drugi:= Broj^; // Drugi:= Prvi Postoje pokazivači na potprograme, ali se nazivaju proceduralni tipovi (procedural types). [ Nikolavlasotince @ 14.04.2007. 18:23 ] @
Hvala na pomoci. Razumeo sam taj deo. Sta je ^TNode? Sta znaci nekapromenljiva^.nesto npr: q^.Num = .....
Da to nije mozda promenljiva koja je ubacena u pointer q pa onda .Num = ? ili nesto sl. Pozdrav [ vlaiv @ 15.04.2007. 22:58 ] @
Citat: Nikolavlasotince: Sta je ^TNode? Sta znaci nekapromenljiva^.nesto npr: q^.Num = ..... Da to nije mozda promenljiva koja je ubacena u pointer q pa onda .Num = ? ili nesto sl. Konkretan primer koji si naveo nekapromenljiva^.nesto je zapravo sledeci slucaj "nekapromenljiva" je pointer na strukturu koja kao clan sadrzi "nesto" nekapromenljiva^ je zapravo ta struktura (na koju nekapromenljiva pokazuje) a .nesto je klasicno referenciranje elementa strukture ... ^TNode je definicija pointera na neki tip, a to node mi govori da je u pitanju neka drvoidna ili listoidna struktura ... Pointeri na strukture se uglavnom u paskalu koriste za bas to - pravljenje dinamickih struktura - lista, stabala i tome slicno... [ Nikolavlasotince @ 17.04.2007. 13:28 ] @
Hvala sto si mi bar malo pojasnio rad sa pointerima.
POzdrav [ Milan Milosevic @ 17.04.2007. 18:29 ] @
Izbegavaj u delphi-ju koriscenje dinamickog programiranja i koriscenja pointera na taj nacim mozes sebe da postedis frustracije, i cudnih gresaka u kodu koje fizicki nisu vidljive.
[ Nikolavlasotince @ 18.04.2007. 12:55 ] @
OK, hvala na savetu.
[ priki @ 21.04.2007. 08:56 ] @
Citat: Milan Milosevic: Izbegavaj u delphi-ju koriscenje dinamickog programiranja i koriscenja pointera na taj nacim mozes sebe da postedis frustracije, i cudnih gresaka u kodu koje fizicki nisu vidljive. ne slazem se sa ovim samo onaj ko nema dobru kontrolu sa onim sto radi moze ovako nesto napisati [ Milan Milosevic @ 21.04.2007. 09:27 ] @
Dobro ond daj nam neki pozamasni kod koji je u potpunosti dinamicki uraden, pa da nesto naucimo.
[ Srki_82 @ 21.04.2007. 09:47 ] @
@Milan Milosevic
Necu ti dati kod, ali cu ti dati primer... ceo VCL framework u Delphi-u. On je prilicno dobro uradjen, a sve se kreira dinamicki. Citat: ...cudnih gresaka u kodu koje fizicki nisu vidljive. Kakve su to cudne greske i sta znaci "fizicki nevidljiva greska u kodu"? [ priki @ 21.04.2007. 10:33 ] @
prva stvar:
delphi ima najbolji debuger na planeti zemlji da ga koristis kako treba nikad ne bi ni pomislio da ovako nesto kazes a kamoli da napises na ovakvom forumu Citat: Milan Milosevic: .... i cudnih gresaka u kodu koje fizicki nisu vidljive.. druga stvar, @Srki_82 ti je sve rekao oko dinamickog kreiranja pozdrav [ Milan Milosevic @ 21.04.2007. 11:08 ] @
fizicki nevidljiva greska je greska koja se ne vidi na prvi pogled i debager je ne prepoznaje kao gresku nije greska ni u kodu jednostano dode do prekalpanja memoriskih lokacija u jednom trenutku i program podivlja. Ne kazem da greska nije do programera. Ali prosto ne uvidis gresku odmah a kasnije je kasno. Kad unapred znas sta ti je sta toga jednostavno nema. Miran si i ne gubis vreme.
[ Srki_82 @ 21.04.2007. 11:50 ] @
Debuger i ne moze da prepozna gresku, on sluzi da bi ti pronasao logicke greske u svom kodu (verovatno na to mislis kad kazes fizicki nevidljive greske u kodu). Greska u kodu moze da ti bude i to sto si stavio X := Y /100 umesto X := Y / 1000. Delphi ti nece reci da je to greska... otkud Delphi zna da ti neces bas to da uradis?
![]() Zato ti vidis da ti program ne radi dobro, pa pokrenes debug, dodjes do dela gde program pocne cudno da se ponasa i vidis da X ima pogresnu vrednost... vratis se malo nazad da vidis gde postavljas X i vidis da si zaboravio jednu nulu. Drugi primer gde se cesto gresi... deklarises globalnu i lokalnu promenljivu sa istim imenom i negde u kodu mislis da pristupas globalnoj promenljivoj, ali ustvari pristupas lokalnoj... kod izgleda dobro, Delphi ne prijavljuje gresku, ali opet ne radi. Eto... greska se ne vidi, a dinamickog kreiranja nigde... sad ti mozes da kazes kako je programer kriv sto je promenljive nazvao istim imenom ili je zaboravio nulu i da se to lako ispravi, a ja kazem isto tako da je programer kriv sto nije proverio da li je objekat vec dinamicki kreiran pre nego sto ga je ponovo kreirao ili nije proverio da li je objekat kreiran pre nego sto je pokusao da ga unisti. Poenta je u tome da ako nesto naucis, nije ti tesko to da koristis. [ priki @ 21.04.2007. 12:13 ] @
Citat: Milan Milosevic: fizicki nevidljiva greska je greska koja se ne vidi na prvi pogled i debager je ne prepoznaje kao gresku nije greska ni u kodu jednostano dode do prekalpanja memoriskih lokacija u jednom trenutku i program podivlja. Ne kazem da greska nije do programera. Ali prosto ne uvidis gresku odmah a kasnije je kasno. Kad unapred znas sta ti je sta toga jednostavno nema. Miran si i ne gubis vreme. stari, do preklapanja memorijskih lokacija moze doci jedino tvojom greskom mislim da su memorijske lokacije nesto najvaznije o cemu brinu oni koji projektuju programske jezike jer Delphi ti je alat, kao sto je aparat za varenje alata za autolimara i to je kao da si rekao, "pa bila neka greska na crevu i svi odleteli u vazduh" zamolio bi te da ne postujes neke tvrdnje za koje nisi siguran prvo pitaj, dobices odgovor ovo sto si napisao je cista glupost srdjos [ Milan Milosevic @ 21.04.2007. 13:19 ] @
Pa mogu da navedem odprilike sta se kod mene desavalo. Ne mogu da vam dam kod jer je odavno promenjen. Svar ide ovako nekako.
Definisem lokalnu promenjivu V nekog tipa i to radi ok. Testiram proceduru sve radi ko sto je predvideno. Zati dalje u kodu recimo sam sprilike defnisao niz dinamicki var n:array of extended; i ko zna sta jos. I tada pocinje da me zeza. I to tako sto u zavinosti od vrednosti nekog elementa niza menja se vrednost moje promenjive V. Onda muke i dovijanja da se to sredi. Onda isti problem na neku drugu promenjivu. Sve je pisano korektno a opet ne radi.I to ne odmah vec kad stvar podmakne tako da ne mozes nikako da ispravis stavari. Onda sedes zamenis dinamisko niz sa nekim nizom n:array[0..1000] of extended; i nema vise greske sve radi ok. Na takvu ja gresku mislim. [ priki @ 21.04.2007. 13:35 ] @
prva stvar
nadji malo literature i procitaj sta je codenaming (pravila definisanja promenjivih) dakle, ako definises neku promenjivu, daj tom imenu neki smisao, za cega je ta promenjiva namenjena, a ne slovo V ili n recimo ovako Code: var nizExt: array of extended; ili Code: var nizBoja: array of TColor; druga stvar, kod dinamickih nizova moras definisati njihovu velicinu bez toga ti nece raditi Code: SetLength(nizBoja, 100); to sto si naveo je amaterska greska oko manipulisanja clanovima u nizu ili sta si vec radis sa nizom a nikakva greska od Delphija a kamoli da ima veze sa memorijom postuj kod pa cemo videti srdjos [ Milan Milosevic @ 21.04.2007. 13:43 ] @
Pa to sam naveo kao primer promenjive su imale drugacije oznake. Trenutno primer nemam za to. Ako se ponovo javi takav slucaj otvoricu temu pa cemo ga detaljnije analizirati. To se ne desava vec duze vreme jer prosto kaoristim ono sto kod mene radi odlicno pa nemam potrebu da menjam.
[ priki @ 21.04.2007. 13:51 ] @
Citat: Milan Milosevic: Pa to sam naveo kao primer promenjive su imale drugacije oznake. Trenutno primer nemam za to. Ako se ponovo javi takav slucaj otvoricu temu pa cemo ga detaljnije analizirati. To se ne desava vec duze vreme jer prosto kaoristim ono sto kod mene radi odlicno pa nemam potrebu da menjam. pajto, bez uvrede ali izgleda da stvarno imas frke oko promenjivih @srki_82 je odmah pogodio probaj to da ispravis i da pocnes to da primenjujes na nacin koji je svima razumljiv, pre svega tebi ima i slucajeva da su ljudi dobijali otkaze zbog nepostovanja namecoding-a u programerskim firmama [Ovu poruku je menjao priki dana 21.04.2007. u 15:08 GMT+1] [ Srki_82 @ 21.04.2007. 22:02 ] @
Najverovatnija greska koju si imao kada si koristio dinamicke nizove je to sto si ili zaboravljao da alociras dovoljnu kolicinu memorije da podatke smestis u nju, ili si citao podatak sa indexom npr. 2345, a alocirao si memoriju i popunio niz sa 1000 elemenata.
Ne kazem da uvek treba koristiti dinamicko kreiranje objekata... zbog cega bi neko pisao: Code: var Niz: array of Integer; begin SetLength(Niz, 10); . . . Niz := nil; end; kad moze Code: var Niz: array [0..9] of Integer; begin . . . end; ili zasto Code: var Broj: ^Integer; begin New(Broj); Broj^ := 5; . . . Dispose(Broj); end; umesto Code: var Broj: Integer; begin Broj := 5; . . . end; ali kada treba recimo da kreiras od 5 - 50 edit kontrola da bi korisnik uneo atribute vezane za neki artikal ili sta vec, umesto da vizuelno kreiras 50 kontrola i da ih sakrijes, pa onda kroz kod da pojavis onoliko koliko ti treba, ti jednostavno u kodu dinamicki kreiras onoliko koliko ti treba i kada ti vise ne trebaju obrises ih. Drugi primer... da uzmemo niz... treba ti program koji treba da ucita fajl CEO fajl u memoriju ako je moguce... ti mozes da napravis niz od mnooogo elemenata (recimo 10000000) i ako korisnik pokusa da ucita veci fajl jednostavno kazes da ne moze, a mozes da kada korisnik izabere fajl probas da zauzmes blok memorije velicine fajla i tako ces moci da podrzis i mnogo vece fajlove (naravno ako imas dosta memorije), ali za fajm velicine 1 bajt neces bezveze zauzeto jos 9999999 kao sto bi bio slucaj da nisi koristio dinamicki niz. Zakljucak... ne treba bespotrebno preterivati sa upotrebom pointera i dinamickog kreiranja, ali ne treba bezati od pointera. [ Milan Milosevic @ 23.04.2007. 11:43 ] @
To i ja kazem.U svemu se slazemo. Ne treba preterivati ako nema potrebe. I koristiti kad je to neophodno i isplatiljivo po pitanju memorije.
[ Nemanja_666 @ 23.04.2007. 12:39 ] @
Jedan savjet kad radis sa pointerima jeste da nikad nekoristih suvo u procedurama ili da budu kao globalne promjenjive, nego mnogo je bolje napraviti klasu za to. Ako bude gresaka lako ces ih tako ispraviti.
[ Nikolavlasotince @ 23.04.2007. 13:56 ] @
Evo i mene. Moze li mi neko napisati neki kratak tutorial o Pointerima? Kako se radi sa njima?
Pozdrav [ Srki_82 @ 23.04.2007. 14:36 ] @
Pogledaj:
http://delphi.about.com/od/objectpascalide/a/pointers.htm Proguglaj malo... net je pun primera. [ vladaboy93 @ 05.05.2007. 15:00 ] @
Kada kazes pointer na sta mislis na Kursor?
[ Nikolavlasotince @ 05.05.2007. 17:40 ] @
Mislim na pokazivac (pokazuje adresu ka nekoj promenljivi).
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|