![]() |
Delphi-Version: 10.4 Sydney
2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Hallo ich versuche 2 Variablen selber länge unterschiedlichen Typs auf der selben Speicheradresse zu deklarieren.
Ich weiß das es geht. Habe es vor ca. nen halben Jahr in einem Beispiel gesehen. Aber selbst nicht benutzt.
Delphi-Quellcode:
Ich weiß noch, dass es das var einer Methode war.
TBDataRead = packed record
w1: WORD; w2: WORD; i1: SMALLINT; i2: SMALLINT; end; TArrayOfWordRead = array [0 .. 3] of WORD; var LData : TBDataRead; LBuffer : TArrayOfWordRead ($$ LData $$); Das ($$ LData $$) steht für das was ich nicht genau weiß. Im Grundegenommen ist @Ldata = @LBuffer Vielen Dank im Voraus. |
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
|
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Ja, genau das ist es.
Delphi-Quellcode:
Jetzt stellt sich nur noch die Frage ob es möglich ist ein Feld in einer Klasse so zu deklarieren. Erster versuch ergab eine Fehlermeldung.
TBDataRead = packed record
w1: WORD; w2: WORD; i1: SMALLINT; i2: SMALLINT; end; TArrayOfWordRead = array [0 .. 3] of WORD; var LData : TBDataRead; LBuffer : TArrayOfWordRead absolute LData; [dcc64 Fehler] uThreadBusInterface.pas(81): E2029 ';' erwartet, aber Bezeichner 'absolute' gefunden
Delphi-Quellcode:
TBDataRead = packed record
w1: WORD; w2: WORD; i1: SMALLINT; i2: SMALLINT; end; TArrayOfWordRead = array [0 .. 3] of WORD; TBDBThreadBusInterface = class(TBDBThread) private LData : TBDataRead; LBuffer : TArrayOfWordRead absolute LData; end; |
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Zitat:
|
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Er will
Delphi-Quellcode:
und
i1
Delphi-Quellcode:
mal mit, mal ohne Vorzeichen interpretieren.
i2
Ich glaube "Variant Records" (in C "Unions" genannt) sind das, was du eigentlich willst und wohl die bessere Wahl wären. Allerdings habe ich auf die Schnelle keine gute Doku dafür gefunden, die offizielle Doku im DocWiki finde ich wenig verständlich. Vielleicht hat ja jemand was besseres. |
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Der Typ Ist nur ein Beispiel in Wirklichkeit ist es ein TArrayOfWordRead = array [0 .. 53] of WORD Und der packed record hat ebenso viele sprich 54 Felder. Die Teilweise WORD und Teilweise Smallint sind. Die dann auch einen sinnvolleren Namen haben. Eine auf Indy-Basierende Klasse liest Modbus Register aus. Jedes Register ist ein WORD. Und ist muss dann über mehrere Methoden auf diese Informationen zugreifen. Zusätzlich gibt es das auch noch zum Schreiben.
|
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Oh, ist das zufällig das hier?
![]() Kann ich nur empfehlen. Ich hatte mit Vorzeichen-Werten bei Modbus relativ selten zu tun, und wenn, dann bin ich tatsächlich immer hingegangen und habe es hart auf SmallInt gecastet:
Delphi-Quellcode:
Aber kann ja jeder machen wie er mag 😊
type
TRegisterValue = Word; TRegisterIndex = Word; const registerIndex: TRegisterIndex = 4711; var myRegisterValue: TRegisterValue; myActualValue: SmallInt; begin myRegisterValue := myConnection.readRegister(registerIndex); myActualValue := SmallInt(myRegisterValue); (...) end; |
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Delphi-Quellcode:
Zugriff über
type
TBDataRead = packed record w1: WORD; w2: WORD; i1: SMALLINT; i2: SMALLINT; end; TArrayOfWordRead = array [0 .. 3] of WORD; TUnion = record case Integer of 0: (BData: TBDataRead); 1: (WArray: TArrayOfWordRead); end; TBDBThreadBusInterface = class private LUnion: TUnion; end;
Delphi-Quellcode:
bzw.
LUnion.BData
Delphi-Quellcode:
.
LUnion.WArray
|
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Dieses "case Integer of ..." ist von der Syntax irgendwie eines der ... merkwürdigsten Sachen in Pascal, finde ich.
|
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Ich lese aber nicht jedes Register einzeln, sondern alle zusammen.
aktuell so gelöst:
Delphi-Quellcode:
function TBDBThreadBusInterface.ReadBuffer: PArrayOfWordRead;
begin Result := PArrayOfWordRead(@FDataRead); end; FMB.ReadHoldingRegisters(0, length(ReadBuffer^), ReadBuffer^) |
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Zitat:
Häufig gibt es zu diesem Typ auch eine Variable, also ein Feld in dem Record (das tag field), um festzulegen, welcher Variantentyp gerade in dem Record steht. Aber man kann das eben auch weglassen. |
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Zitat:
Zitat:
|
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Ja das ist einfach so etwas. Es ist aber Subotimal hier ein Integer zu verwenden. Gut ist es (wenn überhaupt) die Verwendung eines Aufzählungstyps.
|
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Zitat:
Zitat:
|
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Zitat:
Delphi-Quellcode:
type
THackersCaseSelector = (ThisIsTheRealStructure, ThisIsWhatTheFuckingApiRequires); |
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
:thumb:
|
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Zitat:
|
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Zitat:
|
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Zitat:
Delphi-Quellcode:
Da wurde dann in RecType ein Integer gespeichert, anhand dessen man ermitteln konnte, wie der Record aussieht.
type
TUnion = record case RecTyp: Integer of 0: .... 1: .... 4711: .... end; Und dann hat sich halt herausgestellt, dass ein solches zusätzliches Feld nicht immer praktikabel ist, also kann man das Feld auch weglassen. (Frag' mich keiner, wer das implementiert hat. War das noch Wirth? Oder vielleicht erst Borland?) |
AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 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