Riesenarray stürzt ab

Warum ist es nicht möglich in Delphi ein Array der Größe 12 mal 500000 zu definieren? Jedesmal bricht das Programm mit einem Stacküberlauf ab.

Grüße
Fabian

anhang: ein integer array dieser Größe ist nicht möglich, ein Bool Array jedoch schon. Ich bräuchte jeweils 2 bit (also 4 Möglichkeiten) in jedem Arrayfeld. Weiß jemand wie man das realisieren könnte?

Grüße
Fabian

anhang: ein integer array dieser Größe ist nicht möglich, ein
Bool Array jedoch schon. Ich bräuchte jeweils 2 bit (also 4
Möglichkeiten) in jedem Arrayfeld. Weiß jemand wie man das
realisieren könnte?

Warum Delphi das nicht kann, hängt mit der Art zusammen, wie Delphi den Speicher verwaltet. Wenn du nur 2 bit brauchst, nimm char oder byte als Typ. Damit du nicht 6 Bit pro Byte vergeudest, packe halt 4 deiner Speicherzellen in ein Array-Feld…

Abfragen kannst du dann mit

2bitwert = (array[index div 4] and (3 shl (index mod 4))) shr (index mod 4)

Speichern mit

array[index div 4] = array[index div 4] and not (3 shl (index mod 4))
array[index div 4] = array[index div 4] or (2bitwert shl (index mod 4))

…oder so ähnlich. (Beim Speichern erst die 2 Bits Nullen, dann die richtigen Werte reinschreiben). 2bitwert ist hier 0…3

Alexander

Ergänzung: das war für ein eindimenionales Array, bei 2 Dimensionen musst du den Index ggfs. noch umrechnen

Hi,

bist Du sicher, daß es einen Stack-Überlauf gibt? Arrays sollten auf dem Heap liegen und nicht auf den Stack, glaube ich. Abgesehen davon kannst du die maximalen Stack- und Heap-Werte mit Compiler-Direktiven {$M…} setzen.

Tip: Probier mal, das Array dynamisch zuzuweisen:

type
 TItemType = ...
 pArray = ^Array[0..0] of TItemType;
var
 Array: pArray;
begin
 Array = NIL;
 ReallocMem(Array,12\*500000\*SizeOf(TItemType));
 // Zugriff auf Element x,y mit Array[x+y\*12], 
 // wobei x=0..11 und y=0..499999
 FreeMem(Array);
end;

Genereller Tip:
Geize immer mit dem Speicher! Wenn für Zahlen zB. Byte-Werte ausreichen, dann nimm kein Integer-Array!

Gruß
Jochen

Hallo,

Warum ist es nicht möglich in Delphi ein Array der Größe 12
mal 500000 zu definieren? Jedesmal bricht das Programm mit
einem Stacküberlauf ab.

ich habe das mal getestet. Bei mir gibts ne Access Violation.

Versuchs mal mit einem dynamischen Array:

var
 x: Array of Array of integer;
 //i: Integer;

begin
 Setlength(x, 12, 500000);
 //SetLength(x, 12);
 //for i := 0 to 11 do SetLength(x[i], 500000);
 x[0,0] := 1;
 x[11, 499999] := 2;
end;

Das hat bei mir funktioniert. Den auskommentierten Teil kannst du probieren, wenn es nicht klappt. Du musst dann natürlich das erste SetLength entfernen.

Gruss, Niels

anhang: ein integer array dieser Größe ist nicht möglich, ein
Bool Array jedoch schon. Ich bräuchte jeweils 2 bit (also 4
Möglichkeiten) in jedem Arrayfeld. Weiß jemand wie man das
realisieren könnte?

Wenn’s unkompliziert sein soll: Ein eindimensionales Array von 32-Bit Werten (longint oder cardinal). Dann haben die zwölf 2-Bit-Werte der zweiten Dimension locker in einem Element Platz. Immer noch 25% Verschnitt, aber allemal besser als 87,5%.

Sei index2 Dein zweiter Indexwert :wink:

Lesen:
value := i[12345][index2];
entspricht
value := j[12345] shr (2*index2) and 3;
{ Bits nach rechts schieben, so daß der gewünschte Wert an den letzten zwei Stellen liegt, dann logisch AND mit binär 11 um die davorliegenden Stellen zu löschen }

Schreiben:
i[12345][index2] := value;
entspricht
j[12345] := j[12345] and not ( 3 shl (2*index2) ) or ( value shl (2*index2) ) ;
{ Erst zwei Nullen an die richtige Position schieben und den vorherigen Wert löschen, dann den neuen Wert and die richtige Position schieben und schreiben }

genumi

anhang: ein integer array dieser Größe ist nicht möglich, ein
Bool Array jedoch schon. Ich bräuchte jeweils 2 bit (also 4
Möglichkeiten) in jedem Arrayfeld. Weiß jemand wie man das
realisieren könnte?

wie währe es mit einer Dynamischen Liste ???
Gruß Torben