Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   & Operator??? (https://www.delphipraxis.net/191886-operator.html)

tspax 28. Feb 2017 08:38

Delphi-Version: 10 Seattle

& Operator???
 
Servus,

ich bin gerade auf nen komischen Fehler gestoßen in Verbindung mit TStream und Delphi XE10.

Fehler:
Code:
EurekaLog 7.4.0.0 

Exception:
------------------------------------
  2.5 Type  : EWriteError
  2.6 Message: Stream-Schreibfehler.
  2.7 ID    : DD310000
  2.11 Sent : 0
Vorher (Falsch)
Code:
var
  lBuffer : LongWord;
begin
  lBuffer := 0;
  fsWritingStream.WriteBuffer(pointer(&lBuffer), 4);
end;
Korrigiert (Korrekt)
Code:
var
  lBuffer : LongWord;
begin
  lBuffer := 0;
  fsWritingStream.WriteBuffer(pointer(@lBuffer), 4);
end;
In Delphi 2007 hatte das mit dem &-Operator schon seit Jahren funktioniert -> Portiere gerade eine aufwendige Anwendung von D2007 nach XE10.

Was zur Hölle macht denn dieser Operator?? In C ist das der Referenz-Operator aber in Delphi???
Kann es sein, das der in D2007 schlichtweg nen @ draus macht???

jaenicke 28. Feb 2017 09:29

AW: & Operator???
 
Das macht hier gar nichts. Damit maskierst du ein reserviertes Wort um z.B. type als Eigenschaft einer Klasse nutzen zu können.

Mit dem cast auf Pointer benutzt du den Zahlenwert, der in der Variablen steht, als Speicheradresse. Je nachdem was für ein Wert das ist, gibt es dann beim Zugriff auf diesen Bereich einen Fehler. Funktioniert haben kann das vorher nicht. Jedenfalls nicht so wie du es meinst.

Das es vorher keinen Fehler gab, war einfach Zufall, weil der entsprechende Speicherbereich lesbar war.

MichaelT 28. Feb 2017 10:14

AW: & Operator???
 
Code:
procedure WriteBuffer(const Buffer; Count: Longint); overload;
procedure WriteBuffer(const Buffer: TBytes; Count: Longint); overload;
Das '&' wird ignoriert, aber WriteBuffer ist überladen. Damit springt der das Programm in eine andere Implementierung. Mit einem MemoryStream habe ich es grad probiert und beide respektive alle 3 Varianten funktionieren. Ist im Seattle nicht anders.

Aber mit Pointer(var) geht gar nichts.

Zitat:

Zitat von jaenicke (Beitrag 1362850)
Das macht hier gar nichts. Damit maskierst du ein reserviertes Wort um z.B. type als Eigenschaft einer Klasse nutzen zu können.

Mit dem cast auf Pointer benutzt du den Zahlenwert, der in der Variablen steht, als Speicheradresse. Je nachdem was für ein Wert das ist, gibt es dann beim Zugriff auf diesen Bereich einen Fehler. Funktioniert haben kann das vorher nicht. Jedenfalls nicht so wie du es meinst.

Das es vorher keinen Fehler gab, war einfach Zufall, weil der entsprechende Speicherbereich lesbar war.


jaenicke 28. Feb 2017 11:30

AW: & Operator???
 
Hmm, stimmt. Nur weil es auf Pointer geachtet wird, wird es ja dennoch nicht als Pointer verwendet, wenn es dafür keine Überladung gibt, sondern der nicht typisierte Buffer benutzt...

Das war wohl ein Fehler im Braincompiler.

Dann ist der Streamschreibfehler auch wirklich ein solcher. Es konnte nix geschrieben werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:08 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