AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Boolean killt Variant-Array?

Ein Thema von glkgereon · begonnen am 5. Apr 2007 · letzter Beitrag vom 6. Apr 2007
Antwort Antwort
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#1

Boolean killt Variant-Array?

  Alt 5. Apr 2007, 23:32
Hi,

Ich möchte zum speichern einiger Konfigurationen ein Array of Variant nehmen.
Diese sind jedoch für jeden Klassentyp (alle von einer Klasse abgeleitet) unterschiedlich...

Dafür habe ich mir folgende Konstruktion überlegt.

Jedoch kommt beim Zuweisen bereits eine Fehlermeldung welche mir sagt dass irgendwas ein "Invalid Variant Type" ist.
Delphi-Quellcode:
  TAgent = class;
  TAgentClass = class of TAgent;
  TConfigEnum = ( ceXMax, ceYMax, ceStdXPos, ceStdYPos, ceStdEnergy, ceRandomInit, ceDeltaEnergy, ceReproduceMin );
  TConfigs = array [TConfigEnum] of array of Variant;

  TClassMap = class
  protected
    FTypeMap: TClassMapArray;
  public
    constructor Create;
    function GetClassID(AC: TAgentClass): Integer; //Get ID for Class
  end;

  TConfig = class
  protected
    FData: TConfigs;
    FClassMap: TClassMap;
  public
    constructor Create;
    destructor Destroy; override;
    procedure SetValue(AC: TAgentClass; CT: TConfigEnum; Value: Variant);
    function GetValue(AC: TAgentClass; CT: TConfigEnum): Variant;
  end;

  TGeneral = class(TAgent);
  TFoodAgent = class(TAgent);
  TAnimalAgent = class(TAgent);

implementation

constructor TClassMap.Create;
var i: Integer;
begin
  inherited;
  FTypeMap[1]:=TGeneral;
  FTypeMap[2]:=TAgent;
  FTypeMap[3]:=TFoodAgent;
  FTypeMap[4]:=TAnimalAgent;
end;

function TClassMap.GetClassID(AC: TAgentClass): Integer;
var i: Integer;
begin
  Result:=-1;
  for i:=Low(FTypeMap) to High(FTypeMap) do
    if FTypeMap[i]=AC then Result:=i;
end;

constructor TConfig.Create;
var i: TConfigEnum;
begin
  inherited;
  FClassMap:=TClassMap.Create;
  for i:=Low(TConfigEnum) to High(TConfigEnum) do
    SetLength(FData[i],cClassCount);
  SetValue(TGeneral,ceXMax,100);
  SetValue(TGeneral,ceYMax,100);
  SetValue(TGeneral,ceRandomInit,True); //<- Hier hakts wohl
  SetValue(TAgent,ceStdXPos,50);
  SetValue(TAgent,ceStdYPos,50);
  SetValue(TFoodAgent,ceStdEnergy,10);
  SetValue(TFoodAgent,ceDeltaEnergy,1);
  SetValue(TFoodAgent,ceReproduceMin,20);
  SetValue(TAnimalAgent,ceStdEnergy,10);
  SetValue(TAnimalAgent,ceDeltaEnergy,-1);
  SetValue(TAnimalAgent,ceReproduceMin,20); //<- Und hier kommt der Error
end;

destructor TConfig.Destroy;
begin
  FClassMap.Free;
  inherited;
end;

procedure TConfig.SetValue(AC: TAgentClass; CT: TConfigEnum; Value: Variant);
begin
  FData[CT][FClassMap.GetClassID(AC)]:=Value;
end;
Zum Zeitpunkt der Zuweisung sieht der FData-Array so aus:
(Aus der Watchlist kopiert und formatiert)
Delphi-Quellcode:
(
  ( //ceXMax
    Unassigned,
    100,
    Unassigned,
    Unassigned
  ),
  ( //ceYMax
    Unassigned,
    100,
    Unassigned,
    Unassigned
  ),
  ( //ceStdXPos
    Unassigned,
    Unassigned,
    50,
    Unassigned
  ),
  ( //ceStdYPos
    Unassigned,
    Unassigned,
    50,
    Unassigned
  ),
  ( //ceStdEnergy
    Unassigned,
    Unassigned,
    Unassigned,
    10
  ),
  ( //ceRandomInit
    Unassigned,
    True,
    Unassigned,
    Unassigned,
    Unknown type: 78,
    Unassigned,
    Unassigned,
    Unassigned,
    Unassigned,
    Unassigned
  ),
  ( //ceDeltaEnergy
    Unassigned,
    Unassigned,
    Unassigned,
    1
  ),
  ( //ceReproduceMin
  )
)
und das kann ich mir nun leider absolut nicht erklären
wieso ist das drittletzte Element zu lang und das letzte so kurz???
Was besagt "Unknown type: 78"?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
praktiker

Registriert seit: 9. Jun 2003
Ort: Hesedorf
11 Beiträge
 
#2

Re: Boolean killt Variant-Array?

  Alt 6. Apr 2007, 02:13
Hallo ,
wie man ganz unten in der Watchliste sieht, ist für das letzte Array //ceReproduceMin keine Speicherzuweisung erfolgt.

In dem Abschnitt TConfig.create
solltest du die Zeile
for i:=Low(TConfigEnum) to High(TConfigEnum) do
SetLength(FData[i],cClassCount);
in
for i:=Low(TConfigEnum) to High(TConfigEnum)+1 do
SetLength(FData[i],cClassCount+1);
ändern.

Müsste dann funktionieren.
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#3

Re: Boolean killt Variant-Array?

  Alt 6. Apr 2007, 09:08
Aua.
natürlich!

Ich habe es jetzt zwar etwas anders, aber im prinzip das selbe.
Da der dyn.Array von 0 bis 3 und meine Klassen von 1 bis 4 gehen habe ich an der entsprechenden Stellen eine -1 eingefügt...

Delphi-Quellcode:
procedure TConfig.SetValue(AC: TAgentClass; CT: TConfigEnum; Value: Variant);
begin
  FData[CT][FClassMap.GetClassID(AC)-1]:=Value;
end;
Danke für diesen Hinweis
»Unlösbare Probleme sind in der Regel schwierig...«
  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 00:35 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