Autor |
Beitrag |
Gagga
Beiträge: 103
Win 11
Delphi 12 Athen Pro
|
Verfasst: Sa 24.02.24 17:23
Hallo!
Unter Windows arbeite ich problemlos mit einem Array, das unterschiedlich große zweidimensionale Arrays enthält.
Beispiel:
Quelltext 1: 2: 3: 4: 5:
| SYAll:array[0..2] of pointer = (@SY_1,@SY_2,@SY_3);
SY_1:packed array[1..196,1..4] of byte=.... SY_2:packed array[1..36,1..5] of byte=.... SY_3:packed array[1..128,1..6] of byte=.... |
Die Werte der Arrays liefert mir folgende Funktion
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| Function getValueCO(System,k,x,y:Integer):byte; var mem:Cardinal; begin mem:=Cardinal(SYAll[System]); //index ist 1-basiert inc(mem,sizeof(Byte)* (x*k-k + y-1)); result:=pByte(mem)^; end; |
Unter Android liefert mir die Funktion immer 0. Liefert es daran, dass sie mit einem 1-basierten Index arbeitet? Was muss ich da ändern?
Gruß
Rüd
|
|
GuaAck
Beiträge: 378
Erhaltene Danke: 32
Windows 8.1
Delphi 10.4 Comm. Edition
|
Verfasst: Mi 28.02.24 22:48
Hallo,
meldet sich ja niemand. Mit Android habe ich nie was gemacht, aber ich erinnere mich, dass das "packed" nicht immer untertützt wird. ("Nicht unterstützt" = jedes Feldelement wurd auf einer Wortgrenze (32 bzw. 64 Bit typisch) abgespeichert. Dazu solltest Du einfach mal ein paar einfach Versuche machen.
Vielleicht hilft es ja,
Gruß
GuaAck
|
|
Sinspin
Beiträge: 1334
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Do 29.02.24 08:41
Das mit der -1 sollte eigentlich keine Rolle spielen. Wenn Du mit [y, x] arbeitest berechnet der Compiler die Adresse und du musst mit 1 anfangen. Aber bei direktem Speicherzugriff ist alles null-basiert und passt.
Was Du auf beiden Systemen testen kannst ist SizeOf mit den Typen der arrays. Oder mit variablen davon, um ganz sicher zu gehen.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
jaenicke
Beiträge: 19288
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 29.02.24 09:11
Wie wäre es, wenn du einfach gleich große Array verwendest und mit Nullen auffüllst? Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| type TMyArray = packed array[1..196, 1..6] of byte; PMyArray = ^TMyArray;
var SY_1: TMyArray = ((..), ... (0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0)); SY_2: TMyArray = (..); SY_3: TMyArray = (..);
SYAll: array[0..2] of PMyArray = (@SY_1, @SY_2, @SY_3);
Result := SYAll[System]^[x, y]; |
|
|
Gagga
Beiträge: 103
Win 11
Delphi 12 Athen Pro
|
Verfasst: Di 12.03.24 14:41
Entschuldigt, dass ich erst jetzt antworte, aber nachdem für mich der Kauf der Athen Pro geklärt war, lag die Priorität auf der Migration meiner PC-Anwendungen.
Habe das Thema jetzt ohne Packed Arrays über ein zweidimensionales dynamisches Array gelöst, das in einem case-Block gefüllt wird.
@Sebastian: da es um mehrere hundert Arrays geht, die in der 2. Dimension ebenfalls in die Hunderte gehen, habe ich mir das erspart. Den case-Block habe ich mir mit einer einfachen Schleife in ein Memo-Feld schreiben lassen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| setlength(PufSys,tr,k); case i of 1: for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_1[a,b]; 2: for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_2[a,b]; 3: for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_3[a,b]; 4: for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_4[a,b]; 5: for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_5[a,b]; 6: for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_6[a,b]; 7: for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_7[a,b]; 8: for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_8[a,b]; 9: for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_9[a,b]; 10: for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_10[a,b]; 11: for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_11[a,b]; 12: for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_12[a,b]; 13: for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_13[a,b]; ... |
Gruß
Rüd
|
|
|