Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sowas wie "PChar" nur sollte es "nil" geben wenn & (https://www.delphipraxis.net/47803-sowas-wie-pchar-nur-sollte-es-nil-geben-wenn.html)

Pseudemys Nelsoni 16. Jun 2005 13:44


Sowas wie "PChar" nur sollte es "nil" ge
 
Moin,

Titel klingt ein wenig doof, aber da die Zeichen begrenzt sind musste ich das halt so machen *g*

Also es geht darum, das ich mich frage, ob es eine ähnliche Funktion wie "PChar"(Ich weiss das es keine Funktion ist...) bereits gibt, die "Nil" zurückgibt wenn man einen leeren String übergibt?

Es ist so, das ich einer Funktion (aus einer DLL) Zeichenketten immer als PChar übergeben muss und leere Zeichenketten müssen als nil übergeben werden.

Nur ist das Ergebnis von PChar(S) ja nicht nil, selbst wenn S leer ist. Das verursacht in meinem Programm einen Fehler.

Nun habe ich folgendes versucht:

Delphi-Quellcode:
function NilPChar(const S: string): PChar;
begin
  if S = '' then Result := nil
  else Result := PChar(S);
end;
Das funktioniert auch.

Meine Frage zu dem ganzen: Gibt es so eine Funktion vielleicht schon oder war das richtig sie extra zu schreiben?

Vjay 16. Jun 2005 13:49

Re: Sowas wie "PChar" nur sollte es "nil"
 
War richtig sie zu schreiben, den Grund hast du ja auch gleich mit angeführt.

Pseudemys Nelsoni 16. Jun 2005 13:52

Re: Sowas wie "PChar" nur sollte es "nil"
 
Danke für deine Antwort. :???:

Luckie 16. Jun 2005 14:40

Re: Sowas wie "PChar" nur sollte es "nil"
 
Probier mal:
Delphi-Quellcode:
Pointer(s);
Oder
Delphi-Quellcode:
@s[1];
Zu mindest ersteres sollte nil zurückgeben, wenn ich es richtig in Erinnerung habe.

Vjay 16. Jun 2005 14:49

Re: Sowas wie "PChar" nur sollte es "nil"
 
@ Lucki

Pointer(s), was nutzt ihm das wenn der String Daten enthält kommt er darüber nicht ran, da der Pointer auf das erste Zeichen zeigen müsste und nicht auf die Längenangabe.

@s[1], funktioniert. Und ich bin wirklich erstaunt muss ich zugeben, aber man lernt ja nie aus :)

Luckie 16. Jun 2005 14:54

Re: Sowas wie "PChar" nur sollte es "nil"
 
Kann auch
Delphi-Quellcode:
Pointer(s[1]);
heißen, ich habe es schon länger nicht mehr benutzt.

Pseudemys Nelsoni 16. Jun 2005 15:37

Re: Sowas wie "PChar" nur sollte es "nil"
 
Besten Dank, das geht :thumb:

Gibt es denn keinen Fehler wenn ich auf @s[1] zugreife und da gar kein speicher reserviert ist?

Luckie 16. Jun 2005 16:09

Re: Sowas wie "PChar" nur sollte es "nil"
 
s ist doch ein String. Da übernimmt doch Delphi alles für dich.

Pseudemys Nelsoni 16. Jun 2005 16:18

Re: Sowas wie "PChar" nur sollte es "nil"
 
Moin Luckie,

das ist richtig, S ist ein string, aber wenn er leer ist, kann ich doch normal nicht auf @s[1] zugreifen oder?

leddl 16. Jun 2005 16:20

Re: Sowas wie "PChar" nur sollte es "nil"
 
Deswegen setzt du ja den Pointer auf das erste Zeichen. Ist der String leer, gibt es kein Zeichen, also bekommst du nil zurückgeliefert.

jbg 16. Jun 2005 18:04

Re: Sowas wie "PChar" nur sollte es "nil"
 
Zitat:

Zitat von Luckie
Probier mal:
Delphi-Quellcode:
Pointer(s);
Zu mindest ersteres sollte nil zurückgeben, wenn ich es richtig in Erinnerung habe.

Das tut es auch.

PChar(S) ruft eine System-Funktion auf, die folgendes macht:

Delphi-Quellcode:
function StrToPChar(const S: string): PChar;
const
  EmptyPChar: PChar = #0;
begin
  Result := Pointer(S);
  if Result = nil then
    Result := EmptyPChar;
end;
Wie man sieht, wird hier Pointer(S) benutzt, was entweder einen Zeiger auf das erste Zeichen oder bei einem Leerstring den Wert nil zurückliefert.


Zitat:

Oder
Delphi-Quellcode:
@s[1];

Da passiert etwas mehr. Zum einen wird vorerst mal die Prozedur UniqueString aufgerufen, die ggf. den gesamten String kopiert, wenn der Referenzzähler = -1 (Konstante) oder > 1 (mehrere String referenzieren auf die Daten) ist.

Zudem dürfte es bei eingeschalteter Breichsüberprüfung bei einem Leerstring krachen.


Zitat:

Delphi-Quellcode:
Pointer(s[1])

Das ist nun vollkommen falsch. Damit bekommt man einen Zeiger der Form $000000xx, weil man das erste Zeichen des String (=Char) in einen Zeiger typecastet.

Luckie 16. Jun 2005 20:14

Re: Sowas wie "PChar" nur sollte es "nil"
 
Also hatte ich doch recht beim ersten mal. :roll:

Vjay 17. Jun 2005 09:28

Re: Sowas wie "PChar" nur sollte es "nil"
 
Zitat:

Zitat von Luckie
Also hatte ich doch recht beim ersten mal. :roll:

Tschuldigung, ich frag mich gerade was ich da gestern getestet habe.... Glaube es lag daran, dass der automatische Typecast in String nicht funktioniert hatte.

Delphi-Quellcode:
showMessage( strPas( pointer( s1 )));
Funktioniert jedenfalls.


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