Toon posts:

[delphi] recursie foutje ??

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb groots probleem:

Hier Zit het hem in ( denk ik ) ... myBlokjes list bevat 6 items.. Dit zou dan ook de max van position en oplossing list moeten zijn... maar op een wonderelijke manier lopen die op tot over de 1000 ...

Normaal als ik een hele simpele functie zou maken als:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  ArrayA[0] := 1;
  ArrayA[1] := 2;
  ArrayB[0] := 3;
  ArrayB[1] := 4;
  Queue := TQueue.Create;
  Queue.Push(@ArrayA);
  Queue.Push(@ArrayB);
  List := TList.Create
  
-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-

procedure TQueueForm.DoeIets(MyQueue: TQueue; stap: Integer);
var
  uitkomst : TMyArray;
  x : ^TMyArray;
begin
  x := MYQueue.Peek;
  List.Add(MyQueue.Peek);
  uitkomst := x^;
  ShowMessage('stap = ' + IntToStr(stap) + ' ' + IntToStr(uitkomst[0]));
  if(MyQueue.Count > 1) then
  begin
    MyQueue.pop;
    DoeIets(MyQueue,(stap-1));
  end;
  ShowMessage('stap = ' + IntToStr(stap) + ' ' + IntToStr(uitkomst[1]));
  MyQueue.push(List.Last);
end;


dan zou je een uitkomst krijgen als:
1
3
4
2
3
4

Dit is dus precies wat ik ook wil ( 1 ( 3,4 ) en dan verder met waar je meer bezig was in dit geval 2,3,4)... Wat doe ik fout aan mijn code ??

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure TForm1.VindBlokje(myBlokVerzameling: TVerzameling; Positie, kant1, kant2,
  stap: Integer; myBlokjesList, myOplossing, myPositieList: TList);
var
  zijde1,zijde2 : TKant;
  tempVerzameling : TVerzameling;
  position, blokje : integer;
begin
  if(gevonden = false) then
  begin
    zijde1 := GeefKant(myBlokVerzameling,Positie,kant1);
    for blokje := 0 to (myBlokjesList.Count - 1) do
      for position := 0 to 7 do
      begin
        tempVerzameling := myBlokjesList.Items[blokje];
        zijde2 := GeefKant(tempVerzameling,position,kant2);
        if(KantenControle(zijde1,zijde2)= true) then
        begin
          myOplossing.Add(tempVerzameling);
          myPositieList.Add(@position);
          ZoekOplossing(myBlokjesList,myOplossing,myPositieList,(stap + 1));
        end;
    end;
  end;
end;



Wie ziet het wel ??? 8)7

[ Voor 0% gewijzigd door whoami op 06-11-2002 09:58 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 14:54
Met de debugger zul je het misschien wel vinden. Debug de code eens , en dan zul je wel weten waar de fout ligt....

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

for position := 0 to 7 do

Zijn 8 stappen, niet 6?

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


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

curry684

left part of the evil twins

Kun je even die closing code tag fixen? :?

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 14:54
curry684 schreef op 06 november 2002 @ 09:58:
Kun je even die closing code tag fixen? :?

goed idee. :Y) done.

https://fgheysels.github.io/


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Laat me raden, je bent een c(++) of java programmeur. Daarbij beginnen de indexen bij 0, bij pascal/delphi begint de index bij 1 :+

[edit]
trouwens eigenaardig dat je geen array index foutmelding hebt gekregen.

  • killermar
  • Registratie: Augustus 2002
  • Laatst online: 12-07 08:05
In Delphi beginnen indexen bij 0. Ik denk dat je in de war bent met VB...

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Nee, Alarmnummer heeft gelijk.

code:
1
2
3
var
  TestArray1: array[10] of Integer;  // loopt van 1 tot 10
  TestArray2: array[0..9] of Integer;  // loopt van 0 tot 9

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


Verwijderd

Tenzij de procedure ZoekOplossing weer VindBlokje oproept zie ik de recursie nog niet.

Als VindBlokje vanuit Zoekoplossing opgeroepen wordt moet daar ook de code inzitten die weer een eind maakt aan de recursie, want die zie ik hier ook niet

Verwijderd

LordLarry schreef op 06 november 2002 @ 10:24:
Nee, Alarmnummer heeft gelijk.

code:
1
2
3
var
  TestArray1: array[10] of Integer;  // loopt van 1 tot 10
  TestArray2: array[0..9] of Integer;  // loopt van 0 tot 9
Maar de TList die hier gebruikt wordt is een VCL component waar de start bij 0 ligt

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Klopt, maar dit is niet waar we het over hadden hier :p
Ook Strings beginnen in pascal te tellen vanaf 1...

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


  • killermar
  • Registratie: Augustus 2002
  • Laatst online: 12-07 08:05
