AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

String Zuordnung = AV

Ein Thema von Neutral General · begonnen am 17. Okt 2007 · letzter Beitrag vom 30. Okt 2007
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

String Zuordnung = AV

  Alt 17. Okt 2007, 16:55
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:

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

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

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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#2

Re: String Zuordnung = AV

  Alt 17. Okt 2007, 18:00
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
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#3

Re: String Zuordnung = AV

  Alt 17. Okt 2007, 19:04
Hallo

Was machst du da !!!
Dein Problem ist bei 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.
Peter Schaible
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: String Zuordnung = AV

  Alt 17. Okt 2007, 21:17
Zitat von peschai:
Dein Problem ist bei StringReplace(tmp... Du verwendest hier unnötigerweise PChars.
Ja und?

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 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 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 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 von peschai:
Also versuchs bitte mal nur mit Strings.
Dem würde ich aber grundsätzlich zustimmen.
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#5

Re: String Zuordnung = AV

  Alt 17. Okt 2007, 21:20
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
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: String Zuordnung = AV

  Alt 17. Okt 2007, 21:52
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.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: String Zuordnung = AV

  Alt 17. Okt 2007, 21:59
ShortStrings werden grundsätzlich nicht initialisiert. Wenn man ihnen keinen Wert zuweist, haben sie einen mehr oder weniger zufälligen Wert.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#8

Re: String Zuordnung = AV

  Alt 18. Okt 2007, 06:00
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...
Peter Schaible
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: String Zuordnung = AV

  Alt 30. Okt 2007, 20:40
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:05 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