AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

[gelöst] (ObjectList) Sort -> AccessViolation

Ein Thema von silver-moon-2000 · begonnen am 6. Aug 2011 · letzter Beitrag vom 7. Aug 2011
 
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#1

[gelöst] (ObjectList) Sort -> AccessViolation

  Alt 6. Aug 2011, 16:26
Delphi-Version: XE
Hallo zusammen,

vielleicht sehe ich den Wald vor lauter Bäumen nicht (mehr), aber kann mir jemand von Euch erklären, warum das folgende "nicht funktioniert".
Dabei handelt es sich um die "Callback Funktion" der ObjectList.Sort Methode, wird also so aufgerufen OL.Sort(@CompareAudioAtEnd) Ziel ist es, diese MMItems so zu sortieren, dass diejenigen mit der Eigenschaft "isAudioOnly" ans Ende kommen, und beide Teile (isAudioOnly und not isAudioOnly) alphabetisch sortiert werden

Delphi-Quellcode:
  
function CompareAudioAtEnd(input1, input2: Pointer): Integer;
  var b1, b2 : Boolean;
  begin
    b1 := TMMItem(input1).isAudioOnly;
    b2 := TMMItem(input2).isAudioOnly;
    if (b1) and (b2) then
      Result := CompareText(TMMItem(input1).InputName, TMMItem(input2).InputName)
    else
      if b1 then
        Result := 1
      else
        Result := -1;
  end;
Funktioniert nicht bedeutet in diesem Fall: Der Debugger bleibt mit der Meldung "Stack Overflow" hängen und zeigt auf "begin" bzw. bricht das Programm einfach ohne Fehlermeldung ab ("Programm funktioniert nicht mehr") wenn ich es außerhalb der IDE starte.


Hingegen das Folgende funktioniert sehr wohl, ist meiner Meinung nach aber von Hinten durch die Brust ins Auge.
Delphi-Quellcode:
  function CompareAudioAtEnd(input1, input2: Pointer): Integer;
  var t1, t2 : string;
  begin
    if TMMItem(input1).isAudioOnly then
      t1 := 'audio'
    else
      t1 := 'video';
    if TMMItem(input2).isAudioOnly then
      t2 := 'audio'
    else
      t2 := 'video';
    Result := CompareText(t2, t1);
    if Result = 0 then
      Result := CompareText(TMMItem(input1).InputName, TMMItem(input2).InputName);
  end;
Falls es hilft (gekürzt):
Delphi-Quellcode:
TMMItem = class(TObject)
  private
    FIsAudioOnly : Boolean;
  public
    property isAudioOnly : Boolean read FIsAudioOnly;
end;


TMMList = class(TObject)
  private
    FItems : TObjectList;
  public
    procedure Sort;
end;

procedure TMMList.Sort;
  function CompareAudioAtEnd(input1, input2: Pointer): Integer;
  begin
    [...]
  end;
begin
  FItems.Sort(@CompareAudioAtEnd);
end;
Wie gesagt, mich wundert, dass die eine Funktion (per Stringvergleich) funktioniert, die andere (per Boolean-Vergleich) jedoch nicht?
Oder übersehe ich (wieder mal) etwas Kritisches?

[edit]
Die "richtige" Lösung wurde von jaenicke zwei Posts weiter unten gegeben
if (b1) and (b2) then muss heißen if not (b1 xor b2) then
Tobias
Bitte nicht hauen , ich weiß es nicht besser

Geändert von silver-moon-2000 ( 7. Aug 2011 um 08:53 Uhr)
  Mit Zitat antworten Zitat
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:25 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-2025 by Thomas Breitkreuz