![]() |
"variable" pointer -ist das möglich?
abend,
tja ich hab mir letztens den code von einem programm, das ich geschrieben hat, mal angeschaut und wollte den code n bisschen optimieren, bzw. das programm mal neu machen (strukturieren, etc...), da ich das programm für eine firma warten muss. so viel dazu. jetzt hab ich mir überlegt, folgende prozedur umzuschreiben (in etwa)
Delphi-Quellcode:
indem ich für die ganzen variablenangaben einen pointer verwende.
procedure duawos(kind: Byte; wert1, wert2: Shortstring; wert3: Single; wert4: Word; ...);
(die prozedur benutz je nach kind nur manche variablenwerte, da ich nicht 5 prozeduren mit gleichem zweck haben wollte ;-)). also hab ich jetzt definiert (wobei die typen typ1... für eine bereits definierte struktur stehen):
Delphi-Quellcode:
jetzt wollte ich die prozedur so umformen:
TDATA = record
typ1: ^TTyp1; typ2: ^Typ2; ... end;
Delphi-Quellcode:
und dann jedesmal, wenn die prozedur aufgerufen wird, nur die daten in der entsprechenden (durch kind bestimmt) übergeben - alle anderen pointer-teile werden auf nil gesetzt.
procedure duawos(kind: Byte; data: TDATA);
allerdings funktioniert das so nicht! :-( :evil: also: längste rede, kurzer sinn - ist es möglich, das so zu realisieren, wie ich es jetzt beschrieben habe, oder geht das nicht? (außerdem hab ich noch probleme beim zugreifen auf die jeweiligen pointer-"inhalte") danke für infos, heiopei |
Re: "variable" pointer -ist das möglich?
Nun, es gibt etwas viel besseres:
Variante records :zwinker: Damit kann der Inhalt eines Records völlig unterschiedliche Typen haben - genau das, was du brauchst (glaub' ich :mrgreen: ) OH: ![]() |
Re: "variable" pointer -ist das möglich?
klar geht das, aber mit expliziten pointern hab ich 1990 programmiert - wir haben jetzt 2000, nimm gefäligst klassen.
cih frag mich immer wieder, wieso noch immer so viele mit zeigern hantieren. das liegt alles an der abwärtskompatibilität... |
Re: "variable" pointer -ist das möglich?
ja, ich glaub das ist schon was ich mein.
aber warum "case" ???? naja, klingt sonst ganz vielversprechend, aber wie wende ich das dann an ?(hab jetzt leider grad kein delphi zur hand :-( ) mfg, heiopei |
Re: "variable" pointer -ist das möglich?
Moin Heiopei,
Zitat:
Das funktioniert doch bestens. (Ich weiss natürlich nicht, wie Du es gemacht hast ;-)) |
Re: "variable" pointer -ist das möglich?
Zitat:
Zitat:
um noch mal darauf zurückzukommen: Zitat:
|
Re: "variable" pointer -ist das möglich?
Zitat:
Die werden irgendwie so definiert:
Delphi-Quellcode:
Rekord: record
i: Boolean; case i of TRUE: a: String; FALSE: a: Integer; |
Re: "variable" pointer -ist das möglich?
@jfheins,
stimmt, jetzt fällts mir wieder ein - hab das schon mal irgendwo gelesen also dann werd ich das wohl verwenden!!! sollte ja ziemlich einfach sein :lol: sorry wegen der blöden frage wegen case - war aber wirklich nich sehr eindeutig ;-) noch nen schönen abnd - ich geh jetz pennen heiopei |
Re: "variable" pointer -ist das möglich?
ähm...
Eine Instanz einer Klasse IST ein Pointer. ;) Der Größe-Unterschied zu einem PSomeBloodyRecord besteht nur in dem internen Zeiger auf die VMT. (Also weitere 4Bytes) Klassen können aber Methoden haben, records können und wissen rein gar nix... (außer simple Daten halten ;) ) Ich weiß ich nerve damit in letzter Zeit ... aber ich kapiere einfach nicht warum man sich (freiwillig!) soviel unnötige Arbeit und Fehlerquellen einhandeln will. :gruebel:
Delphi-Quellcode:
Das ist doch auch wieder nur eine lose Funktion. Würde es nicht viel mehr Sinn machen, sich eine passende Klassenstruktur zu entwerfen?
...procedure duawos(kind: By...
Gerade wo du doch den Code warten willst. ;) |
Re: "variable" pointer -ist das möglich?
@Robert_G: Der Grund warum einige/viele/ich noch mit records arbeiten liegt zumindest bei mir daran das Klassen einen gewissen Overhead haben. Ein record verbraucht wirklich nur so viel arbeitsspeicher wie die zu haltenden Daten wirklich benötigen, bei klassen hingegen kommen mindestens noch variablen/methoden von TObject dazu.
|
Re: "variable" pointer -ist das möglich?
hmmm... :gruebel: Siehst du da auch nur ein Feld? Ich nicht. :P
Delphi-Quellcode:
... und Methoden kosten dich doch nur den Zeiger auf die VMT.
TObject = class
constructor Create; procedure Free; class function InitInstance(Instance: Pointer): TObject; procedure CleanupInstance; function ClassType: TClass; class function ClassName: ShortString; class function ClassNameIs(const Name: string): Boolean; class function ClassParent: TClass; class function ClassInfo: Pointer; class function InstanceSize: Longint; class function InheritsFrom(AClass: TClass): Boolean; class function MethodAddress(const Name: ShortString): Pointer; class function MethodName(Address: Pointer): ShortString; function FieldAddress(const Name: ShortString): Pointer; function GetInterface(const IID: TGUID; out Obj): Boolean; class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry; class function GetInterfaceTable: PInterfaceTable; function SafeCallException(ExceptObject: TObject; ExceptAddr: Pointer): HResult; virtual; procedure AfterConstruction; virtual; procedure BeforeDestruction; virtual; procedure Dispatch(var Message); virtual; procedure DefaultHandler(var Message); virtual; class function NewInstance: TObject; virtual; procedure FreeInstance; virtual; destructor Destroy; virtual; end; Auch wenn es hier nicht um's Für & Wider geht: Das Argument ist einfach nicht richtig. ;) Eine Klasseninstanz kostet dich genau 4Byte mehr als ein record, der die gleichen Informationen halten soll. Das ist IMHO ein mehr als faires Geschäft. ;) Das soll jetzt auch nicht ausarten... Ich wollte ihm nur den Tip geben, schließlich wollte er seinen Code aufräumen. ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:21 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