Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String Zuordnung = AV (https://www.delphipraxis.net/101707-string-zuordnung-%3D-av.html)

Neutral General 17. Okt 2007 16:55


String Zuordnung = AV
 
Hi,

Hab etwas, was ohne Probleme funktioniert wenn ichs mit D2007 compiliere. Wenn ich den selben Code mit D7 compiliere bekomme ich eine AV.

Delphi-Quellcode:
TGUILang = packed record
  Install: ShortString;
  Cancel: ShortString;
  btnFinish: ShortString;
  Head: ShortString;
  Agree: ShortString;
  lblFinish: ShortString;
  Exit: ShortString;
end;

// [...]
var tmp: PChar;
    st: TAKClass; // st.FStrings: TStringlist;
begin
  //  ...
  tmp := PChar(@GUI.Langs[j]); // GUI.Langs: Array[1..5] of TGUILang;
  inc(tmp); // Um zum ersten String zu gelangen
  for i := x to y do //x,y sind nicht so wichtig
  begin
    st.FStrings[i] := StringReplace(tmp,'\n',#13#10,[rfReplaceAll,rfIgnoreCase]);
    inc(tmp,256);
  end;
Das lief auch unter D2007 wunderbar. Unter D7 kommt es jedoch manchmal (ka wann und warum) bei dieser Zeile:

Delphi-Quellcode:
st.FStrings[i] := StringReplace(tmp,'\n',#13#10,[rfReplaceAll,rfIgnoreCase]);
zu einer AV. Und ich kann garantieren das FStrings[i] jederzeit existiert. schreibe ich statt

Delphi-Quellcode:
st.FStrings[i] := st.FStrings[i] := StringReplace(tmp,'\n',#13#10,[rfReplaceAll,rfIgnoreCase]);
das hier

Delphi-Quellcode:
st.FStrings[i] := st.FStrings[i] := 'IrgendeinString';
dann gibts kein Fehler -.-
Ich hab das irgendwie versucht durch irgendein gematsche hinzubekommen aber ich raste gleich aus glaub ich.

Gruß
Neutral General

thkerkmann 17. Okt 2007 18:00

Re: String Zuordnung = AV
 
Hi,

versuch mal einen Zwischenschritt um die Position des Fehlers genauer einzugrenzen

Delphi-Quellcode:
  for i := x to y do //x,y sind nicht so wichtig
  begin
    tempstring : = StringReplace(tmp,'\n',#13#10,[rfReplaceAll,rfIgnoreCase]);
    st.FStrings[i] := tempstring;
    inc(tmp,256);
  end;
Ich vermute den Fehler beim Zugriff auf dein tmp...

Gruss

peschai 17. Okt 2007 19:04

Re: String Zuordnung = AV
 
Hallo

Was machst du da !!! :evil:
Dein Problem ist bei
Delphi-Quellcode:
StringReplace(tmp...
Du verwendest hier unnötigerweise PChars.
StringReplace erwartet hier eine String uind keinen PChar. Desweiteren hast du ein Inc(tmp)!!! darin. Damit zeigts du nicht mehr auf das Längebyte an Position 0 eines Shortstring sondern auf das erste Zeichen. Du weist, daß ein PChar mit einer #0 beendet wird und derr Kommt wann ?

Also versuchs bitte mal nur mit Strings.

Muetze1 17. Okt 2007 21:17

Re: String Zuordnung = AV
 
Zitat:

Zitat von peschai
Dein Problem ist bei
Delphi-Quellcode:
StringReplace(tmp...
Du verwendest hier unnötigerweise PChars.

Ja und?

Zitat:

Zitat von peschai
StringReplace erwartet hier eine String uind keinen PChar.

Und da wird dann automatisch konvertiert. Vor dem Aufruf legt Delphi einen temporären String an und übergibt ihn.

Zitat:

Zitat von peschai
Desweiteren hast du ein Inc(tmp)!!! darin.

Damit überspringt er das Längenbyte und der PChar zeigt direkt auf das erste Zeichen. Das ist wohl auch genau so gewollt.

Zitat:

Zitat von peschai
Damit zeigts du nicht mehr auf das Längebyte an Position 0 eines Shortstring sondern auf das erste Zeichen.

Ich denke auch nicht, dass er vorne im String ein komisches Zeichen haben will.

Zitat:

Zitat von peschai
Du weist, daß ein PChar mit einer #0 beendet wird und derr Kommt wann ?

Vielleicht hatte er den ganzen Record vor der ersten Verwendung mit FillChar()/ZeroMemory() genullt? Bei normalen Strings (Sprich AnsiString) gibt es immer hinten ein #0. Ich weiss nun nicht, ob ein solches Verhalten auch bei ShortString?

Zitat:

Zitat von peschai
Also versuchs bitte mal nur mit Strings.

Dem würde ich aber grundsätzlich zustimmen.

thkerkmann 17. Okt 2007 21:20

Re: String Zuordnung = AV
 
Zitat:

Vielleicht hatte er den ganzen Record vor der ersten Verwendung mit FillChar()/ZeroMemory() genullt? Bei normalen Strings (Sprich AnsiString) gibt es immer hinten ein #0. Ich weiss nun nicht, ob ein solches Verhalten auch bei ShortString?

Nope...
bei shortstring gibt es kein abschließendes #0. Deswegen steht ja vorne die Länge drin.
Shortstring stammt noch aus der Turbo Pascal Zeit.

Gruss

Muetze1 17. Okt 2007 21:52

Re: String Zuordnung = AV
 
Zitat:

Zitat von thkerkmann
bei shortstring gibt es kein abschließendes #0. Deswegen steht ja vorne die Länge drin.
Shortstring stammt noch aus der Turbo Pascal Zeit.

Ist mir alles klar - aber weisst du genau, ob Delphi sie nicht initialisiert? Schliesslich macht er es bei AnsiStrings (wegen der Referenzzählung zwangsweise, ich weiss) auch. Der Speicherbereich is bekannt und kann somit leicht initialisiert werden bzw. es würde eine Angabe bei der Speicheralloziierung reichen.

3_of_8 17. Okt 2007 21:59

Re: String Zuordnung = AV
 
ShortStrings werden grundsätzlich nicht initialisiert. Wenn man ihnen keinen Wert zuweist, haben sie einen mehr oder weniger zufälligen Wert.

peschai 18. Okt 2007 06:00

Re: String Zuordnung = AV
 
Hallo

@Muetze1: Ich glaube ich habe mich etwas in falscher Reihenfolgte ausgedrückt. Natürlich hast du mit dem Recht was du anmerkst. Das Problem ist aber meiner Meinung nach der Inc(pChars) mit anschliessendem Verwenden in StringReplace wobei die abschliessende NULL nicht geklärt ist...

himitsu 30. Okt 2007 20:40

Re: String Zuordnung = AV
 
genau, bei einem ShortString ist die Länge ausnahmslos durch das Längenbyte festgelegt
und eine abschließende #0 ist laut Definition nicht vorgesehn.

bleib einfach bei (P)ShortString:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var P: PChar;
    st: TAKClass; // st.FStrings: TStringlist;
begin
  //  ...
  P := @GUI.Langs[j];
  for i := x to y do //x,y sind nicht so wichtig
  begin
    st.FStrings[i] := StringReplace(PShortString(P)^,
      '\n', #13#10, [rfReplaceAll,rfIgnoreCase]);
    inc(P, SizeOf(ShortString));
  end;


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