Einzelnen Beitrag anzeigen

Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Wo kommt auf einmal "fpc_shortstr_to_ansistr" her?

  Alt 15. Jan 2012, 21:43
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)

Zitat:
Kannst du mal bitte den Code der RunGeneration zeigen und vielleicht auch markieren wo sich in etwa der Aufruf zu fpc_shortstr_to_ansistr befinden soll? Alternativ kannst du auch einfach den entsprechenden Assemblerteil der Prozedur zeigen.
In RunGeneration selbst trat dies nicht auf, sondern in einer anderen Routine, die von RunGeneration aufgerufen wird, nämlich RunMatch. Seltsam, dass diese jedoch nicht im Calltrace verzeichnet ist.
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;
Nach im nachhinein nicht mehr nachvollziehbarem Rumgewurschtel, ist fpc_shortstr_to_ansistr inzwischen verschwunden, stattdessen tritt die AV jetzt wahlweise bei fpc_ansistr_incr_ref oder fpc_ansistr_decr_ref auf. Wenn ich die Strings komplett rauslasse, kommt die AV bei fpc_copy. TAIRec ist hierbei:
Delphi-Quellcode:
  PEvoState = ^TEvoState;
  TEvoState = record
    Action, OnTrue, OnFalse: byte;
  end;
  PEvoAI = ^TEvoAI;
  TEvoAI = record
    //Name: AnsiString;
    States: array[0..127] of TEvoState;
  end;
Zitat:
Wo hast du denn {$longstrings on} gesetzt? Vor einem eventuellen {$mode delphi/objfpc} oder danach? Wenn davor, dann setze das mal überall dahinter hin.
In allen Projektdateien nach {$mode objfpc} und vor {$coperators on} . Zusätzlich ist auch der Parameter -Sh gesetzt.

Zitat:
Ansonsten kannst du auch einfach mal Free Pascal 2.6.0 ausprobieren, auch wenn ich nicht denke, dass sich da viel geändert hat (allerdings habe ich auch nicht jeden Bugfix im Kopf).
Habe ich vorhin auch schon ausprobiert, gleiches Problem.

Geändert von implementation (15. Jan 2012 um 21:45 Uhr)
  Mit Zitat antworten Zitat