Einzelnen Beitrag anzeigen

Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Wo kommt auf einmal "fpc_shortstr_to_ansistr" her?

  Alt 17. Jan 2012, 10:25
Kleiner Tipp zu Beginn: Wenn du mit "-gl" kompilierst, dann sollte(!) dir der Compiler gleich die Zeilennummer und die Datei beim Backtrace mitanzeigen, dann musst du nicht von Hand rumsuchen.
Hab ich auch schon verwendet, aber die fpc_*-Routinen sind nicht mitverzeichnet und deshalb muss ich so oder so suchen (beim Zitat im Anfangspost kann man ja auch sehen, dass die Option aktiv war)
Stimmt...

Delphi-Quellcode:
// RunGeneration
procedure RunGeneration(var gen: TGeneration; out avg: single; out max: TAIRec);
var i,j: byte; sum: word; c: shortint;
begin
  for i := 0 to 63 do
    RunMatch(gen[i],false);
  for i := 0 to 63 do
    RunMatch(gen[i],true);
  SortGen(gen);
  c := 0;
  for i := 63 downto 0 do
    if (gen[i].score>=225) then c := 64-i;
  for j := 0 to 30 do begin
    for i := 0 to c-1 do
      RunMatch(gen[63-i],false);
    for i := 0 to c-1 do
      RunMatch(gen[63-i],true);
  end;
  SortGen(gen);
  max.score := 0;
  sum := 0;
  for i := 0 to 63 do begin
    if gen[i].score>max.score then max := gen[i];
    sum += gen[i].score;
  end;
  avg := sum/64;
end;

// RunMatch
procedure RunMatch(var g: TAIRec; const r: boolean);
var
  party: TParty;
  pl1,pl2,wp: PPlayer;
  drv: TEvoDrive;
  q,is1: Boolean;
  c: byte;
begin
  party := TParty.Create;
  drv := TEvoDrive.Create(party);
  pl1 := MakePlayer(drv,GenSID);
  pl1^.Name := g.Genetics.Name; // <-- Hier fpc_shortstr_to_ansistr/fpc_ansistr_incr_ref/fpc_ansistr_decr_ref
  drv.SetAI(g.Genetics); // <-- und hier schlägt fpc_copy fehl, wenn obere Zeile rauskommentiert ist
  party.SetPlayer1(pl1);
  if r then
    pl2 := MakePlayer(TRandomizer.Create(party),GenSID)
  else pl2 := MakePlayer(TPrimAIPlayer.Create(party),GenSID);
  pl2^.Name := 'Bernd';
  party.SetPlayer2(pl2);
  q := false;
  is1 := false;
  if Random(2)=0 then begin
    is1 := true;
    wp := pl2;
    pl2 := pl1;
    pl1 := wp;
  end;
  c := 0;
  try
    repeat
      if party.TurnClosed then begin
        party.Proceed(wp);
        is1 := not is1;
        if is1 then Inc(c);
      end else q := true;
    until assigned(wp) or q;
    if q and is1 then Dec(c);
    if assigned(wp) and (wp^.id=SID_DEAD) then c := 15
    else if assigned(wp) and (wp^.id=pl1^.id) then c := 20;
    g.Score += (c*c) div 2;
  finally
    party.Free;
    DismissPlayer(pl1);
    DismissPlayer(pl2);
  end;
  Inc(pcount);
end;
Wie wird PPlayer innerhalb von MakePlayer angelegt und wie ist es (und sein Basistyp) definiert? Wie ist p.Genetics definiert?

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat