AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi D2010: Problem bei Typkonvertierung String => PAnsiChar
Thema durchsuchen
Ansicht
Themen-Optionen

D2010: Problem bei Typkonvertierung String => PAnsiChar

Ein Thema von Angel4585 · begonnen am 20. Apr 2010 · letzter Beitrag vom 20. Apr 2010
Antwort Antwort
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#1

D2010: Problem bei Typkonvertierung String => PAnsiChar

  Alt 20. Apr 2010, 08:45
Hallo,

ich habe gerade ne Stunde damit verbracht einen Fehler in meiner Software zu finden.
Es hat sich herausgestellt, das es ein Problem in der Typenkonvertierung von String nach PAnsiChar gibt.

Ich hab das mal ein paar Testzeilen gemacht:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
LString : string;
LAnsiString : AnsiString;
LPAnsiChar1,LPAnsiChar2,LPAnsiChar3,LPAnsiChar4,LPAnsiChar5 : PAnsiChar;
begin
LString:='C:\MeinOrdner\MeinUnterOrdner\MeineDatei.Endung';
LAnsiString:=LString;
LPAnsiChar1:=PAnsiChar(LString);
LPAnsiChar2:=PAnsiChar(ExtractFilePath(LString));
LPAnsiChar3:=PAnsiChar(LString+' -Param1');
LPAnsiChar4:=PAnsiChar(LAnsiString+' -Param1');
LPAnsiChar5:=PAnsiChar(LAnsiString+' -Param1 '+LString);
ShowMessage('LPAnsiChar1='+LPAnsiChar1);
ShowMessage('LPAnsiChar2='+LPAnsiChar2);
ShowMessage('LPAnsiChar3='+LPAnsiChar3);
ShowMessage('LPAnsiChar4='+LPAnsiChar4);
ShowMessage('LPAnsiChar5='+LPAnsiChar5);
end;
LString hat bei der Ausgabe den angegebenen Pfad.
LPAnsiChar1-3 haben nur "C".
LPAnsiChar hat den vollen Pfad + dem Parameter.
LPAnsiChar5 hat wieder nur "C".

Jetzt ist mir natürlich bewusst, dass String ein WideString ist, aber warum bringt denn der Compiler keine Warnung-/Fehler-Meldung, wenn diese Konvertierung zu Problemen führt?
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: D2010: Problem bei Typkonvertierung String => PAnsiCh

  Alt 20. Apr 2010, 08:59
Deklariere LString einfach als AnsiString.
Markus Kinzler
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#3

Re: D2010: Problem bei Typkonvertierung String => PAnsiCh

  Alt 20. Apr 2010, 09:04
LPAnsiChar2 hat dann trotzdem nur C, weil die Methode String als Ergebnis liefert. Ne entsprechende Ansimethode wies es die ja bei anderen Methoden öfters gibt, gibt es hier nicht.
Ich kann das natürlich mit LPAnsiChar2:=PAnsiChar(AnsiString(ExtractFilePath( LString))); hinbekommen, aber schön ist das nicht.
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: D2010: Problem bei Typkonvertierung String => PAnsiCh

  Alt 20. Apr 2010, 09:35
LAnsiString: Bei Zuweisung von String/UnicodeString an AnsiString nimmt Delphi automatisch eine Umwandlung/Konvertierung vor.
Bei Pountertypen ist sowas nicht mautomatisch möglich.


Bei LPAnsiChar1 bis LPAnsiChar3 und vielleicht noch LPAnsiChar5 sollte Delphi bezüglich der falschen Typkonvertierung (UnicodeString nach PAnsiChar) meckern.
Und wenn man dieses ignoriert, dann soll man sich auch nicht über ein fehlerhaftes Ergebnis beschweren.

LPAnsiChar4 ist das Einzige, welches lokal zwar geht, aber global nicht, da das Zwischenergebnis der Stringverknüpfung ( + ) nach Beenden der Prozedur freigegeben wird.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#5

Re: D2010: Problem bei Typkonvertierung String => PAnsiCh

  Alt 20. Apr 2010, 10:03
