![]() |
Untere Grenze statisches Array
Hi,
ich habe da etwas merkwürdiges und hätte das mal erklärt: :gruebel:
Delphi-Quellcode:
so habe ich ein Statisches Array definiert. Kann aber auf 41 Elemente zugreifen:
const
max = 40; var; m: array[1..max, 1..2] of double;
Delphi-Quellcode:
Aufgefallen ist mir dass, weil ich das Array im Debug- Modus angeschaut habe und das erste Elememt nicht Null war.
for i := 0 to max do
begin m[i, 1] := i; m[i, 2] := 0; end; ????Warum???? :wall: :wall: :wall: mfg BrunoT P.S. Wenn ich das Array aber benutze, kommt es zu einem Fehler. -> also doch nur 40 Elemente!!! |
Re: Untere Grenze statisches Array
Ein Array geht von 0 - MaxAnzahl
sprich
Delphi-Quellcode:
liefert bei dir 41 Elemente, da deine Schleife bei 0 anfängt
for i := Low(AArray) to High(AArray)
... und bei 40 aufhört -> 40 Elemente + 0´tes Element = 41 ;) |
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. |
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) |
Re: Untere Grenze statisches Array
Zitat:
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... |
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:
Kann aber nicht gesund sein, wenn das noch funzt. Du solltest folgendes machen:
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.
Delphi-Quellcode:
Gegebenenfalls solltest Du Bereichüberwachung einschalten oder im Programmtext dafür sorgen, dass die Arraygrenzen nicht überschritten werden können.
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; Viel Erfolg wünscht Dir profmaster |
Re: Untere Grenze statisches Array
Zitat:
Zitat:
|
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:
|
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 |
Re: Untere Grenze statisches Array
Zitat:
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:
lieber
for i := Anfangwert to Maxwert do
...
Delphi-Quellcode:
schreibst, das ist nicht so fehleranfällig...
for i := Low(MeinArray) to High(MeinArray) do
... ..nur zwei gutgemeinte Ratschläge ;) Gruß Tyrael |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 Uhr. |
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