Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   [DCC Error] E2064 Left side cannot be assigned to (https://www.delphipraxis.net/163562-%5Bdcc-error%5D-e2064-left-side-cannot-assigned.html)

RWarnecke 4. Okt 2011 18:18


[DCC Error] E2064 Left side cannot be assigned to
 
Hallo zusammen,

ich stehe irgendwie auf dem Schlau. Die folgende Zeile funktioniert unter XE2 32Bit hervorragend und unter 64Bit gibt es die Meldung wie im Titel.

Delphi-Quellcode:
var
  FFileHandle : Cardinal;
  TmpSerial  : array[1..20] of AnsiChar;
  i, j       : integer;
  buffer     : array [0..sizeof (SRB_IO_CONTROL) + sizeof (SENDCMDOUTPARAMS)] of AnsiChar;
  p          : SRB_IO_CONTROL absolute buffer;
  pin        : PSENDCMDINPARAMS;
  dummy      : dword;
  pOut       : PSENDCMDOUTPARAMS;
  pId        : PIDSECTOR;
begin
  result := '';
  FFileHandle := CreateFileA(PAnsiChar('\\.\Scsi' + AnsiString(inttostr(devname)) + ':'),
                             GENERIC_READ or GENERIC_WRITE,
                             FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
                             OPEN_EXISTING, 0, 0);
  try
    if FFileHandle <> INVALID_HANDLE_VALUE then
    begin
      try
        dword(pin) := dword(@buffer) + sizeof(SRB_IO_CONTROL);  //<--- Fehler aus dem Titel
        fillchar(buffer, sizeof (buffer), 0);
        p.HeaderLength := sizeof (SRB_IO_CONTROL);
        p.Timeout := 1000;
Da muss also irgendwo der Wurm drin sein. Mein Vermutung liegt bei den beiden dword-Befehlen, bin mir aber nicht sicher. Könnt Ihr mir anhand der paar Zeilen sagen, warum diese Zeile unter 64Bit nicht funktioniert ?

Uwe Raabe 4. Okt 2011 18:30

AW: [DCC Error] E2064 Left side cannot be assigned to
 
PSENDCMDINPARAMS ist ein Pointer und der ist unter 64-Bit halt 64-Bit lang. Damit funktioniert der Cast auf DWord nicht.

Edit: Nimm besser NativeInt.

Stevie 4. Okt 2011 18:50

AW: [DCC Error] E2064 Left side cannot be assigned to
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1128416)
Edit: Nimm besser NativeInt.

Oder besser IntPtr - ist zwar nur ein Alias für NativeInt, macht aber direkt sichtbar, dass du hier nen Pointer in nem Zahlenwert rumträgst.

RWarnecke 4. Okt 2011 19:08

AW: [DCC Error] E2064 Left side cannot be assigned to
 
Hallo Ihr beiden,

danke für eure schnellen Antworten. Mit NativeInt oder IntPtr kompiliert er jetzt ohne Fehler durch. Wäre doch vergleichbar mit diesem Beispiel hier, nur ein anderer Typ ?
Delphi-Quellcode:
      {$IFDEF Win32}
        Inc(Integer(lgi01), SizeOf(Pointer));
      {$ELSE}
        Inc(Int64(lgi01), SizeOf(Pointer));
      {$ENDIF}

jbg 4. Okt 2011 19:26

AW: [DCC Error] E2064 Left side cannot be assigned to
 
Wie wäre es mit PByte bzw. um abwärtskompatibel zu bleiben PAnsiChar:

Delphi-Quellcode:
Inc(PByte(lgi01), SizeOf(Pointer));


Ich würde das übrigens so schreiben:
Delphi-Quellcode:
pin := PSENDCMDINPARAMS(PByte(@buffer) + SizeOf(SRB_IO_CONTROL));

RWarnecke 4. Okt 2011 19:30

AW: [DCC Error] E2064 Left side cannot be assigned to
 
Zitat:

Zitat von jbg (Beitrag 1128434)
Ich würde das übrigens so schreiben:
Delphi-Quellcode:
pin := PSENDCMDINPARAMS(PByte(@buffer) + SizeOf(SRB_IO_CONTROL));

Du verwirrst mich hier ein wenig. Was macht Deine Zeile anderst als meine ??? Da komme ich jetzt nicht ganz mit vom Verständnis her.

jbg 4. Okt 2011 19:38

AW: [DCC Error] E2064 Left side cannot be assigned to
 
Zitat:

Zitat von RWarnecke (Beitrag 1128436)
Was macht Deine Zeile anderst als meine ???

Ich habe den Typecast am R-Value und nicht am L-Value. Ist aber Geschmackssache. Zudem nutze ich PByte statt DWORD bzw. IntPtr.

RWarnecke 4. Okt 2011 19:49

AW: [DCC Error] E2064 Left side cannot be assigned to
 
Hallo Andreas, jetzt komme ich dahinter. Danke für Deine Erklärung.

himitsu 4. Okt 2011 20:37

AW: [DCC Error] E2064 Left side cannot be assigned to
 
Was auch immer geht (egal welche Delphiversion) ... PAnsiChar

Für diesen wurde eine schöne Arithmetik eingebaut (1 Byte pro addiertem Wert)


PS: Wenn du del linken Cast nix zuweisen kannst, dann verschiebe den Cast nach rechts :zwinker:


Delphi-Quellcode:
pin := Pointer(PAnsiChar(@buffer) + SizeOf(SRB_IO_CONTROL)); // Pointer kann an alle Pointertypen zugewiesen werden

// oder

pin := PSENDCMDINPARAMS(PAnsiChar(@buffer) + SizeOf(SRB_IO_CONTROL));


// und wäre PIN selbst ein "Pointer", dann könnte man ihm den PAnsiChar direkt zuweisen, ohne zusätzlichen Cast


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