Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi PChar nach String schneidet Zeichen ab (https://www.delphipraxis.net/64040-pchar-nach-string-schneidet-zeichen-ab.html)

Dust Signs 26. Feb 2006 16:01


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

himitsu 27. Feb 2006 11:52

Re: PChar nach String schneidet Zeichen ab
 
Delphi-Quellcode:
FState := AnOutput.AdditionalData;
Das sollte eigentlich dank der CompilerMagic funktionieren.

Delphi-Quellcode:
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.


Delphi-Quellcode:
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 :gruebel:
Delphi-Quellcode:
SetLength(FState, StrLen(AnOutput.AdditionalData));
Move(@FState, AnOutput.AdditionalData, Length(FState));

SetString(FState, AnOutput.AdditionalData, StrLen(AnOutput.AdditionalData));

Robert Marquardt 27. Feb 2006 12:59

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.

SirThornberry 27. Feb 2006 14:33

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.

Robert Marquardt 27. Feb 2006 15:19

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.

Motzi 27. Feb 2006 15:33

Re: PChar nach String schneidet Zeichen ab
 
Zitat:

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...

himitsu 27. Feb 2006 18:34

Re: PChar nach String schneidet Zeichen ab
 
Zitat:

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 ^_^

Dust Signs 27. Feb 2006 18:38

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

Robert Marquardt 28. Feb 2006 04:42

Re: PChar nach String schneidet Zeichen ab
 
Du koenntest mal die Fragen beantworten, damit wir dir helfen koennen.

Dust Signs 28. Feb 2006 07:50

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 18:24 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