![]() |
PChar nach String schneidet Zeichen ab
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:
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?
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; Dust Signs PS. ![]() |
Re: PChar nach String schneidet Zeichen ab
Delphi-Quellcode:
Das sollte eigentlich dank der CompilerMagic funktionieren.
FState := AnOutput.AdditionalData;
Delphi-Quellcode:
Bring überhauptnichts, da Copy schließlich den gesammten String zurückliefert, also das Selbe wie reingeht.
FState := Copy(AnOutput.AdditionalData, 1, Length(AnOutput.AdditionalData));
Und bei der Übergabe an Copy wird AnOutput.AdditionalData genauso wie beim ersten Code in einen String umgewandelt.
Delphi-Quellcode:
Funktioniert es wenigstens damit, auch wenn's etwas zu alt ist?
FState := StrPas(AnOutput.AdditionalData);
Und bist du dir ganz sicher, daß in AnOutput.AdditionalData wirklich alles richtig drin steht? Oder versuch mal eines davon :gruebel:
Delphi-Quellcode:
SetLength(FState, StrLen(AnOutput.AdditionalData));
Move(@FState, AnOutput.AdditionalData, Length(FState)); SetString(FState, AnOutput.AdditionalData, StrLen(AnOutput.AdditionalData)); |
Re: PChar nach String schneidet Zeichen ab
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. |
Re: PChar nach String schneidet Zeichen ab
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. |
Re: PChar nach String schneidet Zeichen ab
StrPas und die Zuweisung eines PChar zu einem String machen das Gleiche.
Es wird ein neuer String alloziiert und ein StrCopy() durchgefuehrt. |
Re: PChar nach String schneidet Zeichen ab
Zitat:
Delphi-Quellcode:
Es ist also egal ob man StrPas, einen Cast nach String oder eine direkte Zuweisung verwendet, es passiert immer, Compilermagic sei dank, immer dasselbe.
function StrPas(const Str: PChar): string;
begin Result := Str; end; 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... |
Re: PChar nach String schneidet Zeichen ab
Zitat:
|
Re: PChar nach String schneidet Zeichen ab
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 |
Re: PChar nach String schneidet Zeichen ab
Du koenntest mal die Fragen beantworten, damit wir dir helfen koennen.
|
Re: PChar nach String schneidet Zeichen ab
@Robert: deine Vermutung mit dem bereits deallozierten String ist korrekt.
Dust Signs |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 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 by Thomas Breitkreuz