AGB  ·  Datenschutz  ·  Impressum  







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

PChar nach String schneidet Zeichen ab

Ein Thema von Dust Signs · begonnen am 26. Feb 2006 · letzter Beitrag vom 28. Feb 2006
Antwort Antwort
Dust Signs

Registriert seit: 28. Dez 2004
Ort: Salzburg
379 Beiträge
 
#1

PChar nach String schneidet Zeichen ab

  Alt 26. Feb 2006, 17:01
Hi!

Ein seltsames Problem, das ich da habe. Wollte eines meiner Programme etwas umbauen und habe nun PChars mit dabei. Da andere Programmteile Strings verwenden, muss ich die PChars in Strings umwandeln - soweit kein Problem. StrPas schreibt mir die Delphihilfe ist veraltet - ich solle doch eine Direktzuweisung verwenden. Ich habe folgende Möglichkeiten ausprobiert (auskommentiert):

Delphi-Quellcode:
      HR_REQUIRES_STATUS_CHANGE: begin
                                   if AnOutput.DataFormat = DF_STATUS_INFORMATION then
// FState := AnOutput.AdditionalData;
// FState := String(AnOutput.AdditionalData);
// FState := Copy(AnOutput.AdditionalData, 1, Length(AnOutput.AdditionalData));
                                     FState := StrPas(AnOutput.AdditionalData);
                                 end;
Das Problem ist folgendes: AdditionalData ist ein PChar, z.B. mit dem Inhalt "F:\Bilder"; vor der Zuweisung ist das auch noch ok; nach der Zuweisung allerdings ist der Inhalt "F:\Bilde"#0 (laut Debugger) - und so wird es dann auch ausgegeben. Interessanterweise passiert das nur, sobald irgendwann einmal "F:\" in AdditionalData steht bzw. gestanden ist (d.h. sobald ich <= 3 Zeichen bin). Davor ist alles normal - danach fehlt immer genau das letzte Zeichen... weiß jemand, wie ich das beheben kann?

Dust Signs

PS. Crossposting DF
(aka AXMD in der EE)
Die Nummer, die Sie gewählt haben, ist imaginär. Bitte drehen Sie Ihr Telefon um 90° und versuchen Sie es erneut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: PChar nach String schneidet Zeichen ab

  Alt 27. Feb 2006, 12:52
FState := AnOutput.AdditionalData; Das sollte eigentlich dank der CompilerMagic funktionieren.

FState := Copy(AnOutput.AdditionalData, 1, Length(AnOutput.AdditionalData)); Bring überhauptnichts, da Copy schließlich den gesammten String zurückliefert, also das Selbe wie reingeht.
Und bei der Übergabe an Copy wird AnOutput.AdditionalData genauso wie beim ersten Code in einen String umgewandelt.


FState := StrPas(AnOutput.AdditionalData); Funktioniert es wenigstens damit, auch wenn's etwas zu alt ist?

Und bist du dir ganz sicher, daß in AnOutput.AdditionalData wirklich alles richtig drin steht?

Oder versuch mal eines davon
Delphi-Quellcode:
SetLength(FState, StrLen(AnOutput.AdditionalData));
Move(@FState, AnOutput.AdditionalData, Length(FState));

SetString(FState, AnOutput.AdditionalData, StrLen(AnOutput.AdditionalData));
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#3

Re: PChar nach String schneidet Zeichen ab

  Alt 27. Feb 2006, 13:59
Das duerfte von AdditionalData abhaengen. Wohin zeigt denn AdditionalData?
Wenn es in einen Delphi-String zeigt der bereits dealloziiert ist, dann kann es sein das der neu alloziierte String (StrPas oder Zuweisung) genau den Speicherbereich auf den AdditionalData zeigt belegt und ihn dabei ueberschreibt.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: PChar nach String schneidet Zeichen ab

  Alt 27. Feb 2006, 15:33
