![]() |
Delphi-Version: XE5
Vorsicht! statisches Array mit Startindex>0
Hi!
Es gibt die Möglichkeit statische Arrays (Typ egal) bei z.B. bei Index 1 anfangen zu lassen. Macht man dies und greift in einer Schleife- weil man es gewöhnt ist und es schneller zu tippen ist- mit Startindex 0 zu, liefert das dann falsche Werte. Halte ich für brandgefährlich. Vieleicht ist das für viele eine olle Kamelle, aber mir war das so nicht bewusst und ich werde in Zukunft lieber mit Low() und High() arbeiten und würde dies auch jedem empfehlen. Codebeispiel Konsolenanwendung:
Delphi-Quellcode:
Ergibt:
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; var Arr : Array [1..2] of Boolean; i : Integer; begin try { TODO -oUser -cConsole Main : Code hier einfügen } Arr[1] := True; Writeln(BoolToStr(Arr[1])); Arr[2] := True; Writeln(BoolToStr(Arr[2])); Writeln(''); //Writeln(BoolToStr(Arr[0])); // Zur Kompilierzeit [dcc32 Fehler] Project1.dpr(20): E1012 Konstantenausdruck verletzt untere Grenzen for I := 0 to High(Arr) do Writeln(BoolToStr(Arr[i])); Writeln(''); for I := Low(Arr) to High(Arr) do Writeln(BoolToStr(Arr[i])); Readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. -1 -1 0 -1 -1 -1 -1 |
AW: Vorsicht! statisches Array mit Startindex>0
Brandgefährlich ist es auch ein Sprung vom 5-Meter-Turm ohne sich vergewissert zu haben, dass sich ausreichend Wasser im Becken befindet :roll:
Du kannst bei den Optionen die Bereichsprüfung einschalten, dann schmeisst dir der Compiler um die Ohren und schwups ist der brand gelöscht (hat es gebrannt?) |
AW: Vorsicht! statisches Array mit Startindex>0
Zitat:
Wie definierst Du den Array für die Tage in einem Monat? Array[1..31] Oder für andere Werte Array[-7..7] Das dynamiche Arrays immer bei Null anfangen ist eher läßtig und bring noch eine ganz andere Gefahr mit: Beispiel:
Delphi-Quellcode:
Na wer findet die Exception?
type
TA : Array of Ansichar; TB : Array [0..200] of Ansichar; var A : TA; B : TB; S : Shortstring; begin S := 'Cooler Text'; Setlength(A,201); Move(S[1],A,length(S)); Move(S[1],B,length(S)); end; Mavarik |
AW: Vorsicht! statisches Array mit Startindex>0
Hier ein etwas kürzeres Beispiel:
Delphi-Quellcode:
Ohne mich dem Spott anschließen zu wollen:
program Project22;
{$APPTYPE CONSOLE} uses System.SysUtils; type TStaticArray = array[5..10] of Integer; var meinArray: TStaticArray; arrayIndex: Integer; begin for arrayIndex := -5 to 99 do WriteLn( meinArray[arrayIndex] ); end. Ja, eigentlich sollte man immer mit Low() und High() arbeiten statt magische Zahlen hinzutippen. Und ja, wenn man die Bereichsprüfung aus hat bekommt man zur Laufzeit keinen Fehler. Aber man sollte trotzdem anmerken dass es wirklich etwas ernüchternd ist dass der Compiler für so etwas offensichtliches keine Warnung ausgeben kann. |
AW: Vorsicht! statisches Array mit Startindex>0
Zitat:
|
AW: Vorsicht! statisches Array mit Startindex>0
Doch, der Compiler/Programm kann "Exceptions" werfen, aber wenn du die Bereichsprüfung nicht aktivierst... :roll:
[edit] siehe Sir Rufo Und dann natürlich die genannten For-In und Low-High.
Delphi-Quellcode:
Dafür kennt Delphi keine leeren/undefinierten statischen Arrays ala
for i in meinArray do
WriteLn(i);
Delphi-Quellcode:
und man sieht öfters mal ein
array[0]
Delphi-Quellcode:
, wo man es ja will, daß man über die 0 hinaus kann.
array[0..0]
|
AW: Vorsicht! statisches Array mit Startindex>0
Zitat:
Zitat:
Warum dieser Sarkasmus? Habe ich was falsches gemacht als ich das für andere Programmierende, die auch nicht so viel Erfahrung haben wie ihr, erwähnt habe? Denk mal darüber nach wie viel Spaß das aktive Teilnehmen im Forum noch für Anfänger macht wenn sich die Altherrenrunde über mich und andere so lustig macht. Zitat:
Zitat:
Delphi-Quellcode:
und was willst du damit sagen?
Move(S[1],A[0],length(S));
|
AW: Vorsicht! statisches Array mit Startindex>0
Zitat:
Delphi-Quellcode:
Funktioniert doch...
Move(S[1],B,length(S));
Zitat:
Eigentlich müsste es bei Dynamischen Array immer mit ^ geschrieben werden, da es sich nicht mehr um Speicherbereich handelt, sondern plötzlich um einen "Zeiger"... Mavarik |
AW: Vorsicht! statisches Array mit Startindex>0
Zitat:
|
AW: Vorsicht! statisches Array mit Startindex>0
Zitat:
|
AW: Vorsicht! statisches Array mit Startindex>0
Zitat:
Delphi-Quellcode:
wohl eher angebracht. Wobei ich ein [1..255] bevorzuge, weil dann der Index synchron laufen kann.
TB : Array [0..254] of Ansichar;
Gruß K-H |
AW: Vorsicht! statisches Array mit Startindex>0
Ich habe noch nicht einmal eine ungefähre Ahnung was euer Code machen soll, aber ich bin mir sicher etwas Assembler würde ihm noch den letzten Schliff verleihen.
|
AW: Vorsicht! statisches Array mit Startindex>0
Zitat:
Und rate mal, was passiert, wenn du mal auf einen NextGen-Compiler triffst. > String-Indize beginnen dort bei 0 Bzw. die neuen String-Helper indizieren immer mit 0 beginnend. Viele Dinge wurden um 2006 durch die FastCodeLibrary ersetzet. Wenn da auch Move dabei war (so wie z.B. die Move's im FastMM), dann ist das schon optimiert und kopiert auch schonmal mit 4 bis 16 Bytes pro Loop. Assembler ist nicht immer besser, vorallem wenn man sich selber nicht mit den Cache- und Pfadvorhersagemechianismen der "aktuellen" Prozeduren auskennt. |
AW: Vorsicht! statisches Array mit Startindex>0
Zitat:
Gruß K-H |
AW: Vorsicht! statisches Array mit Startindex>0
Zitat:
Statt Flexibilität muss man halt den Quellcode (nachdem er von Pascal 1 (?) bis XE8 (WinX/OSX) ohne änderung funktionieren würde) umstellen. |
AW: Vorsicht! statisches Array mit Startindex>0
Zitat:
Also ich bin froh, dass man ^ mittlerweile in vielen Fällen (z.B. Zugriff auf Felder eines Record-Pointers) weglassen kann. Zitat:
Delphi-Quellcode:
So funktioniert es mit statischen und dynamischen Arrays, unabhängig vom Startindex. Nur nicht mit ShortString, weil Low() hier eben 0 liefert und damit nach dem Move #11'CoolerTex' in A und B steht. Besoders schön / leserlich ist solcher Code natürlich auch nicht. ;)
uses
System.Math; type TA = Array of AnsiChar; TB = Array [0 .. 200] of AnsiChar; var A: TA; B: TB; S: ShortString; begin S := 'Cooler Text'; SetLength(A, 201); Move(S[Low(S)], A[Low(A)], Min(Length(S) * SizeOf(S[Low(S)]), Length(A) * SizeOf(A[Low(A)]))); Move(S[Low(S)], B[Low(B)], Min(Length(S) * SizeOf(S[Low(S)]), Length(B) * SizeOf(B[Low(B)]))); end; |
AW: Vorsicht! statisches Array mit Startindex>0
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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 by Thomas Breitkreuz