Zitat von himitsu:
Bei LPAnsiChar1 bis LPAnsiChar3 und vielleicht noch LPAnsiChar5 sollte Delphi bezüglich der falschen Typkonvertierung (UnicodeString nach PAnsiChar) meckern.
Und wenn man dieses ignoriert, dann soll man sich auch nicht über ein fehlerhaftes Ergebnis beschweren.
Ich ignoriere nix, da kommt nirgends ne Meldung, keine Warnung, garnichts. an anderen Stellen habe ich Warnung bzgl implizierter Stringumwandlung, aber an diesen Stellen kommt definitiv nix. Du hast auch Delphi 2010 Professional, genau wie ich. Bekommst du Warnungen oder so?
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: D2010: Problem bei Typkonvertierung String => PAnsiCh

  Alt 20. Apr 2010, 10:16
Delphi-Quellcode:
{31} LString:='C:\MeinOrdner\MeinUnterOrdner\MeineDatei.Endung';
{32} LAnsiString:=LString;
{33} LPAnsiChar1:=PAnsiChar(LString);
{34} LPAnsiChar2:=PAnsiChar(ExtractFilePath(LString));
{35} LPAnsiChar3:=PAnsiChar(LString+' -Param1');
{36} LPAnsiChar4:=PAnsiChar(LAnsiString+' -Param1');
{37} LPAnsiChar5:=PAnsiChar(LAnsiString+' -Param1 '+LString);
{38} ShowMessage('LPAnsiChar1='+LPAnsiChar1);
{39} ShowMessage('LPAnsiChar2='+LPAnsiChar2);
{40} ShowMessage('LPAnsiChar3='+LPAnsiChar3);
{41} ShowMessage('LPAnsiChar4='+LPAnsiChar4);
{42} ShowMessage('LPAnsiChar5='+LPAnsiChar5);
Dann solltest du wohl besser mal dein Delphi überprüfen.
Zitat:
[DCC Warnung] Unit2.pas(32): W1058 Implizite String-Umwandlung mit potenziellem Datenverlust von 'string' zu 'AnsiString'
[DCC Warnung] Unit2.pas(33): W1044 Bedenkliche Typumwandlung von string in PAnsiChar
[DCC Warnung] Unit2.pas(34): W1044 Bedenkliche Typumwandlung von string in PAnsiChar
[DCC Warnung] Unit2.pas(35): W1044 Bedenkliche Typumwandlung von string in PAnsiChar
[DCC Warnung] Unit2.pas(37): W1057 Implizite String-Umwandlung von 'AnsiString' zu 'string'
[DCC Warnung] Unit2.pas(37): W1044 Bedenkliche Typumwandlung von string in PAnsiChar
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#7

Re: D2010: Problem bei Typkonvertierung String => PAnsiCh

  Alt 20. Apr 2010, 10:25
Na dann schau ich mal
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: D2010: Problem bei Typkonvertierung String => PAnsiCh

  Alt 20. Apr 2010, 16:42
Hatte grad einen ähnlichen Fall.

Bei mir hat das geholfen:LPAnsiChar1:=PAnsiChar(AnsiString(LString)); Macht ja irgendwie auch Sinn.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: D2010: Problem bei Typkonvertierung String => PAnsiCh

  Alt 20. Apr 2010, 17:00
Zitat von gmc616:
Bei mir hat das geholfen:LPAnsiChar1:=PAnsiChar(AnsiString(LString));
Theoretisch ja, denn hier wandelst du den UnicodeString in einen AnsiString und erzeugst davon einen Pointer.

Praktisch ist es aber unpraktisch, da man so keine richtige Kontrolle über die temporär erzeugte delphi-interne AnsiString-Variable hat.
Heißt, du hast keine wirkliche Kontrolle darüber, wann Delphi den AnsiString freigibt und wann somit der Pointer darauf ungültig wird.

Sicherer wäre also Folgendes, denn hier kannst du bestimmen wann MyTempStr freigegeben wird.
Delphi-Quellcode:
var MyTempStr: AnsiString;

MyTempStr := AnsiString(LString);
LPAnsiChar1 := PAnsiChar(MyTempStr);
Selbiges gilt für Alles, wo man keine Konrolle über das Ergebnis besitzt.
Delphi-Quellcode:
var MyTempStr: AnsiString;

MyTempStr := LString+' -Param1';
LPAnsiChar3 := PAnsiChar(MyTempStr);
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: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