Dit wordt misschien een beetje heel erg offtopic maar als je een static array declareerd dan moet je de low en high bounds opgeven. Dus "array[10] of integer" kan helemaal niet. Verder: overal waar Delphi zelf met een lowbound aan komt zetten (denk aan TList) zal deze 0 zijn.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 09:55

Creepy

Tactical Espionage Splatterer

In je list voeg je @position toe.

Het vervevelende is alleen dat position een lokale variabele is. Op het moment dat je uit de functie gaat is position verdwenen, maar in je list staan nog wel verwijzingen naar stukken geheugen van de oude position.

Overigens voeg je steeds @position toe, je voegt dus steeds dezelfde waarde toe, aangezien in de for loop position niet van adres zal veranderen, maar alleen van inhoud, en aangezien je in je list alleen het adres van position aanpast.
[edit]
Overigens veranderd het adres van position wel bij elke nieuwe aanroep van je vind functie, aangezien het een lokale variabele is.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

killermar schreef op 06 november 2002 @ 10:37:
Dit wordt misschien een beetje heel erg offtopic maar als je een static array declareerd dan moet je de low en high bounds opgeven. Dus "array[10] of integer" kan helemaal niet. Verder: overal waar Delphi zelf met een lowbound aan komt zetten (denk aan TList) zal deze 0 zijn.
hmm...heb het even getest (zelfs in tp5.5) en het klopt. Je moet altijd in pascal een begin van een array meegeven. Dus er is geen default begin voor static array's. Dynamische array's beginnen bij 0, dus je kan wel zeggen dat het default 0 is.

Ik ben kennelijk teveel gehersenspoeld door C++ :p of ben in de war met strings (die nog wel vanaf 1 beginnen te tellen).

Bedankt killermar voor het uitdeweg helpen van dit misverstand :D

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


  • killermar
  • Registratie: Augustus 2002
  • Laatst online: 12-07 08:05
:-)
Ik zou trouwens altijd de Low en High functies gebruiken om de bounds te achterhalen, je zou immers een keer kunnen switchen van dynamische naar statische arrays...

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Creepy schreef op 06 november 2002 @ 10:41:
In je list voeg je @position toe.

Het vervevelende is alleen dat position een lokale variabele is. Op het moment dat je uit de functie gaat is position verdwenen, maar in je list staan nog wel verwijzingen naar stukken geheugen van de oude position.

Overigens voeg je steeds @position toe, je voegt dus steeds dezelfde waarde toe, aangezien in de for loop position niet van adres zal veranderen, maar alleen van inhoud, en aangezien je in je list alleen het adres van position aanpast.
[edit]
Overigens veranderd het adres van position wel bij elke nieuwe aanroep van je vind functie, aangezien het een lokale variabele is.
Inderdaad. Ik denk ook dat ie
code:
1
  myPositieList.Add(Pointer(position));

bedoelt. Dat werkt wel.

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


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 09:55

Creepy

Tactical Espionage Splatterer

LordLarry schreef op 06 november 2002 @ 10:59:
[...]


Inderdaad. Ik denk ook dat ie
code:
1
  myPositieList.Add(Pointer(position));

bedoelt. Dat werkt wel.
Eehh.. zo cast je position toch om naar een pointer en zal deze nog steeds een foute verwijzing geven als position niet meer bestaat???

Of nog erger: de cast gaat goed, de pointer maakt een nieuwe copie van position aan, en wordt NIET meer vrijgegeven.. NOOIT ;) Tenzij TList zijn eigen pointers opschoont (wat me sterk lijkt).

code:
1
2
3
4
5
6
var newposition: ^integer;
begin
   new(newposition); // Reserveer geheugen voor de pointer;
   newposition^:=position; // vul de pointer
   list.add(newposition);  // en voeg hem toe aan de list.
end;

En ergens anders zul je dan je pointers weer moeten vrijgeven (m.b.v. dispose).

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Creepy schreef op 06 november 2002 @ 11:16:
[...]

Eehh.. zo cast je position toch om naar een pointer en zal deze nog steeds een foute verwijzing geven als position niet meer bestaat???

Of nog erger: de cast gaat goed, de pointer maakt een nieuwe copie van position aan, en wordt NIET meer vrijgegeven.. NOOIT ;) Tenzij TList zijn eigen pointers opschoont (wat me sterk lijkt).
Een pionter is 32 bits breed en een Integer ook (in een 32 bits compiler). Vandaar dat je een integer hard kan casten naar een pointer en deze hoeft dus ook niet vrijgemaakt te worden. Tis een vies trukje, maar je kan zo wel simpel een TList misbruiken om een dynamisch array van integers te maken. Dat is denk ik wat de bedoeling is van de TS. Of het mooi, verstandig en netjes is is een andere zaak :)

Terug casten kan gewoon met
code:
1
SomeInt := Integer(TList.Item[0]);

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

Pagina: 1