Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   W 1057 Implizite String-Umwandlung Ansistring zu string (https://www.delphipraxis.net/159538-w-1057-implizite-string-umwandlung-ansistring-zu-string.html)

hanspeter 1. Apr 2011 08:42

Delphi-Version: XE

W 1057 Implizite String-Umwandlung Ansistring zu string
 
Hallo,

ich stelle gerade ein Projekt von D5 auf XE um.
Im rs232 Bereich muss ich hier mit Ansi-Strings arbeiten.

Delphi-Quellcode:
s : Ansistring;
s := '12';
d := HexToByte(s);
Hextobyte braucht einen Stringparameter, also kommt die o.g. Warnung.
Da es an dieser Stelle ungefährlich ist (?) kann ich statt Hextobyte(string(s)) auch die Warnung abschalten oder habe ich dann einen Nebeneffekt?
Und wo zum Teufel finde ich in der Hilfe eine Zusammenstellung der Compilerschalter um diese Warnung abzuschalten?

Gruß Peter

ChrisE 1. Apr 2011 09:02

AW: W 1057 Implizite String-Umwandlung Ansistring zu string
 
Hallo Peter,

ich kenne die Funktion
Delphi-Quellcode:
HexToByte
nicht. Gibt es hierfür vielleicht eine alternative? Wie ist
Delphi-Quellcode:
d
deklariert?

Delphi-Quellcode:
{$WARNINGS OFF} 
//hier kommt keine Warnung mehr
{$WARNINGS ON}
Gruß, Chris

GPRSNerd 1. Apr 2011 09:36

AW: W 1057 Implizite String-Umwandlung Ansistring zu string
 
Versuch es mal mit einem expliziten Typecast auf String:

Delphi-Quellcode:
d := HexToByte(string(s));

himitsu 1. Apr 2011 09:53

AW: W 1057 Implizite String-Umwandlung Ansistring zu string
 
Entweder du nutzt ein HexToByte, welches AnsiStrings als Parameter nutzt,
du castest es manuell
Delphi-Quellcode:
d := AnsiString(HexToByte(String(s)));
(genaueres können wir nicht sagen, da uns die Definition von HexToByte vorenthalten wurde)
oder eben einfach ignorieren.

In diesem Fall wird ja so oder zo umgewandelt,
entweder automatisch durch Delphi (wobei dieses eine Warnung ausgibt)
oder man castes es manuell, ohne eine Warnung zu erhalten.

Solange nur ASCII-Zeichen (#0..#127) im String sind, gibt es absolut keine Probleme, bei ANSI (#0..#255) sollte es hier auch nahezu problemlos laufen, da es ja nach Unicode und gleich wieder zurück umgewandelt wird.

hanspeter 1. Apr 2011 10:48

AW: W 1057 Implizite String-Umwandlung Ansistring zu string
 
Habt Ihr meine Frage eigentlich bis zum Ende gelesen?
Wie ein Typecast funktioniert habe ich bereits beschrieben. Und für Hextobyte kann man eine beliebige andere Funktion mit einem String-Parameter verwenden.

Meine Frage ist ob ein Typecast string(s) an vielen Stellen im Programm erfolgen sollte oder ob ein explizites Ausschalten dieser Warnung ausreichend ist, da ein impliziter Typecast an dieser Stelle keine Nebenwirkung haben sollte.
$Warn on/of ist nicht die Lösung. Ich suche in der Hilfe den Schalter um nur die Warnung W1057 ausschalten zu können.

Gruß Peter

GPRSNerd 1. Apr 2011 10:57

AW: W 1057 Implizite String-Umwandlung Ansistring zu string
 
Da du trotz Nachfrage die Deklaration von d und HexToByte nicht offenlegst, ist alles nur hellsehen wegen der Nebeneffekte...

In den Projektoptionen gibts mehrere Schalter "Implizite/Explizite String-Umwandlung (mit potentiellen Datenverlusten)" unter den Compilereinstellungen für Warnungen wegen der Stringcasts.

ChrisE 1. Apr 2011 11:01

AW: W 1057 Implizite String-Umwandlung Ansistring zu string
 
Hallo Peter,
Zitat:

Zitat von hanspeter (Beitrag 1092386)
Habt Ihr meine Frage eigentlich bis zum Ende gelesen?

Ich habe mich bemüht :-)
Zitat:

Zitat von hanspeter (Beitrag 1092362)
Hextobyte braucht einen Stringparameter, also kommt die o.g. Warnung.

Ziel von mir war es zu erfahren, ob man statt der Funktion eine andere verwenden kann, die ANSISTRINGS akzeptiert
damit:
Zitat:

Zitat von hanspeter (Beitrag 1092362)
Da es an dieser Stelle ungefährlich ist (?) kann ich statt Hextobyte(string(s)) auch die Warnung abschalten oder habe ich dann einen Nebeneffekt?

Durch suche einer Ansi-Funktion, die es ermöglicht Dein Ziel zu erreichen, ergeben sich alle Deine Fragen als gegenstandslos. Ich dachte, dass dies Dein Problem löst.
Zitat:

Zitat von hanspeter (Beitrag 1092386)
Meine Frage ist ob ein Typecast string(s) an vielen Stellen im Programm erfolgen sollte oder ob ein explizites Ausschalten dieser Warnung ausreichend ist, da ein impliziter Typecast an dieser Stelle keine Nebenwirkung haben sollte

Das ist in meinen Augen eine andere Frage, dazu kann ich leider nicht viel sagen außer, dass ich versuchen würde immer Funktionen zu verwenden, bei dehnen das nicht nötig ist - also die ANSI-Varianten - solange du dich im ANSI-Bereich bewegst. Gibt es die Varianten nicht, würde ich selber versuchen es ab zu schätzten ob der Typecast gefährlich ist. Dass kannst aber nur Du entscheiden, da nur du die Interna Deines Programms kennst.

Gruß, Chris

hanspeter 1. Apr 2011 12:12

AW: W 1057 Implizite String-Umwandlung Ansistring zu string
 
Vielen Dank für die tatkräftige und konstruktive Unterstützung.
Ich bin zwischenzeitlich fündig geworden.
Was ich gesucht habe ist die Compilerdirective

{$WARN EXPLICIT_STRING_CAST OFF}

Was in XE noch funktioniert strg + O + O , dann werden die eingestellten Direktiven in den Quellcode
übernommen und man kommt so an undokumentierte Schalter ran.

Und nein bei deinem impliziten Typcast von Ansistring auf string kommt es nicht zu Problemen, da Unicode und
Ascii Code in den ersten 128 oder 255 Byte gleich ist.

Peter

himitsu 1. Apr 2011 12:24

AW: W 1057 Implizite String-Umwandlung Ansistring zu string
 
Zitat:

da Unicode und Ascii Code in den ersten 128 oder 255 Byte gleich ist.
ersten 128 Zeichen (#0..#127)
die letzen 128 Zeichen (#128..#255) werden je nach ensprechender Codepage umkodiert.

ChrisE 4. Apr 2011 07:12

AW: W 1057 Implizite String-Umwandlung Ansistring zu string
 
OT:
Zitat:

Zitat von hanspeter (Beitrag 1092400)
Was in XE noch funktioniert strg + O + O , dann werden die eingestellten Direktiven in den Quellcode
übernommen und man kommt so an undokumentierte Schalter ran.

:shock:

Man, dass kannte ich noch gar nicht. THX - wieder was dazu gelernt :-)

Gruß, Chris

himitsu 4. Apr 2011 07:34

AW: W 1057 Implizite String-Umwandlung Ansistring zu string
 
Schlimm ist, es gibt noch andere Strg+O+...-Kombinationen.
Wer läßt ich sowas denn einfallen? :wall:

ChrisE 4. Apr 2011 07:42

AW: W 1057 Implizite String-Umwandlung Ansistring zu string
 
Zitat:

Zitat von himitsu (Beitrag 1092851)
Schlimm ist, es gibt noch andere Strg+O+...-Kombinationen.

Gibt es irgendwo eine Referenz/Verzeichnis von solchen Tastenkombinationen?

Gruß, Chris

himitsu 4. Apr 2011 08:01

AW: W 1057 Implizite String-Umwandlung Ansistring zu string
 
eine Vollständige hatte ich noch nicht gesehn, genauso wie es nirgendwo eine
vollständige Liste aller Compilerschalter gibt.

Bei Google suchendelphi ide shortcuts

xnLucas 15. Mai 2011 11:37

AW: W 1057 Implizite String-Umwandlung Ansistring zu string
 
Umwandlung - Ansistring in String;
Zitat:


function asString(value: Ansistring): String;
var
i,l: integer;
begin
l:=length(value);
setlength(result,l);
for i := 1 to l do result[i]:=char(value[i]);
end;

Die Funktion funktioniert tadellos und ist genau das Gegenstück zu der
Function ansistring(value: string): ansistring;

Performancemässig bin ich mit dieder Function nicht zufrieden.
Kann mir die evtl. einer in assembler umschreiben?

zu Info die
function string(value: ansistring): String
liefert nicht das gleiche Ergebnis

himitsu 15. Mai 2011 12:04

AW: W 1057 Implizite String-Umwandlung Ansistring zu string
 
Delphi-Quellcode:
// explizite Umwandlung
function asString(value: AnsiString): String;
begin
  Result := String(value);
end;

// implizite Umwandlung
function asString(value: AnsiString): String;
begin
  Result := value;
end;
Und
Delphi-Quellcode:
string
isr keine Funktion, sondern ein Type-Cast (Typumwandlung).
Und natürlich liefert sie nicht unbedingt das gleiche Ergebnis, da sie die Codierung des AnsiString berücksichtig.

MSDN-Library durchsuchenMultiByteToWideChar und zu noch die gewünschte CodePage.
PS: Die obrigen Type-Casts nutzen dieses auch, nur eben mit CP_ACP als Codepage.

xnLucas 15. Mai 2011 13:16

AW: W 1057 Implizite String-Umwandlung Ansistring zu string
 
Hallo himitsu,

vielen Dank für den Hinweis, ich hab es es jetzt folgendermaßen gelöst.:-D

Code:
function asString(value: Ansistring): String;
var
    len : integer;
begin
    len:=length(value);
    SetLength(Result, len );
    if len > 0
     then MultiByteToWideChar(Cp_ACP, MB_PRECOMPOSED,
      PansiChar(@value[1]), len , PWideChar(@Result[1]), len);
end;

himitsu 15. Mai 2011 14:39

AW: W 1057 Implizite String-Umwandlung Ansistring zu string
 
man kann's auch noch etwas kürzen
Delphi-Quellcode:
PAnsiChar(value), len , PWideChar(Result), len);


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 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