Toon posts:

[Delphi] hoe kan ik dat ding stoppen?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Heel Simpel ik heb een programma dat werkt mbv recusie, en ik wil op ieder moment het hele programma kunnen stoppen. Zodat wanneer er een goede uitkomst is: deze wordt getoont en niet verder wordt gekeken..

als ik een while gebruik gaat hij toch nog verder met de processen die al waren gestart en dazz dus niet de bedoeling ...

Wie o Wie kan mij helpen ??

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Nou, ik weet niet of je meerdere recursieve algoritmen kent, maar deze hebben als prettige eigenschap dat er een stop-conditie inzit. Ik zou die er dan ook maar vlug inbouwen als ik jou was.

Siditamentis astuentis pactum.


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:17

mulder

ik spuug op het trottoir

formulier je vraag eens wat duidelijker, dit is niet te begrijpen.

oogjes open, snaveltjes dicht


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Maar je programma draait waarschijnlijk te snel om de UI nog bij te werken en dus ziet ie de druk op de knop ook niet?

Ik zou het in een aparte thread zetten. TThread. En zorg wel dat het threadsafe is en dus gesynced met je UI thread.

We adore chaos because we like to restore order - M.C. Escher


  • Magic
  • Registratie: September 2001
  • Niet online
iets in de richting van:

code:
1
2
nummer 1
if antwoord = goed then blabla else goto nummer 1

startpost een beetje onduidelijk, kun je het relevante stukje code posten?

Steam: Brainfrz82 | PSN: Brainfrz | Discord: Brainfrz


Verwijderd

Topicstarter
Stappen(Queue,stap)
{
bij Stap = 1 -> ZoekOp(Queue,stap,zijdeA,ZijdeB)
bij Stap = 2 -> ZoekOp(Queue,stap,zijdeC,ZijdeD)
enz
bij Stap = 18 -> TekenDatDing // ****** gevonden
}

ZoekOp(Queue,stap,zijde)
{
If(testVanAlles) then
{
Stappen(Queue,stap)
}
}

bij ****** moet het programma dus niet verder gaan.

Zo iets minder vaag ??

Verwijderd

Magic schreef op 21 oktober 2002 @ 13:53:
code:
1
2
nummer 1
if antwoord = goed then blabla else goto nummer 1
Dat lijkt mij geen goed idee, de stack moet weer teruggezet worden. Je kunt niet zomaar een jump van de een naar een andere functie doen...

Maar startpost idd errug onduidelijk, ik gebruik niet zovaak een "while" in een recursieve functie :?

Maar in een while-lus kun je een break doen, en in een recursieve functie kun je een globale (statische) variabele maken, bijvoorbeeld een boolean "DoContinue", en dan in de recursief aan te roepen functie een check inbouwen op "DoContiue" ,voor- en eventueel nadat de functie zichzelf opnieuw aanroept...

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Verwijderd schreef op 21 oktober 2002 @ 14:08:
Stappen(Queue,stap)

[blabla code blabla]

bij ****** moet het programma dus niet verder gaan.

Zo iets minder vaag ??
Je zal een stop conditie in moeten bouwen. Ergens:

if Stop then Exit; // en voer niet die andere bende uit...

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Verwijderd schreef op 21 oktober 2002 @ 14:08:
Stappen(Queue,stap)
{
bij Stap = 1 -> ZoekOp(Queue,stap,zijdeA,ZijdeB)
bij Stap = 2 -> ZoekOp(Queue,stap,zijdeC,ZijdeD)
enz
bij Stap = 18 -> TekenDatDing // ****** gevonden
}

ZoekOp(Queue,stap,zijde)
{
If(testVanAlles) then
{
Stappen(Queue,stap)
}
}

bij ****** moet het programma dus niet verder gaan.

Zo iets minder vaag ??
Nou heel heel heeel ietsies minder...

Ik zie trouwens (naast een hele hoop andere ondoorzichtigheden) die recursie niet zo?!

Verwijderd

Het blijft inderdaad onduidelijk...Heel onduidelijk

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Verwijderd schreef op 21 oktober 2002 @ 14:08:
ZoekOp(Queue,stap,zijde)
{
If(testVanAlles) then
{
Stappen(Queue,stap)
}
}
code:
1
2
3
4
5
6
7
ZoekOp(Queue,stap,zijde)
{
   If(testVanAlles) then
   {
       Stappen(Queue,stap+1)
   }
}
Zonder die +1 blijft ie voor eeuwig rondjes rennen. Ik weet niet of je code met deze aanpassing nog klopt, maar kapotter dan kapot kan natuurlijk niet ;)

Siditamentis astuentis pactum.


Verwijderd

