AGB  ·  Datenschutz  ·  Impressum  







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

AV in Callback-Funktion

Ein Thema von Dani · begonnen am 16. Mär 2008 · letzter Beitrag vom 16. Mär 2008
Antwort Antwort
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#1

AV in Callback-Funktion

  Alt 16. Mär 2008, 21:15
Guten Abend

Ich steh grad total auf dem Schlauch. In einer Klassenmethode wird eine Callback-Funktion aufgerufen, aber die Parameter werden anscheinend nicht richtig gesetzt, denn ein Zugriff auf die Parameter löst eine AV aus. Die verletzende Adresse ist niedrig ($00000014, $00000020, $0000000F, ...).

Die Callback-Funktion ist TSortRelation:
Delphi-Quellcode:
type
  TSortRelation = function(A, B: TObject): Integer of object;
Hier der Aufruf:
Delphi-Quellcode:
class procedure THeapsorter.Sort(List: TObjectList; Relation: TSortRelation);
  procedure BubbleUp(N: Integer);
  var
    I: Integer;
    X: TObject;
  begin
    (* Fuege List[N-1] in den Heap List[0],...,List[N-1] ein *)
    I := N;
    X := List[N - 1];
    // AV beim Aufruf von Relation() mit korrekten Indizes, z.B. 7 und 4
    // bei einer Liste mit 10 Elementen.
    while (I >= 2) and (Relation(List[I div 2 - 1], X) < 0) do begin
      List[I - 1] := List[I div 2 - 1];
      I := I div 2;
    end;
    List[I - 1] := X;
  end;

  {...}

begin
  {...}
end;
Und eine Implementierung von TSortRelation:
Delphi-Quellcode:
type
  TWrappedString = class(TObject)
  private
    FStr: WideString;
  public
    property Str: WideString read FStr write FStr;
    constructor Create(Str: WideString); reintroduce;
  end

function TForm1.StrCompareAsc(A, B: TObject): Integer;
var
  G1, G2: TWrappedString;
  S1, S2: WideString;
begin
  Inc(CmpCount);
  if (CmpCount mod 1000000 = 0) then begin
    Caption := IntToStr(CmpCount);
    Application.ProcessMessages;
  end;

  if (A = nil) and (B = nil) then Result := 0
  else if (A = nil) then Result := -1
  else if (B = nil) then Result := 1
  else begin
    // AV in nächster Zeile bei "as"
    G1 := A as TWrappedString;
    G2 := B as TWrappedString;
    S1 := G1.Str;
    S2 := G2.Str;
    Result := WideCompareStr(S1, S2);
  end;
end;
Wenn ich aus TSortRelation eine "normale" Funktion anstelle einer Klassenmethode mache (also "of object" weglasse und StrCompareAsc entsprechend ändere), bleibt die AV trotzdem. Was mache ich falsch?

Edit: huch, meine Delphi-Tags haben sich ins [pre]s verwandelt!?
Angehängte Dateien
Dateityp: zip heapsort_469.zip (4,9 KB, 2x aufgerufen)
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: AV in Callback-Funktion

  Alt 16. Mär 2008, 21:28
Gebe beim anlegen der TObjectList im Create ein false mit anstatt einem true. Du hast jetzt das Problem, dass du dir selber die Instanzen zerschiesst. Grund dafür ist die Zuweisung von Listenelementen. Wenn du folgendes im Code machst:

List[I - 1] := List[J - 1]; Dann wird das Element links (i-1) freigegeben bevor das neue Element zugewiesen wird. Damit zerschiesst du dir mit jeder Zuweisung die Liste, da du nicht mehr weisst ob eine Instanz noch gültig ist oder nicht. Damit ist dann jeder Zugriff auf die Typeninformationen der Klasse (Grund des Absturzes durch den AS Operator) genauso wie der Zugriff auf den String tödlich.
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: AV in Callback-Funktion

  Alt 16. Mär 2008, 22:44
Ah, klar...müsste eigentlich reichen, OwnsObjects temporär auf false zu stellen.... Danke!
Dani H.
At Least I Can Say I Tried
  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 21:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz