Autor Beitrag
Gagga
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 103

Win 11
Delphi 12 Athen Pro
BeitragVerfasst: Sa 24.02.24 17:23 
Hallo!

Unter Windows arbeite ich problemlos mit einem Array, das unterschiedlich große zweidimensionale Arrays enthält.

Beispiel:
ausblenden 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 378
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1334
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19288
Erhaltene Danke: 1743

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 29.02.24 09:11 
Wie wäre es, wenn du einfach gleich große Array verwendest und mit Nullen auffüllst?
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 103

Win 11
Delphi 12 Athen Pro
BeitragVerfasst: 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:

ausblenden 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