AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi vorteile eines variant records gegenüber einem normalen ??
Thema durchsuchen
Ansicht
Themen-Optionen

vorteile eines variant records gegenüber einem normalen ??

Ein Thema von erniepb · begonnen am 8. Jun 2002 · letzter Beitrag vom 9. Jun 2002
Antwort Antwort
erniepb

Registriert seit: 8. Jun 2002
Ort: Berlin
96 Beiträge
 
Delphi 7 Enterprise
 
#1

vorteile eines variant records gegenüber einem normalen ??

  Alt 8. Jun 2002, 11:38
hallöchen .. also ich hab mir den code erarbeitet um eine mathematische Funktion zu errechnen .. typischer weise kommt dann da meist ne Zahl raus .. da die Funktion aber vielleicht nicht definiert ist an der einen oder anderen Stelle .. sollte man ja auch nen Wert wie "nD" oder so haben .. deswegen speichere ich momentan die ergebnisse in nem String .. aber is halt sehr speicheraufwendig ..
daher die idee eines records mit ner Extended und ner Booleanvariable, ob n definerter Wert oder halt nicht .. und dazu halt die Frage des Vorteils eines variant records gegenüber einem normalen ..
Oder hat da vielleicht noch jemand ne bessere Lösung ???

Danke schon mal im voraus !!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 8. Jun 2002, 13:33
Moin Ernie,

von Vor- oder Nachteil kann man da meiner Ansicht nach nicht unbedingt sprechen.
Wenn Speicher den der Record belegt unterschiedlich interpretiert werden kann, ist ein varianter Record erforderlich. Dadurch wird ja nur die Möglichkeit geboten den von einer entsprechend deklarierten Variablen belegten Speicher ohne Konvertierungen direkt unterschiedlich ansprechen zu können.
Also in etwa so:
Code:
type
  TMyVariantRecord =
    packed record
      fNumeric : Boolean;
      case Boolean of
        false :
          (sResult : string[SizeOf(Extended)]);
        true :
          (exResult : extended);
    end;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
erniepb

Registriert seit: 8. Jun 2002
Ort: Berlin
96 Beiträge
 
Delphi 7 Enterprise
 
#3
  Alt 8. Jun 2002, 13:49
wieso hast du den Befehl packed mit eingebaut? würde das nicht den zugriffzeit auf die daten vergrössern? achso kannst du ja nich wissen .. die ergebnisse sollen dann in form von graphen usw. ausgegeben werden .. wo der Zeitfaktor dann noch ne groß Rolle spielt .. oder hatte das n anderen Grund?
Also wie n variant array aufgebaut ist weiß ich schon .. aber wie greif ich dann auf ne variable dieses types zu? ich kann mir schwerlich vorstellen das man den entsprechenden zahlwert einfach "eingibt" .. muss da dann ne überprüfung des boolschen ausdrucks bzw. des Integerwertes falls man es nicht mit boolean gemacht hat, vorher geschehen?
Wenn ja versteh ich denn Sinn des variant records nicht, weil dann könnt man ja auch n normalen nehmen und dort über ne case-anweisung oder so spezielle abfragen auf den record machen und nur bestimmte Werte abfragen ..
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 8. Jun 2002, 14:43
Moin Ernie,

also das mit dem packed war die "Macht der Gewohnheit". Meist benutze ich Records für Dateien, und da macht das schon Sinn, um Lücken zwischen den einzelnen Datenfeldern zu vermeiden.
In Deinem Falle wirst Du wohl darauf verzichten können. Wie Du schon so richtig bemerkt hast drückt das auf die Performance.

Nun zum eigentlichen Problem:
Ist schon richtig, zum Speichern/Auslesen musst Du entscheiden, ob es sich nun um einen numerischen Wert handelt oder nicht.
Der Vorteil ist halt, dass Du nur einmal Speicher belegen musst, und ihn, je nach Art des Datums anders interpretieren kannst.

Code:
type
  TMyVariantRecord =
    record
      fNumeric : Boolean;
      case Boolean of
        false :
          (sContent : string[SizeOf(Extended)]);
        true :
          (exContent : extended);
    end;

var
  vr : TMyVariantRecord;

begin
  // speichern
  vr.fNumeric := true;
  try
    vr.exContent := StrToFloat(Edit1.Text);
  except
    vr.fNumeric := false;
    vr.sContent  := Edit1.Text;
  end;
  // auslesen
  if vr.fNumeric then
  begin
    ShowMessage('Numerisch: '+FloatToStr(vr.exContent));
  end
  else
  begin
    ShowMessage('Text:'+vr.sContent);
  end;
end;
So ist es auch möglich ein array of TMyVariantRecord anzulegen, bei dem die numerischen und nicht numerischen Werte problemlos gemischt gespeichert werden können. Man braucht nur eine Variable, und kann anhand des Flag Feldes entscheiden, wie der Inhalt jeweils zu interpretieren ist.
Um das zu tun, was Deiner Vorstellung entspricht, müsstest Du wohl den Typ Variant nehmen. Dem kannst Du beliebig Werte unterschiedlicher Typen zuweisen.
Aber der ist so richtig langsam.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
erniepb

Registriert seit: 8. Jun 2002
Ort: Berlin
96 Beiträge
 
Delphi 7 Enterprise
 
#5
  Alt 8. Jun 2002, 17:31
Danke Chris!!!

Gibt es denn deiner meinung nach dann noch ne performance günstigere Option anstelle der variant records??
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 8. Jun 2002, 18:00
Moin Ernie,

ich mag mich irren, aber Variante Records stellen weniger das Problem dar, als die Verwendung von Strings, auch wenn es, wie in diesem Falle, Shortstring sind.
Der Typ Variant und Variante Records haben eigentlich nichts miteinander zu tun, mal abgesehen von der Namensähnlichkeit.

Drei Ideen hätte ich allerdings noch, wie Du das Problem lösen kannst:

1. Verzichte auf den Varianten Teil des Records, und nehme einfach einen, mit Flagfeld und Datenfeld. Über das Flagfeld kannst Du dann, ohne Strings benutzen zu müssen, entscheiden, ob ein Not Defined vorliegt, oder ob Du etwas mit dem Wert im Datenfeld anfangen kannst.

2. Wenn machbar, lasse einfach einen Wert nicht als gültig zu. Am sinnvollsten wohl den obersten oder untersten Wert im Wertebereich. Ist das Ergebnis not Defined wird dann dieser Wert zugewiesen. Das wäre dann so ähnlich wie INVALID_HANDLE_VALUE = $FFFFFFFF = 4294967295 (= -1 mit Vorzeichen betrachtet) bei DWords.
In diesem Falle sparst Du Dir komplett einen Record, da ja der unmittelbare Wert die Gültigkeit angibt.

3. Benutze zwei parallel Laufende arrays eines mit den Flags, und eines mit den Werten.

Wenn möglich sollten die Arrays statisch sein, oder wenn dynamisch erforderlich ist, dann sollten sie nur äusserst selten vergrössert, also von der Grösse her möglichst passend initialisiert werden.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
erniepb

Registriert seit: 8. Jun 2002
Ort: Berlin
96 Beiträge
 
Delphi 7 Enterprise
 
#7
  Alt 9. Jun 2002, 18:26
mit den oberen und unteren grenyen hät man ja auch selber drauf kommen können .. weil ich mit diese ja auch schon extra behandeln musste beim zeichnen und auswerten der funktionswerte ..
Auf alle Fälle ganz doll viel danke !!!
  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 10:13 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