Also direktzuweisungen würde ich nie nehmen weil ich dann angst hätte das da irgendwas nicht klappt (wenn zum Beispiel der Ziel-PChar zu weniger speicher reserviert hat).
Wenn ich mit PChars arbeite mach ich dann doch meist alles Hand zu Fuß und verwende Move.
Wenn es innerhalb des Programmes vorkommen kann das im PChar ein #0 vorkommt verwende ich dann einen Record. In dem ist dann ein Word der die Größe angibt und dann der dazugehörige PChar.
Die Zuweisungen funktionieren dann über funktionen welche mit Move die Daten auf den anderen PChar kopieren und gegebenfalls den PChar freigeben, neu allocieren (mit genügend speicher) und dann darauf das gewünschte zuweisen.
Es wird also ungefähr das gemacht was Delphi bei Strings durch Compilermagic löst.

wie ist das überhaupt bei StrPas. Wird da für den PChar neu Speicher angefordert oder per Compilermagic der vorhanden PChar geändert.

letztendlich benute ich PChar als wären es normale Pointer, Also Speicher manuell anfordern und auch wieder freigeben. Und Direktzuweisungen auch nur wenn ich dem PChar den gleichen Speicher zuweisen will auf den bereits der andere zeigt.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#5

Re: PChar nach String schneidet Zeichen ab

  Alt 27. Feb 2006, 16:19
StrPas und die Zuweisung eines PChar zu einem String machen das Gleiche.
Es wird ein neuer String alloziiert und ein StrCopy() durchgefuehrt.
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#6

Re: PChar nach String schneidet Zeichen ab

  Alt 27. Feb 2006, 16:33
Zitat von Robert Marquardt:
StrPas und die Zuweisung eines PChar zu einem String machen das Gleiche.
Es wird ein neuer String alloziiert und ein StrCopy() durchgefuehrt.
Korrekt, denn die konkrete Implementierung von StrPas schaut folgendermaßen aus:
Delphi-Quellcode:
function StrPas(const Str: PChar): string;
begin
  Result := Str;
end;
Es ist also egal ob man StrPas, einen Cast nach String oder eine direkte Zuweisung verwendet, es passiert immer, Compilermagic sei dank, immer dasselbe.
Ich vermute daher auch, dass das Problem beim AdditionalData-Zeiger liegt. Setz einfach mal AdditionalData und den String auf die überwachten Ausdrücke und schau wo/wann genau sich der Inhalt ändert...
Manuel Pöter
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: PChar nach String schneidet Zeichen ab

  Alt 27. Feb 2006, 19:34
Zitat von SirThornberry:
Also direktzuweisungen würde ich nie nehmen weil ich dann angst hätte das da irgendwas nicht klappt (wenn zum Beispiel der Ziel-PChar zu weniger speicher reserviert hat).
Wenn ich mit PChars arbeite mach ich dann doch meist alles Hand zu Fuß und verwende Move.
Das mache ich zwar auch oftmals, aber hier ist doch egal, wieviel Speicher für den PChar reserviert ist, da ja im PChar nachgesehn wird wo das erste #0 ist, dabei die Zeichen davor gezählt werden, der Speicher vom String angepasst wird und erst dann die Daten in den String geschrieben werden ... also ob genug Speicher reserviert ist, ist vollkommen egal ^_^
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Dust Signs

Registriert seit: 28. Dez 2004
Ort: Salzburg
379 Beiträge
 
#8

Re: PChar nach String schneidet Zeichen ab

  Alt 27. Feb 2006, 19:38
Danke für die zahlreichen Antworten. Ich habe den Fehler jetzt einfach umgangen, indem ich eine globale String-Variable deklariert habe. Ist nicht schön, aber scheinbar die einzige Lösung

Dust Signs
(aka AXMD in der EE)
Die Nummer, die Sie gewählt haben, ist imaginär. Bitte drehen Sie Ihr Telefon um 90° und versuchen Sie es erneut.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#9

Re: PChar nach String schneidet Zeichen ab

  Alt 28. Feb 2006, 05:42
Du koenntest mal die Fragen beantworten, damit wir dir helfen koennen.
  Mit Zitat antworten Zitat
Dust Signs

Registriert seit: 28. Dez 2004
Ort: Salzburg
379 Beiträge
 
#10

Re: PChar nach String schneidet Zeichen ab

  Alt 28. Feb 2006, 08:50
@Robert: deine Vermutung mit dem bereits deallozierten String ist korrekt.

Dust Signs
(aka AXMD in der EE)
Die Nummer, die Sie gewählt haben, ist imaginär. Bitte drehen Sie Ihr Telefon um 90° und versuchen Sie es erneut.
  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:48 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