Frage

geerbt ich eine Delphi-Anwendung, und ich weiß nichts über das Objekt pascal.

Es ist eine BPL, dass ich in die neue Version von C ++ Builder XE kompilieren .
Wenn ich ein Make betreibe ich den Fehler:

E2064 linke Seite kann nicht zugewiesen werden.

Ich habe gelernt, genug obj pascal zu wissen, dass ich eine Konstante, die einen Wert zugewiesen werden will.

Aber anscheinend kann man über diese behanvior reiten; im wesentlichen Konstanten in Vars, indem Sie in Build-Optionen unter den Delphi-Compiler und Anschalten „zuweisbare typisiert Konstanten“.

Drehen

Das habe ich und ich weiterhin die gleichen Fehler erhalten.

Ich habe versucht, meinen Code Umgebung mit {$ J +} und {$ J-} ??und noch wird es nicht kompiliert werden.

procedure TChunkIDAT.CopyInterlacedRGB8(const Pass: Byte;
  Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar );
var
  Col: Integer;
 begin
 {Get first column and enter in loop}
 Col := ColumnStart[Pass];
 Dest := pChar(Longint(Dest) + Col * 3);
 repeat
 {Copy this row}

  Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest);

Erhalten Sie den Fehler auf der letzten Zeile. Wenn ich die const auf einen var ändern, habe ich dann den Fehler, dass die Erklärung unterscheidet sich von der vorherigen Erklärung, aber ich habe keine Ahnung, wo die vorherige Erklärung ....

War es hilfreich?

Lösung

Sie sind Typ-Casting ein Zwei-Byte-Dings (Char) in eine Ein-Byte-Sache (Byte). Lesen wird dieser Wert leicht zu definieren, aber diesen Wert zu machen beschreibbare ist schwierig, wahrscheinlich aus dem gleichen Grund die Art der formalen und tatsächlichen „var“ Parameter müssen identisch sein.

Vielleicht wollten Sie geben Guss es zu einer Zwei-Byte-Sache, wie Word. Oder vielleicht möchten Sie GammaTable ein Array von Char sein und so muss man überhaupt nicht typ gegossen. Oder vielleicht, wenn dieser Code ursprünglich für eine Delphi-Version geschrieben wurde früher als 2009, möchten Sie diese PChar Erklärungen PAnsiChar sein - Charaktertypen haben breiter geworden. Eine weitere Option ist Dest zu PByte zu Guss ein, und und dereferenzieren das Ergebnis. Das ist wahrscheinlich eine schlechte Idee, aber, weil Sie nur jeden zweiten Byte des Puffers werden überschrieben werden.

Basierend auf dem Namen der Funktion, es klingt wie PChar nie der richtige Datentyp zu verwenden war. Diese Art ist für Charakter Daten, aber ich denke, dieser Code Umgang mit Bytes . Die richtige Sache ist, wahrscheinlich zu ändern PChar zu PByte zu tun, und dann müssen Sie nicht auf den Typ-Cast Dest überhaupt.

Die $J Richtlinie ist irrelevant; er prüft, ob der Compiler ermöglicht es Ihnen, Werte zu typisierte Konstanten zuweisen. Sie haben keine der in diesem Code.

Andere Tipps

Das sieht aus wie Sie mit Gustavo Daud der TPngImage Bibliothek arbeiten. Sie brauchen nicht, dass Code in einer externen BPL, weil es seit D2009 in dem RTL aufgenommen worden ist. Entfernen Sie diese Einheit aus der BPL und Sie sollten in der aktualisierten Version über die PngImage Einheit erhalten können.

Der Grund dafür ist, dass ab Delphi 2009, Char, PChar und String sind Unicode und speichert mehr als ein Byte pro Zeichen.
Sie sollen nicht diese Zeiger auf Bytes gegossen, und dem Compiler verhindert, dass Sie sie zuweisen, wenn Sie mit der linken Seite einer Zuweisung zu einem Byte gegossen.

Dies kompiliert:

procedure CopyInterlacedRGB8(const Pass: Byte; Dest: pAnsiChar); overload;
begin
  Byte(Dest^) := Pass;
end;

Dies gilt nicht:

procedure CopyInterlacedRGB8(const Pass: Byte; Dest: pChar); overload;
begin
  Byte(Dest^) := Pass;
end;

Statt pChar, sollten Sie verwenden PBYTE, die den Code einfacher macht:

procedure CopyInterlacedRGB8(const Pass: Byte; Dest: PByte); overload;
begin
  Dest^ := Pass;
end;

- jeroen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top