Delphi-PRAXiS

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^)

Uwe Raabe 16. Sep 2021 10:44

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

Zitat von Der schöne Günther (Beitrag 1494972)
Dieses "case Integer of ..." ist von der Syntax irgendwie eines der ... merkwürdigsten Sachen in Pascal, finde ich.

Gibt es aber schon seit Anbeginn aller Pascal-Zeiten!

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.

Redeemer 16. Sep 2021 11:42

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

Zitat von Uwe Raabe (Beitrag 1494975)
Zitat:

Zitat von Der schöne Günther (Beitrag 1494972)
Dieses "case Integer of ..." ist von der Syntax irgendwie eines der ... merkwürdigsten Sachen in Pascal, finde ich.

Gibt es aber schon seit Anbeginn aller Pascal-Zeiten!

Ich glaub das komische daran ist dieses "Integer", was halt überhaupt nichts aussagt und auch nicht gespeichert wird, oder?

Zitat:

Zitat von Uwe Raabe (Beitrag 1494975)
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.

Kommt dem von Delphi aus eine besondere Bedeutung zu oder ist das einfach nur so etwas?

freimatz 16. Sep 2021 12:40

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.

Uwe Raabe 16. Sep 2021 12:46

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

Zitat von Redeemer (Beitrag 1494979)
Ich glaub das komische daran ist dieses "Integer", was halt überhaupt nichts aussagt und auch nicht gespeichert wird, oder?

Es gibt halt den Typ der folgenden case-label Konstanten an.

Zitat:

Zitat von Redeemer (Beitrag 1494979)
Kommt dem von Delphi aus eine besondere Bedeutung zu oder ist das einfach nur so etwas?

Die Frage habe ich noch nicht verstanden (zumindest nicht so dass ich sie beantworten könnte).

Uwe Raabe 16. Sep 2021 12:48

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

Zitat von freimatz (Beitrag 1494981)
Gut ist es (wenn überhaupt) die Verwendung eines Aufzählungstyps.

Delphi-Quellcode:
type
  THackersCaseSelector = (ThisIsTheRealStructure, ThisIsWhatTheFuckingApiRequires);

freimatz 16. Sep 2021 13:15

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

Redeemer 16. Sep 2021 13:54

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

Zitat von Uwe Raabe (Beitrag 1494984)
Zitat:

Zitat von Redeemer (Beitrag 1494979)
Kommt dem von Delphi aus eine besondere Bedeutung zu oder ist das einfach nur so etwas?

Die Frage habe ich noch nicht verstanden (zumindest nicht so dass ich sie beantworten könnte).

Gemeint war: Hat das Tag für Delphi eine besondere Bedeutung, dass es zum Beispiel Compilermeldungen bezüglich der Typ-/Zuweisungssicherheit auslöst?

Uwe Raabe 16. Sep 2021 14:07

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

Zitat von Redeemer (Beitrag 1494990)
Hat das Tag für Delphi eine besondere Bedeutung, dass es zum Beispiel Compilermeldungen bezüglich der Typ-/Zuweisungssicherheit auslöst?

Wenn kein Tag-Field da ist, dann gilt der Tag-Typ nur für die Konstanten des case. Ein Tag-Field ist in der Hinsicht auch nur ein ganz normales Feld des Records. Beim Zugriff auf die Varianten wird der Inhalt des Tag-Fields auch nicht überprüft. Das ginge eh erst zur Laufzeit.

dummzeuch 16. Sep 2021 19:55

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

Zitat von Der schöne Günther (Beitrag 1494972)
Dieses "case Integer of ..." ist von der Syntax irgendwie eines der ... merkwürdigsten Sachen in Pascal, finde ich.

Ursprünglich gab es da ja auch noch ein eigenes Feld für:
Delphi-Quellcode:
type
  TUnion = record
    case RecTyp: Integer of
      0: ....
      1: ....
      4711: ....
    end;
Da wurde dann in RecType ein Integer gespeichert, anhand dessen man ermitteln konnte, wie der Record aussieht.
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?)

Uwe Raabe 16. Sep 2021 20:52

AW: 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von dummzeuch (Beitrag 1495010)
Und dann hat sich halt herausgestellt, dass ein solches zusätzliches Feld nicht immer praktikabel ist, also kann man das Feld auch weglassen.

Das war schon von Anfang an in der Sprachdefinition so vorgesehen. Hier ein Bild aus dem Pascal User Manual and Report:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:35 Uhr.

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