Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: nomorelogic - Novembre 12, 2020, 10:10:27 am

Titolo: test TStringToPointerTree (AvgLvlTree)
Inserito da: nomorelogic - Novembre 12, 2020, 10:10:27 am
ciao a tutti

Sto facendo delle prove con TStringToPointerTree, solo che c'è qualcosa che non ho capito.
Per la popolazione dell'albero tutto bene, ma quando vado a rileggere i valori ho un'eccezione (vedi "// exception here").

Qualcuno mi sa dire dov'è l'errore?
Grazie
Nomorelogic

Edit1:
in pratica mi viene restituito un puntatore ma l'oggetto letto ha un contenuto non valido.


Codice: [Seleziona]
    program test_TStringToPointerTree;
     
    uses
      AvgLvlTree;
     
    type
     
      TPieceType = (ptEmpty,
                    ptPawnWhite,   ptPawnBlack,
                    ptRookWhite,   ptRookBlack,
                    ptKnightWhite, ptKnightBlack,
                    ptBishopWhite, ptBishopBlack,
                    ptQueenWhite,  ptQueenBlack,
                    ptKingWhite,   ptKingBlack);
     
      TPieceRange = ptPawnWhite..ptKingBlack;
     
      TPiece = record
        Piece: TPieceType;
      end;
     
      TBoardColType  = (colA, colB, colC, colD, colE, colF, colG, colH);
      TBoardColRange = colA..colH;
      TBoardRowType  = (row1, row2, row3, row4, row5, row6, row7, row8);
      TBoardRowRange = row1..row8;
     
      TBoard = array[TBoardColRange] of array[TBoardRowRange] of TPiece;
     
      TBoardObj = class
      public
        Name: string;
        Board: TBoard;
      end;
     
    var
      NameToObj: TStringToPointerTree;
     
      mv1, mv2: string;
      Board1, Board2, xboard: TBoardObj;
    begin
      // create
      NameToObj:=TStringToPointerTree.Create(false);
     
      mv1:='1. c4';
      mv2:='1. c4 c5';
     
      // init some boards
      Board1:=TBoardObj.Create;
      Board1.Name:=mv1;
      Board1.Board[colC, row4].Piece:=ptPawnWhite;
      writeln('1)', Board1.Name, ' = ', Board1.Board[colC, row4].Piece);
      NameToObj[Board1.Name] := @Board1;
     
      Board2:=TBoardObj.Create;
      Board2.Name:=mv2;
      Board2.Board[colC, row4].Piece:=ptPawnWhite;
      Board2.Board[colC, row5].Piece:=ptPawnBlack;
      writeln('2)', Board2.Name, ' = ', Board2.Board[colC, row5].Piece);
      NameToObj[Board2.Name] := @Board2;
     
      writeln('Count = ', NameToObj.Count);
     
      // get value
      if NameToObj.Contains(mv2) then begin
         xboard:=TBoardObj(NameToObj[mv2]);
         writeln('3) ', xboard.Name, ' = ', xboard.Board[colC, row5].Piece); // exception here
      end else begin
         writeln(mv2, ' not found!');
      end;
     
      // enumerate all
      // for xboard in TBoardObj(NameToObj.GetEnumerator) do
      //     writeln('- ', xboard.Name, ' = ', xboard.Board[colC, row4].Piece);
     
      // free
      NameToObj.Clear;
      NameToObj.Free;
     
    end.
     
Titolo: Re:test TStringToPointerTree (AvgLvlTree)
Inserito da: nomorelogic - Novembre 12, 2020, 10:42:41 am

mi hanno risposto sul forum ufficiale :P

https://forum.lazarus.freepascal.org/index.php/topic,52116.0.html
Titolo: Re:test TStringToPointerTree (AvgLvlTree)
Inserito da: xinyiman - Novembre 12, 2020, 06:56:21 pm
L'importante è risolvere