Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Dünnbesetztes Array mit geringem Speicherbedarf


Trazom - So 24.02.08 16:22
Titel: Dünnbesetztes Array mit geringem Speicherbedarf
Hallo zusammen,

ich hab mal wieder ein Riesenarray zu verarbeiten. Der Datentyp ist Single. Es geht darum, dass die Funktion einer Messsoftware ein Array mit den Messwerten übergeben bekommt, genauer: Die Adresse eines Arrays, darum kann ich nur ein statisches benutzen.

Im Extremfall enthält das Array 32 Millionen Einträge ungleich Null und davor noch evtl. sehr viel mehr Nulleinträge, also veranschaulicht:

0, 0, 0, <dies ein paar zig Millionen mal>, 0, 0, 0, 5.8, 4.9, <dies maximal 32.000.000 mal>, 7.9, 14.6

Ich sehe es als Verschwendung an, ein statisches Array zu deklarieren, dass so viele Einträge hat und es dann auch noch ständig mit Nullen zu füllen (die Anzahl kann schwanken). Das Problem ist wie gesagt die Forderung, nur den Zeiger darauf zu übergeben, weshalb es nicht dynamisch gemacht werden kann (meines Wissens nach).

Gibt es da noch einen Trick?

VIelen Dank und viele Grüße,
Trazom


Hidden - So 24.02.08 16:33

Hi,

Was spricht dagegen, die Werte z.B. in einem String zu übergeben?
Dann ein spezielles Kürzel für ein Feld mit Nullen, dazu die Anzahl an Nullen:
9,5,3,5,6,444,2,56,345345,456,<<<||6563545637356||>>>,435,57,563,6,465345

mfG,


BenBE - So 24.02.08 16:47

Ein dynamisches Array ist auch nur ein Zeiger auf den ersten Eintrag des Feldes ...

Muss aber u.U. nicht mit ArrayName sondern mit @ArrayName[0] an die Funktion übergeben werden.

Problem bleibt hier aber weiterhin, dass die Zielfunktion keine brauchbare Methode zum Entgegennehmen einer vernünftigen Darstellung bestitzt ...

Oder hast Du auf die Zielfunktion\Anwendung Einfluss?


Horst_H - So 24.02.08 16:57

Hallo,

Dir wird ein Zeiger auf ein array übergeben.
Wozu musst Du denn dieses dann noch kopieren?.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
type
  tMesswert =single;
  tFeld = array[0..0of tMesswert;
  tpFeld = ^tFeld;
var
  Messdaten : tpFeld;
  wert : tMesswert;
...proc/func...
begin
  Messdaten := tpFeld(ÜbergebenerZeiger);

  for i := 0 to ??? {sollte irgendwie bekanntsein}  do
    begin
    //Switch range check Off , pleaze Meist ohnehin der Fall
    Wert := Messdaten^[i];
    rechne..


Gruß Horst

Edit
Ein dynamisches array ala Messdaten : array of tMesswert speichert aber auch Angaben über die Größe des Feldes und würde es bei Bedarf vergrößern und auch eine Zugriffsfehler melden, wenn man auf ein Element ausserhalb der aktuelle Größe zugreifen will.


Trazom - So 24.02.08 17:27

user profile iconBenBE hat folgendes geschrieben:
Oder hast Du auf die Zielfunktion\Anwendung Einfluss?
Leider eben nicht und mit Zeigern auf dynamische Arrays hab ich mich eine Woche rumgequält und es nicht hinbekommen.