![]() |
Delphi-Version: XE5
Cast nach PChar() castet in Wirklichkeit nach PAnsiChar
Ich hätte nicht gedacht, so eine Frage einmal stellen zu müssen. Das Thema PWideChar/PAnsiChar/PChar sollte hier ja eigentlich zur Genüge abgefrühstückt worden sein.
Trotzdem bin ich hiermit auf die Nase gefallen, und ich verstehe es nicht: Habe ich eine Variable
Delphi-Quellcode:
, gibt der Cast
myStrA: AnsiString
Delphi-Quellcode:
nicht einen
PChar(myStrA)
Delphi-Quellcode:
sondern einen
PChar
Delphi-Quellcode:
zurück! Warum? Noch besser: Warum verhält sich
PAnsiChar
Delphi-Quellcode:
anders und gibt, wie erwartet, einen
PChar(AnsiString('Test'))
Delphi-Quellcode:
zurück?
PChar
Das Beispielprogramm
Delphi-Quellcode:
erzeugt folgende Ausgabe
// JCL_DEBUG_EXPERT_GENERATEJDBG OFF
// JCL_DEBUG_EXPERT_INSERTJDBG OFF // JCL_DEBUG_EXPERT_DELETEMAPFILE OFF program Project99; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; var myPChar: PChar; myStrA: AnsiString; myStrB: String; procedure printChars(const content: Pointer); const maxLength: Integer = 10; var pos: Integer; foundNull: Boolean; begin Write(sLineBreak); foundNull := False; for pos := 0 to Pred(maxLength) do begin Write( (PByte(content)+pos)^ ); if (PByte(content)+pos)^ = 0 then if not foundNull then foundNull := True else Break else foundNull := False; Write('.'); end; Write(sLineBreak); end; begin myStrA := 'Test'; myPChar := PChar(myStrA); // W1044 Bedenkliche Typumwandlung von AnsiString in PWideChar printChars(myPChar); myPChar := PChar(AnsiString('Test')); printChars(myPChar); myStrB := 'Test'; myPChar := PChar(myStrB); printChars(myPChar); readln; end.
Code:
84.101.115.116.0.0
84.0.101.0.115.0.116.0.0 84.0.101.0.115.0.116.0.0 |
AW: Cast nach PChar() castet in Wirklichkeit nach PAnsiChar
PChar ist kein Cast sondern einen Zeiger auf einen UnicodeString. Zeigt dieser auf einen AnsString wird dieser nicht automatisch gewandelt.
|
AW: Cast nach PChar() castet in Wirklichkeit nach PAnsiChar
TTyp1(variable) ist doch ein Cast nach TTyp1, oder?
Auch erklärt das doch nicht, warum sich Fall 1 anders verhält als Fall2, oder? |
AW: Cast nach PChar() castet in Wirklichkeit nach PAnsiChar
Zitat:
Im Fall 2 ist es ein UnicodeString, welches du als AnsiString ansiehst. der Zeiger weist aber auf einen UnicodeString. Im 1. Fall ist und bleibt es ein AnsiString. |
AW: Cast nach PChar() castet in Wirklichkeit nach PAnsiChar
Es sollte ja auch eine Meldung im Compiler-Log geben, daß du dort was falsch machst. :stupid:
Delphi-Quellcode:
:angel:
PChar(String(myStrA))
Warum sag ich wohl ständig AnsiString=PAnsiChar und String=PChar ? ![]() |
AW: Cast nach PChar() castet in Wirklichkeit nach PAnsiChar
Die große wichtige Aussage hier ist, dass Casten (abgesehen von einigen speziellen Compiler-Magic-Fällen) nicht die Daten sondern die Interpretation der Daten ändert.
Das ist genauso wie beim Umbenennen von Dateien. Das Umbenennen von Bild.bmp in Bild.png ändert an der Datei gar nichts und wandelt natürlich auch nicht das Bitmap in ein PNG um. Genauso ist es mit dem Casten. |
AW: Cast nach PChar() castet in Wirklichkeit nach PAnsiChar
Warum sich Fall 1 von Fall 2 unterscheidet sehe ich jetzt, das war dumm von mir.
Aber: Stehe ich immer noch auf dem Schlauch oder werkelt hier beim Ausdruck PChar(irgendwas) Magie? Ich sehe nirgendwo, dass es kein einfacher, statischer Cast sein sollte. Und: Warum wandelt er es nicht in einem
Delphi-Quellcode:
um wenn ich einen
PWideChar
Delphi-Quellcode:
reinstecke? Ist das irgendwo dokumentiert?
AnsiString
|
AW: Cast nach PChar() castet in Wirklichkeit nach PAnsiChar
Weil es ein Cast ist und Casts nichts umwandeln (siehe oben).
|
AW: Cast nach PChar() castet in Wirklichkeit nach PAnsiChar
im Speicher steht ein AnsiString ( 8Bit pro Zeichen), die ändert sich nicht blos weil du einem Ziegr sagt, er würde auf einen Speicherbereich zeigen, welcher eine String beinhalten würde, bei welchem ein Zeichen 16 Bit belegen würde.
|
AW: Cast nach PChar() castet in Wirklichkeit nach PAnsiChar
Delphi-Quellcode:
myStrA := 'Test'; // Konstante WideChar wird durch Zuweisung in einen AnsiStr umgewandelt
myPChar := PChar(myStrA); // nur ein cast, keine Umwandlung printChars(myPChar); myPChar := PChar(AnsiString('Test')); // Konstante WideChar, 2x nur cast, keine Umwandlung printChars(myPChar); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 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