AGB  ·  Datenschutz  ·  Impressum  







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

array of record mit case bedingung?

Offene Frage von "gabneo"
Ein Thema von gabneo · begonnen am 27. Nov 2008 · letzter Beitrag vom 28. Nov 2008
 
HenKst

Registriert seit: 7. Jul 2008
113 Beiträge
 
#2

Re: array of record mit case bedingung?

  Alt 28. Nov 2008, 11:51
Ich denke nicht dass das genau so geht wie du es möchtest.

Eine record muss bei der declaration wissen wieviel Speicher er braucht.

Du kannst zwar einen Variant Record bauen der dir nur einen Teil seines Speichers ausgibt,
Delphi-Quellcode:
TBeispiel = record
  case integer of
    1: (zahl1: integer;);
    2: (zahl2: int64;);
  end;
end;
// gibt jenachdem welche zahl du ansprichst verschiedene typen zurück
// wenn ein int32 drin steht geben beide das gleiche ergebnis
// wenn ein int64 drin steht gibt zahl1 nur die unteren 32bit zurück, zahl2 aber den gesamten int 64
aber es wird trotzdem soviel angelegt wie maximal gebraucht wird.
Der case gibt nur verschiedene möglichkeiten an den angelegten Speicher zu interpretieren, aber alle variablen zeigen auf die gleiche Stelle im Speicher.

Wenn es also darum geht Speicher zu spaaren geht das meiner Meinung nach so nicht.
Und da du den einen Teil der Variablen ja in jedem Fall brauchst, macht es genau garkeinen Unterschied ob du den zweiten Teil in einem case declarierst.

Du könntest aber ein Zweidimensionales array anlegen und nur in deinem Einzelfall etwas in das zweite Feld schreiben.

Delphi-Quellcode:
  TBeispiel = record
    Textsize: byte;
    text, item: string;
    x, y, height, width: integer;
  end;
var
  table1, table2: array of array of TBeispiel;

procedure Fill;
var
  beispiel1: TBeispiel;
  beispiel2: TBeispiel;
begin
  beispiel1:= irgendwas;
  beispiel2:= irgendwas;// irgendwas in die records schreiben^^
  setlength(table1, 1, 1);//speicher für das erste element der tabelle anlegen
  table1[0,0] := beispiel1;// erstes tabellenelement füllen
  if table1[0].textsize = 2 then begin//testsize abfragen
    setlength(table1, 1, 2);//speicher für das zweite element der tabelle anlegen
    table1[0,1]:= beispiel2;//zweites tabellenelement füllen
  end;
end;
//nicht getestet^^

Das wäre mein Ansatz um Speicher zu spaaren.

table1/2 sind arrays in denen zum einen dein record steht und zum andern noch ein record für die zusätzlichen variablen.
Der zweite record wird aber nur angelegt(per setlenght(table,1,2)) wenn textsize = 2 ist. Damit spaarst du dir in allen fällen in denen textsize <> 2 ist den gesamten Speicher für den zweiten record. (in den restlichen hast du durch meine Faulheit 25 überflüssige bytes in den beiden strings und dem byte, aber ist ja nur ein Ansatz^^)
narf - not a real function
  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 08:38 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