Topicstarter
[/code]Zonder die +1 blijft ie voor eeuwig rondjes rennen. Ik weet niet of je code met deze aanpassing nog klopt, maar kapotter dan kapot kan natuurlijk niet ;)
Heel scherp ;) .. iid het origineel heeft wel stap+1 ;)

Verwijderd

je moet je functies values laten returnen en als de returnvalue goed is stoppen

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 21 oktober 2002 @ 14:08:
Maar in een while-lus kun je een break doen, en in een recursieve functie kun je een globale (statische) variabele maken, bijvoorbeeld een boolean "DoContinue", en dan in de recursief aan te roepen functie een check inbouwen op "DoContiue" ,voor- en eventueel nadat de functie zichzelf opnieuw aanroept...
Wat is er mis met een simpele boolean teruggeven die 'continue' betekent? :?

Iets van de strekking van:
C:
1
2
3
4
5
6
7
8
9
10
11
bool MyRecursiveFunction(...)
{
for(int i = 0; i != BranchCount; i++)
  {
  if(DoSomeTest(i))
    return false;
  if(!MyRecursiveFunction())
    return false;
  }
return true;
}

[ Voor 0% gewijzigd door curry684 op 21-10-2002 14:53 . Reden: domdomdom ]

Professionele website nodig?


Verwijderd

Verwijderd schreef op 21 oktober 2002 @ 14:42:
[...]


Heel scherp ;) .. iid het origineel heeft wel stap+1 ;)
Maareh, vanuit stappen roep je een andere "ZoekOp" aan, eentje met twee zijden als argument, wat is daar dan de implementatie van?!


Maar als ik het nu eindelijk goed begrijp... Je hebt een UI waar iemand iets kan opgeven en dan wil je dat gaan opzoeken wat hij opvraagt. Terwijl jij echter nog aan het zoeken bent, kan de gebruiker alweer een nieuwe zoekopdracht geven, en dan moet de huidige gecancelled worden en een nieuwe zoekopdracht ge-initieerd?!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 21 oktober 2002 @ 14:08:
Maar startpost idd errug onduidelijk, ik gebruik niet zovaak een "while" in een recursieve functie :?
Waarom niet?

C++:
1
2
3
4
5
6
7
8
9
10
11
void CElement::SetParents(CIterator &p_Iterator, CElement* p_Parent)
{
m_Parent = p_Parent;
if(p_Iterator->GoFirst())
  {
  do
    p_Iterator->Element()->SetParents(p_Iterator, this);
  while(p_Iterator->GoNext());
  p_Iterator->Parent;
  }
}

Redelijk onzinnige code natuurlijk, maar ik zie het probleem met een while of een do-while niet in recursieve code... :?

Professionele website nodig?


Verwijderd

Waarom niet?! :? Dat doe ik gewoon niet. recursieve functies gebruik ik niet zo vaak waar het resultaat halverwege de while-lus al bepaald is, maar de whilelus nog loopt...
Maar zou het voorkomen dan zou ik dus een globale stop-variabele zetten om alle bovenliggende recursieve functies af te gaan laten sluiten en dan break gebruiken om uit het huidige recursieve nivo te returnen... In C++ zou ik een variable declareren in de class om het per instantie te houden.

Dus:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void CElement::SetParents(CIterator &p_Iterator, CElement* p_Parent)
{
  if (m_DoContinue)
  {
    m_Parent = p_Parent;
    if(p_Iterator->GoFirst())
    {
      do
        p_Iterator->Element()->SetParents(p_Iterator, this);
      while((p_Iterator->GoNext()) && m_DoContinue);

      p_Iterator->Parent;
    }
  }
}

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:17

mulder

ik spuug op het trottoir

"bovenliggende" gaan niet door, en daar hoef je al helemaal geen globale variable voor te gebruiken. Die "bovenliggende" gaan pas weer door als je uit de huidige komt, en je dus een false oid terug geeft, zodat je weer die functie kan springen

oogjes open, snaveltjes dicht


Verwijderd

curry684 schreef op 21 oktober 2002 @ 14:52:
Wat is er mis met een simpele boolean teruggeven die 'continue' betekent? :?
Don Facundo schreef op 21 oktober 2002 @ 15:08:
"bovenliggende" gaan niet door, en daar hoef je al helemaal geen globale variable voor te gebruiken. Die "bovenliggende" gaan pas weer door als je uit de huidige komt, en je dus een false oid terug geeft, zodat je weer die functie kan springen
Niet altijd kun je meer dan 1 variabele teruggeven via de functie, dus als je een resultaat teruggeeft, kun je niet altijd een "False" ook nog eens doorgeven... Maar idd via een reference is dan een beter idee dan perse een globaal, dacht nu alleen in mijn huidige referentiekader.
Pagina: 1