AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PPoint zu short

Ein Thema von EWeiss · begonnen am 2. Mär 2018 · letzter Beitrag vom 5. Mär 2018
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

PPoint zu short

  Alt 2. Mär 2018, 22:11
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.

meta := Pointer(Short(pXY));

gruss
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#2

AW: PPoint zu short

  Alt 2. Mär 2018, 22:25
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.

meta := TArray<short>(pXY); , ABER nur wenn pXY ein Zeiger auf den ersten Wert eines anderen dynamisches Arrays ist
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 2. Mär 2018 um 22:28 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: PPoint zu short

  Alt 2. Mär 2018, 22:39
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);
    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

Geändert von EWeiss ( 2. Mär 2018 um 22:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#4

AW: PPoint zu short

  Alt 2. Mär 2018, 22:54
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.

TArray<TSmallPoint> und 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, ...)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 2. Mär 2018 um 23:06 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: PPoint zu short

  Alt 2. Mär 2018, 23:00
Danke dir.
Ich glaube die einfachste Lösung wäre ohne viel zu verändern meta als Integer zu definieren.
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

Geändert von EWeiss (11. Jul 2019 um 16:49 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: PPoint zu short

  Alt 3. Mär 2018, 14:30
Muss noch mal nach haken.

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
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#7

AW: PPoint zu short

  Alt 3. Mär 2018, 14:58
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.

Geändert von brechi ( 3. Mär 2018 um 15:00 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: PPoint zu short

  Alt 3. Mär 2018, 15:10
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
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#9

AW: PPoint zu short

  Alt 3. Mär 2018, 15:14
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;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: PPoint zu short

  Alt 3. Mär 2018, 15:31
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:30 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