Delphi-PRAXiS
Seite 2 von 2     12   

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)

p80286 27. Feb 2015 18:25

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

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

Mit Deinem coolen Text mag das ja noch funktionieren, aber wenn er richtig lange cool wird ist ein
Delphi-Quellcode:
TB : Array [0..254] of Ansichar;
wohl eher angebracht. Wobei ich ein [1..255] bevorzuge, weil dann der Index synchron laufen kann.

Gruß
K-H

Der schöne Günther 27. Feb 2015 18:36

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.

himitsu 27. Feb 2015 18:46

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

Zitat von p80286 (Beitrag 1291772)
Wobei ich ein [1..255] bevorzuge, weil dann der Index synchron laufen kann.

ShortString :stupid:

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.

p80286 28. Feb 2015 11:34

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

Zitat von himitsu (Beitrag 1291780)

Und rate mal, was passiert, wenn du mal auf einen NextGen-Compiler triffst.
> String-Indize beginnen dort bei 0

Na dann stellt man sich eben um, ein bischen Flexibilität hat noch keinem geschadet.

Gruß
K-H

Bernhard Geyer 28. Feb 2015 12:27

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

Zitat von p80286 (Beitrag 1291851)
Zitat:

Zitat von himitsu (Beitrag 1291780)

Und rate mal, was passiert, wenn du mal auf einen NextGen-Compiler triffst.
> String-Indize beginnen dort bei 0

Na dann stellt man sich eben um, ein bischen Flexibilität hat noch keinem geschadet.

Da nimmt man halt die String-Helper Methoden und man hat wieder einen Quellcode für beide Welten.
Statt Flexibilität muss man halt den Quellcode (nachdem er von Pascal 1 (?) bis XE8 (WinX/OSX) ohne änderung funktionieren würde) umstellen.

SMO 28. Feb 2015 15:31

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

Zitat von Mavarik (Beitrag 1291744)
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"...

Dann müsstest du auch strings immer mit ^ schreiben, denn die sind nichts anderes als dynamische Arrays of Char. :stupid:

Also ich bin froh, dass man ^ mittlerweile in vielen Fällen (z.B. Zugriff auf Felder eines Record-Pointers) weglassen kann.


Zitat:

Zitat von Mavarik (Beitrag 1291716)
Na wer findet die Exception?

Also wenn schon, dann richtig:
Delphi-Quellcode:
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;
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. ;)

Mavarik 1. Mär 2015 02:03

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

Zitat von SMO (Beitrag 1291863)
Dann müsstest du auch strings immer mit ^ schreiben, denn die sind nichts anderes als dynamische Arrays of Char. :stupid:

Nur wenn es keine Shortstrings sind... Da sich bei einem ShortString wieder Speicher dahinter "versteckt"

Zitat:

Zitat von SMO (Beitrag 1291863)
Also wenn schon, dann richtig:

Es ging nicht darum es richtig zu machen, sondern eine "möglichen" Fehlerquelle auf zu zeigen... :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr.
Seite 2 von 2     12   

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