Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Untere Grenze statisches Array (https://www.delphipraxis.net/53633-untere-grenze-statisches-array.html)

BrunoT 20. Sep 2005 13:21


Untere Grenze statisches Array
 
Hi,

ich habe da etwas merkwürdiges und hätte das mal erklärt: :gruebel:

Delphi-Quellcode:
const
  max = 40;

var;
  m: array[1..max, 1..2] of double;
so habe ich ein Statisches Array definiert. Kann aber auf 41 Elemente zugreifen:

Delphi-Quellcode:
  for i := 0 to max do
  begin
    m[i, 1] := i;
    m[i, 2] := 0;
  end;
Aufgefallen ist mir dass, weil ich das Array im Debug- Modus angeschaut habe und das erste Elememt nicht Null war.

????Warum???? :wall: :wall: :wall:

mfg

BrunoT

P.S. Wenn ich das Array aber benutze, kommt es zu einem Fehler. -> also doch nur 40 Elemente!!!

Tyrael Y. 20. Sep 2005 13:27

Re: Untere Grenze statisches Array
 
Ein Array geht von 0 - MaxAnzahl

sprich
Delphi-Quellcode:
for i := Low(AArray) to High(AArray)
...
liefert bei dir 41 Elemente, da deine Schleife bei 0 anfängt
und bei 40 aufhört -> 40 Elemente + 0´tes Element = 41 ;)

Luckie 20. Sep 2005 13:29

Re: Untere Grenze statisches Array
 
Was sollte dich daranhindern daraufzuzugreifen? Ich kann auch in eine Steckdose greifen, das sich nacher tot bin nun ja. ;)

Aber aktiviere mal das RangeChecking, dann solltest du zumindest eine Warnung bekommen.

BlackJack 20. Sep 2005 13:31

Re: Untere Grenze statisches Array
 
@Tyrael: für Low() und High() bitte runde Klammern benutzen! ;)


@Bruno: wenn dein array bei Index 1 losgeht, du aber auf Index null zugreifst, dann geht das bei ausgeschalteter bereichsüberprüfung deshalb, weil du dann auf die variable, die vor diesem array steht, zugreifst. wenn da eine "unwichtige" variable steht, kann das unter umständen gut gehen, aber im allgemeinen ist natürlich strengstens davon abzuraten, ein array mit zu grossen/kleinen Indizes zu adressieren. (von daher fürs debugginh vielleicht auch mal in den Compileroptionen die Bereichsüberprüfung aktivieren)

leddl 20. Sep 2005 13:32

Re: Untere Grenze statisches Array
 
Zitat:

Zitat von Tyrael Y.
Ein Array geht von 0 - MaxAnzahl

sprich
Delphi-Quellcode:
for i := Low(AArray) to High(AArray)
...
liefert bei dir 41 Elemente, da deine Schleife bei 0 anfängt
und bei 40 aufhört -> 40 Elemente + 0´tes Element = 41 ;)

Naja, ein dynamisches Array ist sehr wohl 0-basiert, da hast du recht. Bei einem statischen Array kannst du aber den Startwert angeben. Welchen Sinn sollte denn sonst Low() überhaupt haben, wenn jedes Array sowieso bei 0 beginnt?

Aber so wies aussieht hat sichs ja geklärt. Ich hatte das jetzt so verstanden, daß das 0-te Element tatsächlich verfügbar war...

profmaster 20. Sep 2005 13:40

Re: Untere Grenze statisches Array
 
Hallo BrunoT!

Ich vermute, dass intern das Array wie ein dynamisches Array aufgebaut wird, aber eben vom Compiler mit den Vorgaben in der Typdefinition. Und dynamische Arrays beginnen immer mit Index Null. Hab ich aber noch nicht getestet. Ein mögliches Testprogramm wäre folgendes:

Delphi-Quellcode:
unit Test;

interface

type
  TArray = array[5..8] of integer;

var
  ZArray: TArray;

procedure Zuweisen(values: array of integer);

implementation

procedure Zuweisen(values: array of integer);
var i,j: integer;
begin
  for i:=0 to 8 do begin ZArray[i] := values[j]; inc(j); end;
end;

end.

program Zuw;

begin
  Zuweisen([1,2,3,4,5,6,7,8]);
end.
Kann aber nicht gesund sein, wenn das noch funzt. Du solltest folgendes machen:

Delphi-Quellcode:
procedure Zuweisen(values: array of Integer;
va i,j: Integer;
begin
   try
     for i:=0 to 8 do begin ZArray[i] := values[j]; inc(j); end;
   except
     on ERangeError do ...
   end;
end;
Gegebenenfalls solltest Du Bereichüberwachung einschalten oder im Programmtext dafür sorgen, dass die Arraygrenzen nicht überschritten werden können.

Viel Erfolg wünscht Dir

profmaster

jbg 20. Sep 2005 13:48

Re: Untere Grenze statisches Array
 
Zitat:

Zitat von profmaster
Ich vermute, dass intern das Array wie ein dynamisches Array aufgebaut wird

Statische Arrays gab es in Delphi aber schon bevor sie dynamische Arrays eingeführt habe. :wink:

Zitat:

Delphi-Quellcode:
for i:=0 to 8 do begin ZArray[i] := values[j]; inc(j); end;

Das geht aber gehörig schief. Zum einen ist j nur mit einer Wahrscheinlichkeit von 4Mrd zu 1 irgendwann mal 0 und dann greifst du auf ZArray außerhalb des Index-Bereichs zu.

leddl 20. Sep 2005 13:49

Re: Untere Grenze statisches Array
 
Aber dadurch lernt man mal wieder, wie praktisch es sein kann, wenn man Arrays immer gleich von low() bis high() durchgeht, ohne Indizes direkt zu setzen :stupid:

BrunoT 20. Sep 2005 15:00

Re: Untere Grenze statisches Array
 
Hi an Alle,

danke für die erschöpfenden Antworten.

Ich werde es mir angewöhnen meine Arrays entweder als dyn. Arrays zu definieren, oder statische Arrays mit Null zu beginnen, (low und High wären ja auch möglich). :zwinker:

Na ja man lernt eben nicht aus.

mfg


BrunoT

Tyrael Y. 20. Sep 2005 15:26

Re: Untere Grenze statisches Array
 
Zitat:

Zitat von BrunoT
Hi an Alle,

danke für die erschöpfenden Antworten.

Ich werde es mir angewöhnen meine Arrays entweder als dyn. Arrays zu definieren, oder statische Arrays mit Null zu beginnen......

Hallo Bruno,

1.
...ich rate dir möglichst immer statische Arrays zu benutzen, da dyn. Arrays ziemlich an die Performance gehen...guck das jeweilige Projekt genau an und entscheide dann, ob ein statisches Array recihen würde, wenn ja mach es in den meisten Fällen lieber statisch....

2.
...wenn du ein statisches Array erzeugts dann mach das ruhig wie du meinst, du MUSST nicht bei 0 anfangen zu indexieren, nimm was besser passt, das ist schon ok, aber achte darauf, daß wenn du das Array durchgehst du statt
einem Konstrukt wie

Delphi-Quellcode:
for i := Anfangwert to Maxwert do
...
lieber

Delphi-Quellcode:
for i := Low(MeinArray) to High(MeinArray) do
...
schreibst, das ist nicht so fehleranfällig...

..nur zwei gutgemeinte Ratschläge ;)


Gruß

Tyrael


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 Uhr.
Seite 1 von 2  1 2      

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