AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Vorsicht! statisches Array mit Startindex>0
Thema durchsuchen
Ansicht
Themen-Optionen

Vorsicht! statisches Array mit Startindex>0

Ein Thema von Photoner · begonnen am 27. Feb 2015 · letzter Beitrag vom 1. Mär 2015
Antwort Antwort
Seite 1 von 2  1 2      
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

Vorsicht! statisches Array mit Startindex>0

  Alt 27. Feb 2015, 13:42
Delphi-Version: XE5
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
Chris
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Vorsicht! statisches Array mit Startindex>0

  Alt 27. Feb 2015, 13:51
Brandgefährlich ist es auch ein Sprung vom 5-Meter-Turm ohne sich vergewissert zu haben, dass sich ausreichend Wasser im Becken befindet

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?)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Vorsicht! statisches Array mit Startindex>0

  Alt 27. Feb 2015, 13:52
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
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Vorsicht! statisches Array mit Startindex>0

  Alt 27. Feb 2015, 13:55
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Vorsicht! statisches Array mit Startindex>0

  Alt 27. Feb 2015, 13:58
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).
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Vorsicht! statisches Array mit Startindex>0

  Alt 27. Feb 2015, 14:03
Doch, der Compiler/Programm kann "Exceptions" werfen, aber wenn du die Bereichsprüfung nicht aktivierst...
[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 array[0] und man sieht öfters mal ein array[0..0] , wo man es ja will, daß man über die 0 hinaus kann.
$2B or not $2B

Geändert von himitsu (27. Feb 2015 um 14:13 Uhr)
  Mit Zitat antworten Zitat
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

AW: Vorsicht! statisches Array mit Startindex>0

  Alt 27. Feb 2015, 15:20
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)

Brandgefährlich ist es auch ein Sprung vom 5-Meter-Turm ohne sich vergewissert zu haben, dass sich ausreichend Wasser im Becken befindet

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.



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


  Move(S[1],A,length(S));
Sollte wohl eher so aussehen:
Move(S[1],A[0],length(S)); und was willst du damit sagen?
Chris
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Vorsicht! statisches Array mit Startindex>0

  Alt 27. Feb 2015, 15:28
Sollte wohl eher so aussehen:
Move(S[1],A[0],length(S));
Ach wieso den?

Move(S[1],B,length(S)); Funktioniert doch...
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#9

AW: Vorsicht! statisches Array mit Startindex>0

  Alt 27. Feb 2015, 15:47
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: Vorsicht! statisches Array mit Startindex>0

  Alt 27. Feb 2015, 17:23
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
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:47 Uhr.
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