Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi PPoint zu short (https://www.delphipraxis.net/195475-ppoint-zu-short.html)

EWeiss 2. Mär 2018 21:11

PPoint zu short
 
Delphi-Quellcode:
var
  pXY: PPoint;
  meta: TArray<short>;
 
meta := Pointer(pXY);
Wie bekomme ich PPoint nach short damit es wieder passt?
Das mag er gar nicht.

Delphi-Quellcode:
meta := Pointer(Short(pXY));


gruss

himitsu 2. Mär 2018 21:25

AW: PPoint zu short
 
Delphi-Quellcode:
Short(pXY)
kann nicht gehn, denn Short = 2 Byte und Pointer sind 4 oder 8 Byte.
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:
meta := TArray<short>(pXY);
, ABER nur wenn pXY ein Zeiger auf den ersten Wert eines anderen dynamisches Arrays ist :!:

EWeiss 2. Mär 2018 21:39

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:
    x1 := meta[0];
    y1 := meta[2];
    x2 := meta[(ArraySize * 4)- 4];
    y2 := meta[(ArraySize * 4)- 2];
Ist aber irgendwo nicht der sinn der Sache wenn ich alle Datentypen verwurschtle.

gruss

himitsu 2. Mär 2018 21:54

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:
TArray<TSmallPoint>
und
Delphi-Quellcode:
TArray<Small>
können also nicht kompatibel sein.

Aber da der "Inhalt" beider Arrays aus vielen "Small" besteht, dann
Delphi-Quellcode:
SetLength(meta, Length(xy) * 2);
Move(meta[0], xy[0], Length(meta) * SizeOf(Small)); // oder mit MoveMemory
Vorallem wenn die Felder mehr als nur einfache "Integer" sind, dann
Delphi-Quellcode:
SetLength(meta, Length(xy) * 2);
System.CopyArray(@meta[0], @xy[0], TypeInfo(Small), Length(meta));
was die Speicherverwaltung des Typs beachtes. (Interface, dynamisches Array, String, ...)

EWeiss 2. Mär 2018 22:00

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

EWeiss 3. Mär 2018 13:30

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

brechi 3. Mär 2018 13:58

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.

EWeiss 3. Mär 2018 14:10

AW: PPoint zu short
 
Zitat:

Zitat von brechi (Beitrag 1395123)
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.

Sorry werde aus deinen schreiben nicht schlau etwas konfus..
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:
    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;
gruss

brechi 3. Mär 2018 14:14

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;

EWeiss 3. Mär 2018 14:31

AW: PPoint zu short
 
Zitat:

Zitat von brechi (Beitrag 1395126)
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;

Jo so geht's auch gleiche Ergebnis.

Zitat:

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.
Dann frage ich mich warum bei Short der jeweils 2 Nenner im Array dann 0 ist.
Siehe mein PNG!

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:16 Uhr.
Seite 1 von 2  1 2      

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