![]() |
PPoint zu short
Delphi-Quellcode:
Wie bekomme ich PPoint nach short damit es wieder passt?
var
pXY: PPoint; meta: TArray<short>; meta := Pointer(pXY); Das mag er gar nicht.
Delphi-Quellcode:
meta := Pointer(Short(pXY));
gruss |
AW: PPoint zu short
Delphi-Quellcode:
kann nicht gehn, denn Short = 2 Byte und Pointer sind 4 oder 8 Byte.
Short(pXY)
Bei so einem Cast muß der Compiler meckern. Was ist in dem pXY gespeichert? Wenn das keine Zeiger auf ein "dynamisches" Array ist, dann kannst/darfst du niemals das in ein dyn. Array casten. In ein statisches Array ginge es (einen Zeiger auf ein statisches Array), denn da gibt es keine zusätzlichen Verwaltungsstrukturen für die Speicherverwaltung.
Delphi-Quellcode:
, ABER nur wenn pXY ein Zeiger auf den ersten Wert eines anderen dynamisches Arrays ist :!:
meta := TArray<short>(pXY);
|
AW: PPoint zu short
Ich erstelle ein Array of POINT
Delphi-Quellcode:
xy[0].x := 80 + 150; xy[0].y := 135 + 150;
xy[1].x := 140 + 150; xy[1].y := 130 + 150; xy[2].x := 160 + 150; xy[2].y := 80 + 150; xy[3].x := 180 + 150; xy[3].y := 130 + 150; xy[4].X := 240 + 150; xy[4].y := 135 + 150; xy[5].X := 192 + 150; xy[5].y := 165 + 150; xy[6].X := 210 + 150; xy[6].y := 220 + 150; xy[7].X := 160 + 150; xy[7].y := 190 + 150; xy[8].X := 110 + 150; xy[8].y := 220 + 150; xy[9].X := 128 + 150; xy[9].y := 165 + 150; gSprCtrl.GD_DrawPolyLineToCtrl(HSprCtrl, @xy[0], 10, gSprCtrl.GD_ColorARGB(255,RGB(100,250,150)), 5, ID_POLYLINE_1, GS_VISIBLE or GS_DRAFT, GD_DRAW_OUTLINE or GD_DRAW_OPEN, 0);
Delphi-Quellcode:
meta := Pointer(pXY); // hier sind die Daten vom xy Array enthalten.
meta ist aber als TArray<short> definiert. deshalb schlägt meine Zuweisung fehl..
Delphi-Quellcode:
x1 := meta[0];
y1 := meta[1]; x2 := meta[(ArraySize * 2)- 2]; y2 := meta[(ArraySize * 2)- 1]; das ist mein Problem. EDIT: Ich könnte das ganze jetzt auf 4 Byte umlegen also Integer (PPoint)
Delphi-Quellcode:
Ist aber irgendwo nicht der sinn der Sache wenn ich alle Datentypen verwurschtle.
x1 := meta[0];
y1 := meta[2]; x2 := meta[(ArraySize * 4)- 4]; y2 := meta[(ArraySize * 4)- 2]; gruss |
AW: PPoint zu short
Selbst wenn beides dynamische Arrays wären, ginge es nur, wenn SizeOf(DasArray[0]) bei Beiden identisch wäre und wenn die Felder eine kompatible Speicherverwaltung haben.
Delphi-Quellcode:
und
TArray<TSmallPoint>
Delphi-Quellcode:
können also nicht kompatibel sein.
TArray<Small>
Aber da der "Inhalt" beider Arrays aus vielen "Small" besteht, dann
Delphi-Quellcode:
Vorallem wenn die Felder mehr als nur einfache "Integer" sind, dann
SetLength(meta, Length(xy) * 2);
Move(meta[0], xy[0], Length(meta) * SizeOf(Small)); // oder mit MoveMemory
Delphi-Quellcode:
was die Speicherverwaltung des Typs beachtes. (Interface, dynamisches Array, String, ...)
SetLength(meta, Length(xy) * 2);
System.CopyArray(@meta[0], @xy[0], TypeInfo(Small), Length(meta)); |
AW: PPoint zu short
Danke dir.
Ich glaube die einfachste Lösung wäre ohne viel zu verändern meta als Integer zu definieren.
Delphi-Quellcode:
meta: TArray<Integer>
Dann stehen alle Daten im Array hintereinander so wie sie es sollen. Habe mal zwei pics angehängt da kannst du sehen was ich meine. ;) Sieht dann so aus der Stern! gruss |
AW: PPoint zu short
Muss noch mal nach haken.
Delphi-Quellcode:
MoveMemory(PByte(@buffer[0]) + K * sizeof(Short), @A2[K], sizeof(Short));
wegen der Änderung short zu PByte verändert sich nun das Array buffer ist Array of short. Das Array sollte dann als bsp. so aussehen 1,0,2,0,3,0 usw.. Das wird aber nun durch die Konvertierung zu PByte verändert. Sieht dann so aus. 1,2,3 es fehlt also jeweils die 0 zwischen den einzelnen werten. Wie kann ich das am besten korrigieren? Ich muss Short erhalten. Siehe Short.png im vorherigen Beitrag. gruss |
AW: PPoint zu short
Was soll das machen?
A2[k] := buffer[k]? PByte konvertiert nichts, sondern ist nur nen Poiner auf ein Byte. wenn du aus zwei Bytes (z.B: 0300h) ein Short machst und dir dann siehst du die 0 nicht mehr, weil 0300h eben die Zahl 3 als Short ist. |
AW: PPoint zu short
Zitat:
A2[k] := buffer[k]? steht nirgends. Habe es jetzt mal so gemacht nicht schön aber das Array wird dann gefüllt so wie ich es erwarte.
Delphi-Quellcode:
gruss
for K := 0 to (Count * 2) do
begin //MoveMemory(PByte(@buffer[0]) + K * sizeof(Short), @A2[K], sizeof(Short)); if K mod 2 <> 0 then begin buffer[K] := 0; continue; end else buffer[K] := A2[K div 2]; end; |
AW: PPoint zu short
Das hattest du mit dem CopyMemory programmiert ;)
Delphi-Quellcode:
for K := 0 to Count-1 do begin
buffer[K*2+0] := A2[k]; buffer[K*2+1] := 0; end; |
AW: PPoint zu short
Zitat:
Zitat:
Siehe mein PNG! gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 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-2025 by Thomas Breitkreuz