[Delphi] assignment problemen

Pagina: 1
Acties:

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 18:23

Knutselsmurf

LED's make things better

Topicstarter
Iedereen is vast wel eens tegen het volgende probleem aangelopen: zolang de uitvoer van een langdurende functie een bepaald resultaat oplevert, moet er iets met die waarde gebeuren.
Delphi:
1
2
3
4
while langdurigefunctie(veelparameters)>0 do
begin
  iets_met(langdurigefunctie(veelparameters));
end;

Op deze manier roep je de functie natuurlijk 2 maal aan, wat natuurlijk onnodig is.

Een andere optie is:
Delphi:
1
2
3
4
5
6
temp:=langdurigefunctie(veelparameters);
while temp>0 do
begin
  iets_met(temp);
  temp:=langdurigefunctie(veelparameters);
end;

Op deze manier roep je per keer de functie maar 1 maal aan, maar dit heeft als nadeel dat je dezelfde regel code 2 maal moet gebruiken, 1 maal voor de while, en 1 maal erin.
Wat je eigenlijk wilt hebben is dat je beide kunt combineren. Omdat ik in de Help niets kon vinden, ben ik zelf aan het programmeren geslagen. De uitkomst was uiteindelijk zo simpel en doeltreffend, dat ik het niet kon laten om het met jullie te delen :)

Delphi:
1
2
3
4
5
6
7
8
function assign(var v:integer; f:integer):integer;
begin
  v:=f;
  result:=f;
end;

while assign(temp,langdurigefunctie(veelparameters))>0 do
  iets_met(temp);


De vraag die mij nu bezig houdt is of ik het wiel opnieuw heb uitgevonden. zijn er andere constructies die eenzelfde resultaat hebben, of kan Delphi dit misschien van zichzelf?

- This line is intentionally left blank -


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Test aan de andere kant van de loop zetten?
code:
1
2
3
4
5
repeat
  temp := langdurigefunctie(veelparameters);
  if(temp>0) 
    iets_met(temp);
until temp<=0;

Of begrijp ik je verkeerd?

[ Voor 51% gewijzigd door Rataplan op 05-03-2004 13:34 . Reden: niks eventueels aan de voorgestelde wijziging, dus gewijzigd O-) ]


Journalism is printing what someone else does not want printed; everything else is public relations.


  • djlinsen
  • Registratie: September 2002
  • Laatst online: 18:48

djlinsen

Well suffer my pretty warriors

Waar je je druk over maakt ;) ik gebruik zelf altijd de 2e optie, ik vind het belangrijker dat de code goed leesbaar is dan zo min mogelijk regels, die eventueel onduidelijkheden kunnen geven. Je eerste optie is wel duidelijk maar niet efficient dus die valt zeker af. Ik denk dat de 3e optie alleen maar onduidelijker wordt en zeker niet efficienter ten opzichte van optie 2.
Zolang die while lus niet 10 miljoen keer rond moet boeit tegenwoordig die efficientie eigenlijk ook niet

Are you following me, Are you following me?


  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 18:23

Knutselsmurf

LED's make things better

Topicstarter
Dat kan fout aflopen. Dan doe je namelijk altijd iet_met(temp), terwijl het zo kan zijn, dat dat nooit moet gebeuren. Om dat te voorkomen moet je inderdaad zoals je zelf al zegt in regel 3 een extra if toevoegen.
Dan zit je weer met een extra controle, wat ik eigenlijk wil voorkomen, net als de extra regel in mijn tweede voorbeeld. Qua snelheid zal het natuurlijk geen enkel verschil maken, maar een extra check op exact dezelfde voorwaarde geeft een extra mogelijkheid op fouten, omdat je, bij een wijziging in de voorwaarde dit op twee plaatsen aan moet passen.

- This line is intentionally left blank -


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Knutselsmurf schreef op 05 maart 2004 @ 13:43:
Dat kan fout aflopen. (...) Dan zit je weer met een extra controle(...) geeft een extra mogelijkheid op fouten (...)
Ja zeg :)
code:
1
2
3
4
5
6
repeat
  temp = langdurigefunctie(metveelparams);
  einde := (temp <=0);
  if Not (einde)
     doeietsmet(temp);
until einde;
:P

Er zijn, kortom, heel wat wegen die naar Rome leiden.

[ Voor 39% gewijzigd door Rataplan op 05-03-2004 13:50 . Reden: ! != not - 't is al even geleden, dat pascal :) ]


Journalism is printing what someone else does not want printed; everything else is public relations.