Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse (https://www.delphipraxis.net/208811-2-variablen-selber-laenge-unterschiedlichen-typs-auf-selber-speicheradresse.html)

Stefan1286b 16. Sep 2021 09:46

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:
  TBDataRead = packed record
    w1: WORD;
    w2: WORD;
    i1: SMALLINT;
    i2: SMALLINT;
  end;
 
  TArrayOfWordRead = array [0 .. 3] of WORD;



var
 LData : TBDataRead;
 LBuffer : TArrayOfWordRead ($$    LData       $$);
Ich weiß noch, dass es das var einer Methode war.

Das
($$ LData $$)
steht für das was ich nicht genau weiß.
Im Grundegenommen ist @Ldata = @LBuffer

Vielen Dank im Voraus.

Der schöne Günther 16. Sep 2021 09:48

AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
 
Du meinst
Delphi-Quellcode:
absolute
:
https://docwiki.embarcadero.com/RADS...olute_Adressen

Stefan1286b 16. Sep 2021 09:58

AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
 
Ja, genau das ist es.

Delphi-Quellcode:
  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;
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.
[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;

Uwe Raabe 16. Sep 2021 10:03

AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
 
Zitat:

Zitat von Stefan1286b (Beitrag 1494960)
Jetzt stellt sich nur noch die Frage ob es möglich ist ein Feld in einer Klasse so zu deklarieren.

Mir stellt sich eher die Frage, warum du das überhaupt brauchst.

Der schöne Günther 16. Sep 2021 10:11

AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
 
Er will
Delphi-Quellcode:
i1
und
Delphi-Quellcode:
i2
mal mit, mal ohne Vorzeichen interpretieren.

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.

Stefan1286b 16. Sep 2021 10:21

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.

Der schöne Günther 16. Sep 2021 10:26

AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
 
Oh, ist das zufällig das hier?
https://github.com/coassoftwaresystems/delphi-modbus

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:
type
   TRegisterValue = Word;
   TRegisterIndex = Word;
const
   registerIndex: TRegisterIndex = 4711;
var
   myRegisterValue: TRegisterValue;
   myActualValue: SmallInt;
begin
   myRegisterValue := myConnection.readRegister(registerIndex);
   myActualValue := SmallInt(myRegisterValue);
   (...)
end;
Aber kann ja jeder machen wie er mag 😊

Uwe Raabe 16. Sep 2021 10:27

AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
 
Delphi-Quellcode:
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;
Zugriff über
Delphi-Quellcode:
LUnion.BData
bzw.
Delphi-Quellcode:
LUnion.WArray
.

Der schöne Günther 16. Sep 2021 10:33

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.

Stefan1286b 16. Sep 2021 10:39

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 20:58 Uhr.
Seite 1 von 2  1 2      

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