![]() |
inkompatibel TArray<Integer> Pointer
Unter 32 Bit habe ich hier kein Problem..
Delphi-Quellcode:
In 64 Bit meckert der Compiler
var
pXY: PPoint; meta := Pointer(pXY); Zitat:
anderes Problem Zitat:
Delphi-Quellcode:
FileStream.Seek(AniHeader.offset - 1, soFromBeginning);
Was nehmen statt dessen ? gruss |
AW: inkompatibel TArray<Integer> Pointer
Was ist PPoint? Das aus System.Types?
Was ist meta? Zitat:
Delphi-Quellcode:
FileStream.Seek(AniHeader.offset - 1, soBeginning);
|
AW: inkompatibel TArray<Integer> Pointer
Zitat:
Zitat:
Delphi-Quellcode:
TArray<Integer>
gruss |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
Delphi-Quellcode:
FileStream.Seek(AniHeader.offset - 1, TSeekOrigin.soFromBeginning);
|
AW: inkompatibel TArray<Integer> Pointer
Das funktioniert :) Danke Uwe
Delphi-Quellcode:
FileStream.Seek(AniHeader.offset - 1, soBeginning);
gruss |
AW: inkompatibel TArray<Integer> Pointer
Delphi-Quellcode:
Funktioniert hier auch unter Win32 nicht und gibt die gleiche Fehlermeldung.
procedure Main;
var meta: TArray<Integer>; pXY: PPoint; begin meta := Pointer(pXY); // [dcc32 Fehler] Project403.dpr(31): E2010 Inkompatible Typen: 'System.TArray<System.Integer>' und 'Pointer' end; |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
gruss |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
![]() |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
Aber bitte siehe shot! Das es durchläuft ohne Fehler kannst du am aktuellen Breakpoint sehen dieser ist weiter unten.
Delphi-Quellcode:
meta := Pointer(pXY);
dann ist
Delphi-Quellcode:
gruss
meta[0] := pXY.X;
meta[1] := pXY.Y; |
AW: inkompatibel TArray<Integer> Pointer
Ich weiß ja nicht, wie du pXY zuweist. Wenn das ein Pointer auf das erste Element eines TArray<Integer> ist, dann funktioniert das natürlich, weil dann die betreffenden Speicherbereiche ja sinnvolle Werte beinhalten.
|
AW: inkompatibel TArray<Integer> Pointer
Zitat:
Delphi-Quellcode:
xy[0].x := 80 + 110; xy[0].y := 135 + 50;
xy[1].x := 140 + 110; xy[1].y := 130 + 50; xy[2].x := 160 + 110; xy[2].y := 80 + 50; xy[3].x := 180 + 110; xy[3].y := 130 + 50; xy[4].X := 240 + 110; xy[4].y := 135 + 50; xy[5].X := 192 + 110; xy[5].y := 165 + 50; xy[6].X := 210 + 110; xy[6].y := 220 + 50; xy[7].X := 160 + 110; xy[7].y := 190 + 50; xy[8].X := 110 + 110; xy[8].y := 220 + 50; xy[9].X := 128 + 110; xy[9].y := 165 + 50;
Delphi-Quellcode:
Siehe @xy[0]..
gSprCtrl.GD_DrawPolyLineToCtrl(HSprCtrl, @xy[0], 10,
gSprCtrl.GD_ColorARGB(255,RGB(100, 250, 150)), 5, ID_POLYLINE, GS_VISIBLE or GS_DRAFT, GD_DRAW_OUTLINE, 0); gSprCtrl.GD_SetObjectImageLabel(ID_ELLIPSE, 'Polyline');
Delphi-Quellcode:
und..
function TSkinSpriteContainer.GD_DrawPolyLineToCtrl(WinHandle: HWND; pXY: PPoint;
ArraySize: Integer; ColrARGB: Colorref; BorderSize, ObjID, GS_STYLE, GD_STYLE: DWORD; Use3D: Short): BOOL; begin Result := False; if (IsWindow(WinHandle)) then Result := gDrawPointsObject(OBJECT_POLYLINE, WinHandle, pXY, ArraySize, ColrARGB, BorderSize, ObjID, GS_STYLE, GD_STYLE, Use3D); end;
Delphi-Quellcode:
aber wie schon gesagt es geht in D2010 aber nicht mit Tokyo
function TSkinSpriteContainer.gDrawPointsObject(ObjectType: Integer; WinHandle: HWND; pXY: PPoint;
ArraySize: Integer; ColrARGB: Colorref; BorderSize, ObjID, GS_STYLE, GD_STYLE: DWORD; Use3D: Short): BOOL; var ExistItem, Item: Integer; x1, y1, x2, y2: Integer; Border, K, C: Integer; meta: TArray<Integer>; pData: Short; begin //... meta := Pointer(pXY); // funktioniert mit D2010 x1 := meta[0]; y1 := meta[1]; x2 := meta[(ArraySize * 2) - 2]; y2 := meta[(ArraySize * 2) - 1]; end; Ich lasse es erst mal mit der 64Bit Version.. das ist mir echt suspekt das ganze. Danke.. gruss |
AW: inkompatibel TArray<Integer> Pointer
Nur mal aus Interesse: Wenn es so in D2010 mit der Pointer-Zuweisung funktioniert, was gibt dann Length(meta) zurück?
Gibt es Fälle, wo der Aufruf mit @xy[<Wert größer 0>] erfolgt? Anhand der Übergabeparameter im ersten Code-Block und der Aussage, daß es funktioniert, schließe ich, daß xy ein TArray<TPoint> ist mit einer Länge von 10 (ArraySize). Das sollte dann auch der oben genannte Wert von Length(meta) sein. Wenn dem so ist, funktioniert dein Code auch noch, wenn du Range-Checking bei der X/Y-Zuweisung im letzten Code-Block einschaltest?
Delphi-Quellcode:
Gibt es einen Grund, warum meta nicht auch als TArray<TPoint> deklariert ist?
{$R+}
x1 := meta[0]; y1 := meta[1]; x2 := meta[(ArraySize * 2) - 2]; y2 := meta[(ArraySize * 2) - 1]; |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
Nein.
Delphi-Quellcode:
Siehe edit.. im vorherigen Beitrag.
xy: array [0..9] of TPoint;
Zitat:
EDIT: Ja funktioniert. gruss |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
Delphi-Quellcode:
procedure Main;
var ArraySize: Integer; xy: TArray<TPoint>; meta: TArray<Integer>; pXY: PPoint; x1: Integer; x2: Integer; y1: Integer; y2: Integer; begin SetLength(xy, 10); xy[0].x := 80 + 110; xy[0].y := 135 + 50; xy[1].x := 140 + 110; xy[1].y := 130 + 50; xy[2].x := 160 + 110; xy[2].y := 80 + 50; xy[3].x := 180 + 110; xy[3].y := 130 + 50; xy[4].X := 240 + 110; xy[4].y := 135 + 50; xy[5].X := 192 + 110; xy[5].y := 165 + 50; xy[6].X := 210 + 110; xy[6].y := 220 + 50; xy[7].X := 160 + 110; xy[7].y := 190 + 50; xy[8].X := 110 + 110; xy[8].y := 220 + 50; xy[9].X := 128 + 110; xy[9].y := 165 + 50; ArraySize := 10; pXY := @xy[0]; meta := Pointer(pXY); {$R+} x1 := meta[0]; y1 := meta[1]; x2 := meta[(ArraySize * 2) - 2]; // <== ERangeError y2 := meta[(ArraySize * 2) - 1]; Writeln(x1, y1, x2, y2); end; |
AW: inkompatibel TArray<Integer> Pointer
Ich bekomme keinen ERangeError mit {$R+}
Kann dir nur mitteilen was hier abgeht. Siehe Range.png der Breakpoint steht auf C.. also hinter deinem ERangeError. Und die Anwendung funktioniert kannst mir glauben ;) Ich zeichne den Stern damit.
Delphi-Quellcode:
ist falsch muss
xy: TArray<TPoint>;
Delphi-Quellcode:
sein.
xy: array [0..9] of TPoint;
Aber wie du sehen kannst scheint
Delphi-Quellcode:
bei dir auch zu funktionieren nur halt in Tokjo nicht.
meta := Pointer(pXY);
Nun! Was ist nun falsch Tokjo oder D2010 Ich kann unter Tokjo diese Zeile nicht Kompilieren wegen besagten Fehler.. und die kommt öfters vor. gruss |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
|
AW: inkompatibel TArray<Integer> Pointer
Zitat:
Zitat:
TArray<TPoint> ? Nur dann denke ich bekomme ich ebenfalls den Range Error. Kann ich ändern sollte kein Problem sein.
Delphi-Quellcode:
Das
GD_DrawPolyLineToCtrl(WinHandle: HWND; pXY: TArray[TPoint>;
ArraySize: Integer; ColrARGB: Colorref; BorderSize, ObjID, GS_STYLE, GD_STYLE: DWORD; Use3D: Short): BOOL;
Delphi-Quellcode:
werde das nochmal testen.. Danke.
x2 := meta[(ArraySize * 2) - 2];
//zu x2 := meta[ArraySize - 2]; gruss |
AW: inkompatibel TArray<Integer> Pointer
Ich würde einen Open Array Parameter verwenden. Das ArraySize kannst du dir dann auch sparen und mit Length(arrXY) ersetzen.
Delphi-Quellcode:
GD_DrawPolyLineToCtrl(WinHandle: HWND; const arrXY: array of TPoint;
ColrARGB: Colorref; BorderSize, ObjID, GS_STYLE, GD_STYLE: DWORD; Use3D: Short): BOOL; |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
gruss |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
Aus folgenden Grund. x und y haben jeweils 10 einträge..
Delphi-Quellcode:
diese werden in der DLL auf diese weise ausgewertet.
var
xy: array of TPoint; begin SetLength(xy, 20); xy[0].x := 190; xy[0].y := 185; xy[1].x := 250; xy[1].y := 180; xy[2].x := 270; xy[2].y := 130; xy[3].x := 290; xy[3].y := 180; xy[4].X := 350; xy[4].y := 185; xy[5].X := 302; xy[5].y := 215; xy[6].X := 320; xy[6].y := 270; xy[7].X := 270; xy[7].y := 240; xy[8].X := 220; xy[8].y := 270; xy[9].X := 238; xy[9].y := 210; gSprCtrl.GD_DrawPolyLineToCtrl(HSprCtrl, xy[0], 10, gSprCtrl.GD_ColorARGB(255,RGB(100, 250, 150)), 5, ID_POLYLINE, GS_VISIBLE or GS_DRAFT, GD_DRAW_OUTLINE, 0); gSprCtrl.GD_SetObjectImageLabel(ID_ELLIPSE, 'Polyline'); end;
Delphi-Quellcode:
Somit muss die länge von ArraySize die hälfte sein.
C := 0;
for K := 0 to (ArraySize - 1) do begin x1 := min(x1, meta[C]); x2 := max(x2, meta[C]); inc(C); y1 := min(y1, meta[C]); y2 := max(y2, meta[C]); inc(C); end; Meta wird dann so zugewiesen.
Delphi-Quellcode:
meta := @pXY;
Ob das jetzt mit 64Bit kompatibel ist muss ich erst noch testen, glaube aber nicht! Meine Frage ist also immer noch nicht beantwortet trotz der fixes ;) Danke nochmal für die Infos. D2010 funktioniert. gruss |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
|
AW: inkompatibel TArray<Integer> Pointer
Zitat:
SetLength(xy, 20); eventuell reden wir an einander vorbei. Zitat:
gruss |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
|
AW: inkompatibel TArray<Integer> Pointer
Zitat:
Ich habe keine zugriff auf das Original das ist ja mein Problem. gruss |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
|
AW: inkompatibel TArray<Integer> Pointer
Dein Beispiel!
Delphi-Quellcode:
Warum hast du hier einen ERangeError?
procedure Main;
var ArraySize: Integer; xy: TArray<TPoint>; meta: TArray<Integer>; pXY: PPoint; x1: Integer; x2: Integer; y1: Integer; y2: Integer; begin SetLength(xy, 10); xy[0].x := 80 + 110; xy[0].y := 135 + 50; xy[1].x := 140 + 110; xy[1].y := 130 + 50; xy[2].x := 160 + 110; xy[2].y := 80 + 50; xy[3].x := 180 + 110; xy[3].y := 130 + 50; xy[4].X := 240 + 110; xy[4].y := 135 + 50; xy[5].X := 192 + 110; xy[5].y := 165 + 50; xy[6].X := 210 + 110; xy[6].y := 220 + 50; xy[7].X := 160 + 110; xy[7].y := 190 + 50; xy[8].X := 110 + 110; xy[8].y := 220 + 50; xy[9].X := 128 + 110; xy[9].y := 165 + 50; ArraySize := 10; pXY := @xy[0]; meta := Pointer(pXY); {$R+} x1 := meta[0]; y1 := meta[1]; x2 := meta[(ArraySize * 2) - 2]; // <== ERangeError y2 := meta[(ArraySize * 2) - 1]; Writeln(x1, y1, x2, y2); end; Genau, weil du dein Array mit einer länge von 10 definiert hast es muss aber 20 sein. Teste es einfach mal. Setze einen Breakpoint auf x1 := meta[0]; Und prüfe welche werte meta dann hat wenn du 20 als länge übergibst. Nur mit 20 hast du alle werte und zwar die von xy[0].x + xy[0].y das wären jetzt schon 2 Und genau das ist mein Problem denn eigentlich möchte ich auch das es mit einer länge von 10 funktioniert. Geht aber nicht weil meta TArray<integer> ist! Mit TPoint funktioniert es nicht so recht. Deshalb muss ich jeden einzelnen wert x, y als Integer an meta übergeben und das sind nun mal 20 nicht 10 Ich caste quasi ein TPoint in ein Integer Array weil 1 Array of TPoint nun mal 2 werte hat müssen diese mit 10 Multipliziert werden. gruss |
AW: inkompatibel TArray<Integer> Pointer
OK, dann bleibst du am besten bei deinem Code, wenn es für dich so funktioniert.
|
AW: inkompatibel TArray<Integer> Pointer
Ja Danke..
Dein Hinweis TPoint als Array auszulegen war ja korrekt nur die länge halt nicht. So sieht es aus! Bilder sagen mehr als 1000 Worte. Wenn du dir die Berechnung genau ansiehst wirst du erkennen warum es bei dir kracht! Siehe inc(C) Der Unterschied ist dieser.. meta: TArray<TPoint> length 10 meta: TArray<Integer> length 20 weil TPoint 2 Werte enthält. Ich caste TPoint in einen Array of Integer deshalb muss ich zwingend die länge des TPoint Array mit 20 festlegen. Ja ist ungewöhnlich! Mit 64Bit geht es nicht.. weil der Compiler bei D2010 oder aber in Tokyo verrückt spielt. Eines der beiden Produkte hat ein Problem. gruss |
AW: inkompatibel TArray<Integer> Pointer
Dein casten zu TArray<integer> ist definitiv falsch! Du hast kein Tarray<Integer>
Das funktioniert unter 32 und 64 Bit:
Delphi-Quellcode:
const
maxIntArraysize = (maxint-sizeof(integer)) div sizeof(integer); type IntArray = Array [0.. maxIntArraysize] of integer; PIntArray = ^IntArray; procedure Main; var ArraySize: Integer; xy: TArray<TPoint>; meta: PIntArray; pXY: PPoint; x1: Integer; x2: Integer; y1: Integer; y2: Integer; begin writeln('Sizeof TPoint ', sizeof(Tpoint)); writeln('Sizeof Integer ', sizeof(Integer)); SetLength(xy, 10); xy[0].x := 80 + 110; xy[0].y := 135 + 50; xy[1].x := 140 + 110; xy[1].y := 130 + 50; xy[2].x := 160 + 110; xy[2].y := 80 + 50; xy[3].x := 180 + 110; xy[3].y := 130 + 50; xy[4].X := 240 + 110; xy[4].y := 135 + 50; xy[5].X := 192 + 110; xy[5].y := 165 + 50; xy[6].X := 210 + 110; xy[6].y := 220 + 50; xy[7].X := 160 + 110; xy[7].y := 190 + 50; xy[8].X := 110 + 110; xy[8].y := 220 + 50; xy[9].X := 128 + 110; xy[9].y := 165 + 50; Writeln('ArraySize Points ', length(xy)); // Length of integer Array ArraySize := length(xy) *2; Writeln('ArraySize integer ', ArraySize); pXY := @xy[0]; meta := Pointer(pXY); {$R+} x1 := meta[0]; y1 := meta[1]; x2 := meta[ArraySize - 2]; y2 := meta[ArraySize - 1]; Writeln(x1:6, y1:6, x2:6, y2:6); end; |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
meta: TArray<Integer>; und so geht's.
Delphi-Quellcode:
gruss
meta := @pXY;
SetLength(meta, ArraySize * 2); x1 := meta[0]; y1 := meta[1]; x2 := meta[(ArraySize * 2) - 2]; y2 := meta[(ArraySize * 2) - 1]; C := 0; for K := 0 to (ArraySize - 1) do begin x1 := min(x1, meta[C]); x2 := max(x2, meta[C]); inc(C); y1 := min(y1, meta[C]); y2 := max(y2, meta[C]); inc(C); end; |
AW: inkompatibel TArray<Integer> Pointer
Ja was den nun?
Pointer auf das Array oder neu erzeugt?
Delphi-Quellcode:
Ein TArray<t> ist etwas anderes als ein klassisches Array [0..n] of t
meta := @pXY; //Pointer
SetLength(meta, ArraySize * 2); //Neu Und warum musst Du überhaupt casten?
Delphi-Quellcode:
Aber nun gut........
for K := 0 to (ArraySize - 1) do
begin x1 := min(x1, xy[k].x); x2 := max(x2, xy[k].x); y1 := min(y1, xy[k].y); y2 := max(y2, xy[k].y); end; |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
Neu erzeugt wird da gar nichts. Anbei zwei shots.. Du siehst also die Daten sind Korrekt. Zitat:
Aber werde deine Variante mal testen. Danke! gruss |
AW: inkompatibel TArray<Integer> Pointer
@Fritzew
Danke für deine Variante habe sie übernommen aber nur den Teil.
Delphi-Quellcode:
Das Ergebnis ist das gleiche aber kompatibler und ohne unnötiges casten.
const
maxIntArraysize = (maxint-sizeof(integer)) div sizeof(integer); type IntArray = Array [0.. maxIntArraysize] of integer; PIntArray = ^IntArray; meta: PIntArray; Nochmals Danke schön :) gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:01 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