![]() |
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^) |
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