AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language 2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse

2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse

Ein Thema von Stefan1286b · begonnen am 16. Sep 2021 · letzter Beitrag vom 16. Sep 2021
Antwort Antwort
Seite 1 von 2  1 2   
Stefan1286b

Registriert seit: 6. Jan 2012
Ort: Dinklage
15 Beiträge
 
Delphi 10.4 Sydney
 
#1

2 Variablen selber länge unterschiedlichen Typs auf selber Speicheradresse

  Alt 16. Sep 2021, 10:46
Delphi-Version: 10.4 Sydney
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.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.743 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

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

  Alt 16. Sep 2021, 10:48
Du meinst absolute :
https://docwiki.embarcadero.com/RADS...olute_Adressen
  Mit Zitat antworten Zitat
Stefan1286b

Registriert seit: 6. Jan 2012
Ort: Dinklage
15 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 16. Sep 2021, 10:58
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;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.808 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 16. Sep 2021, 11:03
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.743 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

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

  Alt 16. Sep 2021, 11:11
Er will i1 und 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.
  Mit Zitat antworten Zitat
Stefan1286b

Registriert seit: 6. Jan 2012
Ort: Dinklage
15 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 16. Sep 2021, 11:21
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.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.743 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

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

  Alt 16. Sep 2021, 11:26
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 😊
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.808 Beiträge
 
Delphi 10.4 Sydney
 
#8

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

  Alt 16. Sep 2021, 11:27
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 LUnion.BData bzw. LUnion.WArray .
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.743 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

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

  Alt 16. Sep 2021, 11:33
Dieses "case Integer of ..." ist von der Syntax irgendwie eines der ... merkwürdigsten Sachen in Pascal, finde ich.
  Mit Zitat antworten Zitat
Stefan1286b

Registriert seit: 6. Jan 2012
Ort: Dinklage
15 Beiträge
 
Delphi 10.4 Sydney
 
#10

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

  Alt 16. Sep 2021, 11:39
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^)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf