Entwickler-Ecke

Entwicklung für mobile Endgeräte - packed array und Android


Gagga - Sa 24.02.24 18:23
Titel: packed array und Android
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 - Mi 28.02.24 23: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 - Do 29.02.24 09: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.


jaenicke - Do 29.02.24 10: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..1961..6of byte;
  PMyArray = ^TMyArray;

var
  SY_1: TMyArray = ((..), 
   ...
   (000000), (000000), (000000), (000000), (000000), (000000), (000000), (000000),
   (000000), (000000), (000000), (000000), (000000), (000000), (000000), (000000));
  SY_2: TMyArray = (..);
  SY_3: TMyArray = (..);

  SYAll: array[0..2of PMyArray = (@SY_1, @SY_2, @SY_3);

// Verwendung:
Result := SYAll[System]^[x, y];


Gagga - Di 12.03.24 15: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
      1for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_1[a,b];
      2for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_2[a,b];
      3for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_3[a,b];
      4for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_4[a,b];
      5for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_5[a,b];
      6for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_6[a,b];
      7for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_7[a,b];
      8for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_8[a,b];
      9for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_9[a,b];
      10for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_10[a,b];
      11for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_11[a,b];
      12for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_12[a,b];
      13for a := 1 to tr do for b := 1 to k do PufSys[a-1,b-1] := SY_13[a,b];
      ...

Gruß
Rüd