Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie ermittelt man die Grenzen mehrdimensionaler Arrays? (https://www.delphipraxis.net/133722-wie-ermittelt-man-die-grenzen-mehrdimensionaler-arrays.html)

quendolineDD 7. Mai 2009 16:09

Re: Wie ermittelt man die Grenzen mehrdimensionaler Arrays?
 
Eine Exception verschlucken, damit sie nicht geworfen wird.

Mithrandir 7. Mai 2009 16:13

Re: Wie ermittelt man die Grenzen mehrdimensionaler Arrays?
 
Das war mir klar. Aber imho ist das kein guter Programmierstil. Entweder ganz, oder gar nicht.

mr_emre_d 7. Mai 2009 16:18

Re: Wie ermittelt man die Grenzen mehrdimensionaler Arrays?
 
Ja stimmt - deshalb ja auch >>brutal<< ;)

Mir fällt leider keine Funktion ein, mit der man die Protektion eines Bereiches im Speicher auslesen kann ..

Ich hab mal den Try-Except Block weggetan und es mit VirtualProect - auch keine gute Lösung - gelöst :D

Delphi-Quellcode:
function CntArrDimensions( const Arr: Pointer ): String;
var
  Protection: Cardinal;
begin
  VirtualProtect( pCardinal( Cardinal(Arr^) - 4 ), 4, PAGE_READWRITE, Protection );
  VirtualProtect( pCardinal( Cardinal(Arr^) - 4 ), 4, Protection, Protection );
  if Protection = 0 then
    Exit;
  Result := '0..' + IntToStr( pCardinal( Cardinal(Arr^) - 4 )^ - 1 ) + ' ' + CntArrDimensions( Pointer( Cardinal(Arr^) ) );
end;
Edit:
@Daniel - Kuhle Signatur ;)

himitsu 7. Mai 2009 16:19

Re: Wie ermittelt man die Grenzen mehrdimensionaler Arrays?
 
Delphi-Quellcode:
function CntArrDimensions(Arr: Pointer): String;
begin
  if Arr = nil then Result := 'leer'
  else Result := '0..' + IntToStr((PPInteger(Arr)^ - 4)^ - 1));
end;
für mehr Ebenen mußt du über die RTTI gehn, denn anders ist keine sichere Auswertung möglich, da du nicht weißt was im Array für Daten enthalten und ob das überhaupt Arrays-Zeiger sind.

Mit viel Spaß könnte ich über ein einfaches Array of Integer deinen Code in eine Endlosschleife steuern :nerd:
z.B.:
Delphi-Quellcode:
Var Arr: Array of Integer;
SetLength(Arr, 1);
Arr[0] := Integer(Arr);

Mithrandir 7. Mai 2009 16:21

Re: Wie ermittelt man die Grenzen mehrdimensionaler Arrays?
 
Zitat:

Zitat von mr_emre_d
Edit:
@Daniel - Kuhle Signatur ;)

Danke. ;) Mir gefällt der Spruch einfach. :)

himitsu 7. Mai 2009 16:34

Re: Wie ermittelt man die Grenzen mehrdimensionaler Arrays?
 
Was mir noch aufgefallen ist, dein Code liefert immer nur die Größe des ersten Arrays einer Ebene und womöglich noch anderes, wenn es an der tiefsten Ebene vorbei ist.

Ein dynamisches Array kann aber für jedes Element/Unterarray einer Ebene 'ne andere Größe besitzen.

mr_emre_d 7. Mai 2009 16:37

Re: Wie ermittelt man die Grenzen mehrdimensionaler Arrays?
 
So ist es :) Jedoch ist sie leicht änderbar :P Und wenn man alle Unterarrays nach ihrer Größe abfragt, dann hat man m^n Abfragen und es wird ganz bestimmt nen Stack-Overflow geben :P

MfG

himitsu 7. Mai 2009 16:40

Re: Wie ermittelt man die Grenzen mehrdimensionaler Arrays?
 
es gibt da zwar 'ne unbestimmte anzahl an Arrays, aber denoch nur soviele Funktionsaufrufe maximal gleichzeitig, wie es Ebenen gibt :angel2:

Schau dir (wenn es dir möglich ist) mal in der SystemUnit die Funktionen _Finalize, _FinalizeArray und _FinalizeRecord an :stupid:

Popov 7. Mai 2009 17:13

Re: Wie ermittelt man die Grenzen mehrdimensionaler Arrays?
 
Zitat:

Zitat von Bernhard Geyer
Wie wäre es damit?
Delphi-Quellcode:
  j := High(a[0]);

Ich hab mir dein Hinweis noch mal angesehen. Es scheint doch richtig zu sein, nur nicht bei meinem Beispiel, da er ja [1..100] dimensioniert war und 0 außerhalb der unteren Grenzen war. So hätte es funktioniert

Delphi-Quellcode:
var
  a: array[[0..100, 10..10000] of Byte;
  i: Integer;
begin
  i := High(a);

DeddyH 7. Mai 2009 17:18

Re: Wie ermittelt man die Grenzen mehrdimensionaler Arrays?
 
High(a) liefert dann 100, High(a[0]) 10000.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:56 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz