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..0] of tMesswert; tpFeld = ^tFeld; var Messdaten : tpFeld; wert : tMesswert; ...proc/func... begin Messdaten := tpFeld(ÜbergebenerZeiger);
for i := 0 to ??? do begin 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
BenBE 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!