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 Vorsicht! statisches Array mit Startindex>0 (https://www.delphipraxis.net/184114-vorsicht-statisches-array-mit-startindex-0-a.html)

Photoner 27. Feb 2015 12:42

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:
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.
Ergibt:
-1
-1

0
-1
-1

-1
-1

Sir Rufo 27. Feb 2015 12:51

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?)

Mavarik 27. Feb 2015 12:52

AW: Vorsicht! statisches Array mit Startindex>0
 
Zitat:

Zitat von Photoner (Beitrag 1291712)
Halte ich für brandgefährlich.

emm nicht dein Ernst....

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:
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;
Na wer findet die Exception?

Mavarik

Der schöne Günther 27. Feb 2015 12:55

AW: Vorsicht! statisches Array mit Startindex>0
 
Hier ein etwas kürzeres Beispiel:
Delphi-Quellcode:
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.
Ohne mich dem Spott anschließen zu wollen:

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.

Bernhard Geyer 27. Feb 2015 12:58

AW: Vorsicht! statisches Array mit Startindex>0
 
Zitat:

Zitat von Photoner (Beitrag 1291712)
Vieleicht ist das für viele eine olle Kamelle,

Ist es. Das ist ein feature der Sprache Pascal sowas zu können. Andere Sprachen können sowas nicht und deshalt macht man dort immer ein for 0 ... count-1 (Außgenommen jetzt moderne sprache wo man ein for-each-Schleife hat).

himitsu 27. Feb 2015 13:03

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:
for i in meinArray do
  WriteLn(i);
Dafür kennt Delphi keine leeren/undefinierten statischen Arrays ala
Delphi-Quellcode:
array[0]
und man sieht öfters mal ein
Delphi-Quellcode:
array[0..0]
, wo man es ja will, daß man über die 0 hinaus kann.

Photoner 27. Feb 2015 14:20

AW: Vorsicht! statisches Array mit Startindex>0
 
Zitat:

Zitat von Sir Rufo (Beitrag 1291715)
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?)

Danke für den Hinweis. Jetzt weiß ich dass es beim Anlegen von neuen Projekten aus ist. (Lässt sich aber bestimmt einstellen)

Zitat:

Zitat von Sir Rufo (Beitrag 1291715)
Brandgefährlich ist es auch ein Sprung vom 5-Meter-Turm ohne sich vergewissert zu haben, dass sich ausreichend Wasser im Becken befindet :roll:


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 von Mavarik (Beitrag 1291716)

Delphi-Quellcode:
type
   TA : Array of Ansichar;
   TB : Array [0..200] of Ansichar;

emm nicht dein Ernst....

Zitat:

Zitat von Mavarik (Beitrag 1291716)

Delphi-Quellcode:
  Move(S[1],A,length(S));

Sollte wohl eher so aussehen:
Delphi-Quellcode:
Move(S[1],A[0],length(S));
und was willst du damit sagen?

Mavarik 27. Feb 2015 14:28

AW: Vorsicht! statisches Array mit Startindex>0
 
Zitat:

Zitat von Photoner (Beitrag 1291741)
Sollte wohl eher so aussehen:
Delphi-Quellcode:
Move(S[1],A[0],length(S));

Ach wieso den?

Delphi-Quellcode:
Move(S[1],B,length(S));
Funktioniert doch...
Zitat:

Zitat von Photoner (Beitrag 1291741)
und was willst du damit sagen?

SO eine Änderung ist brachgefährlich...

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

Uwe Raabe 27. Feb 2015 14:47

AW: Vorsicht! statisches Array mit Startindex>0
 
Zitat:

Zitat von Mavarik (Beitrag 1291744)
SO eine Änderung ist brachgefährlich...

Eigentlich ist das MOVE gefährlich, da es nicht typ-sicher ist. Deshalb muss man bei der Verwendung von solchen Low-Level-Dingen halt besonders aufpassen.

himitsu 27. Feb 2015 16:23

AW: Vorsicht! statisches Array mit Startindex>0
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1291748)
Eigentlich ist das MOVE gefährlich, da es nicht typ-sicher ist. Deshalb muss man bei der Verwendung von solchen Low-Level-Dingen halt besonders aufpassen.

Dafür gibt es ja inzwischen z.B. TArrayManager<T>.Move / TMoveArrayManager<T>.Move


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:49 Uhr.
Seite 1 von 2  1 2      

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