Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi EAccessViolation - warum? (https://www.delphipraxis.net/87859-eaccessviolation-warum.html)

fapsons 6. Mär 2007 13:49


EAccessViolation - warum?
 
Hey Leute,

muss heute das Forum leider häufiger beanspruchen, weil ich heute irgendwie mal den Durchblick verloren haben.
Kann mir jemand sagen, warum an der gekennzeichten Stelle es zu einer EAccessViolation kommt?
Warum kann ich denn nicht auf den String schreiben?

Gruß
-fapsons-

Delphi-Quellcode:
function Separate_Prims_From_nWebZE(value: String): T2KeyParts;
var i :Integer;
    str_Prims, str_nWebZE: String;
begin
 for i := 1 to (length(value)- 3) do
 begin
    str_Prims[i] := value[i];               //  <--- EAccessViolation
 end;

 for i := (length(value)- 3) to (length(value)) do
 begin
    str_nWebZE[i] := value[i];
 end;

 result[1] := strtoint(str_Prims);
 result[2] := strtoint(str_nWebZE);
end;

r2c2 6. Mär 2007 13:54

Re: EAccessViolation - warum?
 
Hallo :hi:

Delphi-Quellcode:
    str_Prims[i] := value[i];
str_Prims is noch leer. Somit schreibst du über das Ende des Strings hinaus...

Delphi-Quellcode:
    str_Prims := str_Prims + value[i];
mfg

Christian

xaromz 6. Mär 2007 13:54

Re: EAccessViolation - warum?
 
Hallo,
Zitat:

Zitat von fapsons
Kann mir jemand sagen, warum an der gekennzeichten Stelle es zu einer EAccessViolation kommt?
Warum kann ich denn nicht auf den String schreiben?

Weil der String nicht initialisiert und damit nil ist. Du könntest vorher den String auf die gewünschte Länge setzen:
Delphi-Quellcode:
function Separate_Prims_From_nWebZE(value: String): T2KeyParts;
var i :Integer;
    str_Prims, str_nWebZE: String;
begin
  SetLength(str_Prins, length(Value) - 3);
  for i := 1 to (length(value)- 3) do
 begin
    str_Prims[i] := value[i];
 end;
 ...
Noch besser ist es allerdings, den String direkt zuzuweisen:
Delphi-Quellcode:
function Separate_Prims_From_nWebZE(value: String): T2KeyParts;
var i :Integer;
    str_Prims, str_nWebZE: String;
begin
  str_Prims := Copy(Value, 1, Length(Value) - 3);
 ...
Gruß
xaromz

Klaus01 6. Mär 2007 13:56

Re: EAccessViolation - warum?
 
Delphi-Quellcode:
function Separate_Prims_From_nWebZE(value: String): T2KeyParts;
var i :Integer;
    str_Prims, str_nWebZE: String;
begin
str_Prims:=''; // eingefügt

for i := 1 to (length(value)- 3) do
begin
    str_Prims := Str_Prims + value[i];               //  <--- keine EAccessViolation
end;

for i := (length(value)- 3) to (length(value)) do    
begin
    str_nWebZE[i] := value[i];                      // hier solltest Du es auch ändern.
end;

result[1] := strtoint(str_Prims);
result[2] := strtoint(str_nWebZE);
end;
Grüße
Klaus

r2c2 6. Mär 2007 13:58

Re: EAccessViolation - warum?
 
Oh mann und ich denk nicht an Copy... :wall: Copy is natürlcih der beste Weg... Sollte den Code nächstes Mal genauer angucken.

Siehe auch: http://r2c2.weingut-rehn.de/content3...mit_Delphi.htm

mfg

Christian


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 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