AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit FreeandNil

Ein Thema von Maurice · begonnen am 6. Feb 2008 · letzter Beitrag vom 11. Feb 2008
Antwort Antwort
Maurice

Registriert seit: 6. Feb 2008
2 Beiträge
 
#1

Re: Probleme mit FreeandNil

  Alt 6. Feb 2008, 17:35
Moin,

Zitat von Nuclear-Ping:
Bitte formatiere Delphi-Code mit den [ delphi ] ... [ /delphi ] Tags.
Wird gemacht.

Zitat:
Einen Record brauchst du nicht freigeben, wenn du ihn nicht reserviert hast.

Was ist TMove? Eine Klasse? Wenn ja, mußt du in deinem Record diese auch mit MovesWithPoints.Move := TMove.Create erzeugen.
Ist passiert, ja. Der Constructor von TMove sieht so aus:
Delphi-Quellcode:
constructor TMove.TMove( pid,ChuckNorris: Integer; st: TStone; const c1, c2: TCoordinate );
begin
  FplayerID := pid;
  Fstone := st;
  SetLength( Fcoordinates, 2 );
  Fcoordinates[0] := TCoordinate.TCoordinate( c1.x, c1.y );
  Fcoordinates[1] := TCoordinate.TCoordinate( c2.x, c2.y );
end;
Dazu:
Delphi-Quellcode:
constructor TMove.TMove( st: TStone; x1, y1, x2, y2: Integer );
begin
  FplayerID := -1;
  Fstone := st;
  SetLength( Fcoordinates, 2 );
  Fcoordinates[0] := TCoordinate.TCoordinate( x1, y1 );
  Fcoordinates[1] := TCoordinate.TCoordinate( x2, y2 );
end;
Habe jetzt etwas herausgefunden: Wenn ich nicht das Moves Record freigeben will, sondern ein anderes, was ich in der SimpleAI benutze, dann passiert folgendes:
Er geht bei dieser Funktion, aus der heraus er die SimpleAI aufruft:
Delphi-Quellcode:
function TNetwork.processMessage( handler: TMessageHandler ): Boolean;
var
  msgs: TStringList;
  serverMessage, mStr: String;
  identifier: Char;
  m: TMove;
  tmp: TBoardData;
  tmpS: TScoreData;
  i, j, number, playerNum, k: Integer;
  msg: TStringTokenizer;
  handled: Boolean;
  stones: TStoneArray;
begin
  // warte auf Servernachricht
  msgs := Fsocket.receiveLn();
  result := True;
  for k := 0 to msgs.Count - 1 do
  begin
    serverMessage := msgs[k];
    WriteLn( '> ' + serverMessage );
    msg := TStringTokenizer.TStringTokenizer( serverMessage );
    try
      handled := False;
      if ( Length( serverMessage ) > 0 ) then
      begin
        mStr := msg.nextToken();
        // lies den Nachrichtenidentifier aus
        identifier := mStr[1];
        // untersuche identifier und verarbeite entsprechende Nachricht
        case identifier of
          MESSAGE_SERVER_INITIAL:
          begin
            number := StrToInt( msg.nextToken() );
            Fboard^.playerID := number;
            handler.initialMessage( serverMessage );
            handled := True;
          end;
          MESSAGE_SERVER_STONES:
          begin
            unserializeStone( serverMessage, stones );
            handler.newStones( stones );
            handled := True;
          end;
          MESSAGE_SERVER_REQUEST_MOVE:
          begin
            Fboard^.update( serverMessage );
            m := handler.myTurn( serverMessage );
            m.playerID := Fboard^.playerID;
            Fboard^.update( m );
            sendMove( m );
            handled := True;
          end;
          MESSAGE_SERVER_ANSWER_BOARD:
          begin
            for i := 0 to 10 do
            begin
              for j := 0 to 10 do
              begin
                number := StrToInt( msg.nextToken() );
                tmp[i][j] := number;
              end;
            end;
            Fboard^.update( tmp );
            handled := True;
          end;
          MESSAGE_SERVER_ANSWER_SCORE:
          begin
            for playerNum := 0 to 1 do
            begin
              for j := 0 to 5 do
              begin
                number := StrToInt( msg.nextToken() );
                tmpS[playerNum][j] := number;
              end;
            end;
            Fboard^.updateScores( tmpS );
            handled := True;
          end;
          MESSAGE_SERVER_RESET:
          begin
            handler.reset( serverMessage );
            handled := True;
          end;
          MESSAGE_SERVER_REQUEST_CHANGE:
          begin
            if ( handler.changeRequest( serverMessage ) ) then
              mStr := MESSAGE_CLIENT_ANSWER_CHANGE + ' '
                + MESSAGE_CLIENT_ANSWER_CHANGEACCEPT
            else
              mStr := MESSAGE_CLIENT_ANSWER_CHANGE + ' '
                + MESSAGE_CLIENT_ANSWER_CHANGEREJECT;
            sendString( mStr );
            handled := True;
          end;
          MESSAGE_SERVER_TERMINATE:
          begin
            disconnect();
            handler.terminate( serverMessage );
            handled := True;
          end;
        end;
      end;
      result := handled and result;
    finally
      FreeAndNil( msg );
    end;
  end;
  FreeAndNil( msgs );
end;
normalerweise auf diese Zeile: m := handler.myTurn( serverMessage );
Wenn ich allerdings den Freeandnilbefehl drinhab, dann geht er nach der SimpleAI direkt auf diese: result := handled and result;

Er überspringt also das senden und deshalb gibts die Fehlermeldung, es wird also irgendwo in dem Grundgerüst des Clients n Fehler sein. Wenn irgendwer da die Lust zu hat, sich das mal anzugucken, dem kann ich meinen aktuellen Client gerne mal schicken, ansonsten werde ich denke ich das Record so umschreiben müssen, dass es nurnoch Integerwerte enthält, die er dann automatisch wieder freigibt.

Gruß
Maurice
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz