AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

WideString -> TStream?

Ein Thema von blackdrake · begonnen am 19. Aug 2007 · letzter Beitrag vom 19. Aug 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: WideString -> TStream?

  Alt 19. Aug 2007, 19:42
Zitat:
Was ist jetzt eigentlich mit dem [1] und einem leeren String? Mein PC ist nicht in einer atomaren Explosion untergegangen, als ich die Editbox geleert und die Aktion ausgeführt habe.
Bei dir gibt es durch das ws+#0#0 sowieso keine Probleme, da dein String damit niemals leer ist. Ergo: Brauchst du den Kommentar nicht beachten.

Falls du aber mal einen string nicht konstant erweiterst, bevor du auf eine Element zugreifst:
Wenn du das mit einem ansistring versuchst, dann greift das Programm bei einem leeren string auf Adresse $0000000 zu und es gibt eine AV.
Bei WideString ist das (derzeit) aber wiederum völlig anders. Delphi macht aus dem Widestring einen PWideChar. Und wenn der widestring leer ist, dann gibt diese Funktion als Ergebnis einen gültigen Zeiger auf #00#00 im Datensegment zurück. Dadurch gibt es keine AV. Allerdings sollte man sich auf so etwas nicht verlassen (man weis ja nie was der Compiler morgen macht) und lieber vorher abfragen, ob ws ein Leerstring ist. Du kannst auch gleich statt "value[1]" PWideChar(Value) nehmen. Dann wärst du auf der sicheren Seite, wenn nicht dieses Problem dir dazwischen funkt.

PS: Ich frage mich grad, ob der Compiler bei WS+#0#0 2 Bytes oder 4 Bytes anhängt
Edit: Bei mir sind es vier.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#12

Re: WideString -> TStream?

  Alt 19. Aug 2007, 21:19
Zitat von sirius:
Wenn du das mit einem ansistring versuchst, dann greift das Programm bei einem leeren string auf Adresse $0000000 zu und es gibt eine AV.
Bei eingeschaltetem RangeCheck wird in beiden Fällen zuvor eine ERangeCheckException ausgelöst. Somit sollte man sich sowas überhaupt nicht angewöhnen, weil sonst läuft das Programm nur einwandfrei bei bestimmten Compilereinstellungen.
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#13

Re: WideString -> TStream?

  Alt 19. Aug 2007, 21:41
Hallo.

@Mutze1: Wie sollte man den Code anders schreiben, damit er mit allen Compilereinstellungen funktioniert und sauber ist?

Kann mir jemand erklären, wieso eigentlich bei der Auslagerung der Write()-Funktion ein ANSI String anstelle eines WideStrings geschrieben wird? Ist eigentlich ein komisches Phänomen.

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#14

Re: WideString -> TStream?

  Alt 19. Aug 2007, 21:53
Zitat von sirius:
Du kannst auch gleich statt "value[1]" PWideChar(Value) nehmen.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#15

Re: WideString -> TStream?

  Alt 19. Aug 2007, 22:02
Danke, hatte ich übersehen. Leider funktioniert es dann nicht mehr.

Folgender Code:

Delphi-Quellcode:
public
  x: tfilestream;

procedure TForm1.write(const buffer;size:integer);
begin
  x.Writebuffer(buffer,size);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ws: widestring;
  pwc: pwidechar;
begin
  ws:=edit1.text;
  x:=tfilestream.Create('c:\test.txt',fmcreate);
  pwc := PWideChar(ws);
  Write(pwc, sizeof(wideChar)*(length(ws)+1));
  x.free;
end;
Erzeug nicht E[NULL]d[NULL]i[NULL]t[NULL]1[NULL][NULL], sondern "dd\".

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#16

Re: WideString -> TStream?

  Alt 19. Aug 2007, 22:07
Write(pwc^, sizeof(wideChar)*(length(ws)+1)); Beachte das ^...
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#17

Re: WideString -> TStream?

  Alt 19. Aug 2007, 22:08
Vielen Dank
Daniel Marschall
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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