Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Postavljanje varijable

[es] :: Pascal / Delphi / Kylix :: Postavljanje varijable

[ Pregleda: 1848 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Postavljanje varijable10.04.2009. u 22:02 - pre 183 meseci
E ovo ne mogu odgonetnuti, a izluđuje me...
Imam kreiranu klasu:
Code:

   tSalda=class
   ...
   private
        fAkt: integer;
    ...
    public
        procedure First;
        property Recno: integer read fAkt write fAkt;
    ...
    end;
...

procedure tSalda.First;
begin
   ShowMessage(IntToStr(fAkt));
   Recno := 0;
   ShowMessage(IntToStr(fAkt));
   self.fAkt := 0;
   ShowMessage(IntToStr(fAkt));
   fAkt := 0;
   ShowMessage(IntToStr(fAkt));
   while (fAkt < Length(fRate)) and (not OkFilter) do 
      fAkt := fAkt + 1;
   if fAkt >= Length(fRate) then begin
     fAkt := -1;
     fEof := true;
   end;
end;


kod koji poziva proceduru:
Code:

procedure tSalda.UrediKamatu;
begin
   Sort;
   First;
   ...
end;


ShowMessage u proceduri je samo radi ispisa vrijednosti...
Recno := 0 bi trebao napraviti isto što i fAkt := 0

međutim...
ShowMessage ispiše: prvi puta 1 (ok - jedan slog), ostalih 3 puta - 0 i to je ok
debuger (dodano u watch list: fAkt i Recno) za oba prikazuje vrijednost 1 !!! u while nikada ne uđe jer nije (1 < 1)

Pokušao sam komentirati Sort, rezulata je isti...

Ima li tko ideju o čemu se radi?



 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Postavljanje varijable11.04.2009. u 10:40 - pre 183 meseci
> ShowMessage ispiše: prvi puta 1 (ok - jedan slog), ostalih 3 puta - 0 i to je ok
> debuger (dodano u watch list: fAkt i Recno) za oba prikazuje vrijednost 1 !!! u while nikada ne uđe jer nije (1 < 1)

Ako posle izričite dodele vrednosti na 0, ponovo postane 1 onda se ta vrednost menja sa nekog drugog mesta. Postavi Write metodu za properti, gledaj kada se poziva i nemoj direktno dodeljivati vrednosti FAkt. To što piše u Watch listi ne mora da znači da je tačno, gledaj kod on je referentna vrednost.
Ubaci jednostavnu proveru pre ulaska u petlju if FAkt = 0 then ... Što se same petlje tiče proveri da li ima nešto u FRate, ako je prazna onda se uslov neće izvršiti.

Razjasni i šta je poenta ovog koda, ako želiš da dobiješ kontrolisani pristup nekom nizu onda se to može lakše uraditi:

Code:

TTest = class
private
  FCurrIndex: Integer;
  FList: array of Integer;
public
  procedure First;
  procedure Next;
  function Eof: Boolean;
end;

procedure TTest.First;
begin
  FCurrIndex := 0;
end;

function TTest.Eof: Boolean;
begin
  Result := FCurrIndex >= Length(FList);
end;

procedure TTest.Next;
begin
  Inc(FCurrIndex);
end;


 
Odgovor na temu

Boris B.
Ljubljana

Član broj: 213615
Poruke: 286
*.dial-up.dsl.siol.net.



+14 Profil

icon Re: Postavljanje varijable12.04.2009. u 10:49 - pre 183 meseci
Stanje u Watch listi ne mora da bude pravo stanje ako je ukljucena optimizacija koda u kompajleru, iskljuci najpre optimizaciju pa probaj ponovo (Projects -> Options -> Complier).
ShowMessage ce zaista prikazati pravo stanje varijable, tj ono stanje koje program zaista vidi, drugima recima ako ShowMessage kaze 0 onda je zaista 0.

Btw, ShowMessage nije bas najsretnije resenje za debugging, pogotovo ako debagujes servis ii konzolnu aplikaciju. Cak i kod "standardnih" Forms programa ShowMessage nije dobar jer moze da izazove sideefekte jer se prikazuje modalno tj. pauzira aktivnu granu msg loopa. Debaguj koristeci OutputDebugString, na taj nacin rezultati se loguju u Delphijev EventLog i onda mozes "natenane" da analiziras izlaz.

I jos nesto, probaj da kad god pises implementaciju neke svoje klase, da prefiksujes sva polja, propertyje i metode svoje klase sa Self., znaci umesto RecNo pisi Self.RecNo, cak i za privatna polja, FAkt -> Self.FAkt. Na taj nacin dobijes:
1. Code completition - Vec u designtime-u ce te IDE ograniciti samo na moguce vrednosti.
2. Izbecices moguce referenciranje lokalne varijable istog imena, sto se cesto desava u komplikovnijim projektima.
3. Kod je laksi za citanje i razumevanje, cak i tebi kada ga otvoris posle 2 godine da nesto promenis.

Ako se uvek drzis ovoga gore ustedeces sebi mnogo zivaca u ovakvim situacijama, znam iz licnog iskustva.

Proveri vrednost OKFilter-a pre ulaska u petlju, mozda trazis problem na pogresnom mestu.
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Postavljanje varijable12.04.2009. u 12:29 - pre 183 meseci
> I jos nesto, probaj da kad god pises implementaciju neke svoje klase, da prefiksujes sva polja, propertyje i metode svoje klase sa Self., znaci
> umesto RecNo pisi Self.RecNo, cak i za privatna polja, FAkt -> Self.FAkt. Na taj nacin dobijes:
> 1. Code completition - Vec u designtime-u ce te IDE ograniciti samo na moguce vrednosti.
> 2. Izbecices moguce referenciranje lokalne varijable istog imena, sto se cesto desava u komplikovnijim projektima.
> 3. Kod je laksi za citanje i razumevanje, cak i tebi kada ga otvoris posle 2 godine da nesto promenis.

Sve to zavisi od stila i preferencija, najbolji savet je da isproba šta mu odgovara i drži se toga. Recimo pisanje Self ispred polja se koristi ali retko, meni na primer samo otežava praćenje koda. Promenljive klase uvek imaju F prefiks i ne može doći do zabune sa lokalnim promenljivama, a davanje promenljivama ista imena kao propertijima ili tek metodama je greška.

 
Odgovor na temu

Boris B.
Ljubljana

Član broj: 213615
Poruke: 286
*.dial-up.dsl.siol.net.



+14 Profil

icon Re: Postavljanje varijable12.04.2009. u 14:53 - pre 183 meseci
@savkic
Naravno nista nije urezano u kamen, zato sam i napisao "iz licnog iskustva".
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Postavljanje varijable

[ Pregleda: 1848 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.