AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TList und record: Auf Variablen zugreifen
Thema durchsuchen
Ansicht
Themen-Optionen

TList und record: Auf Variablen zugreifen

Ein Thema von Sascha L · begonnen am 6. Sep 2006 · letzter Beitrag vom 7. Nov 2006
 
schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#7

Re: TList und record: Auf Variablen zugreifen

  Alt 7. Nov 2006, 18:08
Hallo!

Ich habe hier das Problem, das ich einerseits in der Compare_ Funktion eine EInvalidOp Exception erhalte, andererseits auch noch eine EInvalidOp

Delphi-Quellcode:
type
  PObjStruct = ^TObjStruct;
  TObjStruct = record
    useability,mass,optimum: Extended;
  end;
  TObjects = class(TList)
    function Add(Item: Pointer): Integer;
  end;

function TObjects.Add(Item: Pointer): Integer;
begin
   PObjStruct(Item).optimum := PObjStruct(Item)^.useability / PObjStruct(Item)^.mass;
   Result := inherited Add(PObjStruct(Item));
end;

function Compare_(Item1,Item2: Pointer): Integer;
begin
 if PObjStruct(Item1)^.optimum < PObjStruct(Item2)^.optimum then Result := -1 else
 if PObjStruct(Item1)^.optimum > PObjStruct(Item2)^.optimum then Result := +1 else //EInvalidOp in der zweiten Vergleichsoperation
 Result := 0;
end;

procedure Optimize(var AObjects,AList: TList; AMaxMass: Extended);
var i,j: Integer; amass: Extended;
begin
  amass := 0.0;
  AList.Sort(Compare_);
  i := AList.Count-1;
  while i > 0 do
  begin
    amass := amass + PObjStruct(AList.Items[i])^.mass; //EInvalidOp
    if amass<=AMaxMass then AObjects.Add(PObjStruct(AList.Items[i])) else
    begin
      j:=i;
      while (amass>AMaxMass) and (j>0) do
      begin
        amass := amass - PObjStruct(AList.Items[j])^.mass;
        amass := amass + PObjStruct(AList.Items[j-1])^.mass;
        if amass<=AMaxMass then AObjects.Add(PObjStruct(AList.Items[j-1]));
        Dec(j);
      end;
    end;
    Dec(i);
  end;
end;
Ich habe mich hier mal drangemacht, das Rucksackproblem zu lösen, das ein anderes Mitglied der DP hier erfragt hatte als ich vor einigen Tagen seit langem mal wieder hier vorbeigeschaut habe. Die Procedure Optimize hat folgende Parameter:

AObjects: Die fertige Liste mit den Objekten, die die Gewichtsschranke einhalten
AList: Die Liste mit den Objekten, aus denen passende ausgewählt werden
AMaxMass: Die Gewwichtsschranke

Leider hänge ich nun fest am Probelem des Zugriffs auf die Recordvariablen in der liste.
Wer kann mir hier helfen? Sobald das Problem gelöst ist, soll die Optimize-Prozedur hier in die CodeLibrary aufgenommen werden.

schöni
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
  Mit Zitat antworten Zitat
 


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 16:31 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