Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Arbeiten mit PChar (https://www.delphipraxis.net/41239-arbeiten-mit-pchar.html)

Gambit 28. Feb 2005 13:25


Arbeiten mit PChar
 
Hallo,

ich habe hier eine Funktion die als Parameter den Typ PChar erwartet:

Delphi-Quellcode:
function Translate(Src, Dest: PChar; ToOem: Boolean): Integer; virtual;
Angenommen ich habe jetzt einen String den ich nach "Dest" umwandeln will dann funzt nicht:

Delphi-Quellcode:
procedure test;
var srcString, DestString: PChar;
begin
  srcString:= ...;
  Translate(PChar(srcString), DestString, false);
end;
Bekomm ich eine Speicherzugriffsverletzung...

wie müsste es denn richtig heißen?

Gruß

Gambit

Luckie 28. Feb 2005 13:29

Re: Arbeiten mit PChar
 
Du musst für deinen DestString natürlich auch erst noch Speicher mit GetMem reservieren.

Binärbaum 28. Feb 2005 13:31

Re: Arbeiten mit PChar
 
Zitat:

Zitat von Gambit
..
Delphi-Quellcode:
function Translate(Src, Dest: PChar; ToOem: Boolean): Integer; virtual;
Angenommen ich habe jetzt einen String den ich nach "Dest" umwandeln will dann funzt nicht:

Delphi-Quellcode:
procedure test;
var srcString, DestString: PChar;
begin
  srcString:= ...;
  Translate(PChar(srcString), DestString, false);
end;
...
wie müsste es denn richtig heißen?

Du müsstest die Zeile mit Translate(...); folgendermaßen ändern:
Delphi-Quellcode:
Translate(srcString, DestString, false);
Da SrcString schon vom Typ PChar ist, muss er nicht mehr nach PChar gecastet werden.

MfG
Binärbaum

Binärbaum 28. Feb 2005 13:32

Re: Arbeiten mit PChar
 
Zitat:

Zitat von Luckie
Du musst für deinen DestString natürlich auch erst noch Speicher mit GetMem reservieren.

Ging das nicht auch mit StrAlloc(...)? :gruebel:

Gambit 28. Feb 2005 13:41

Re: Arbeiten mit PChar
 
Zitat:

Zitat von Binärbaum
Da SrcString schon vom Typ PChar ist, muss er nicht mehr nach PChar gecastet werden.

MfG
Binärbaum

Achne, das ist nat. mein Fehler, srcString soll vom Typ String sein. Es liegt wohl an der von Lucky geschilderten Tatsache, dass ich Speicher reservieren muss. Weiß jetzt nur nicht genau wie...

Oxmyx 28. Feb 2005 13:46

Re: Arbeiten mit PChar
 
Zitat:

Zitat von Gambit
Achne, das ist nat. mein Fehler, srcString soll vom Typ String sein. Es liegt wohl an der von Lucky geschilderten Tatsache, dass ich Speicher reservieren muss. Weiß jetzt nur nicht genau wie...

Wenn du ein Stringliteral schon während der Kompilierzeit zuweist, reserviert der Compiler automatisch Speicher dafür. Zum Beispiel:

Delphi-Quellcode:
var
  str: PChar;
begin
  str := 'Beispieltext';
end;
In deinem Fall ist das aber anders, da zur Kompilierzeit noch nichts zugewiesen wird. Daher musst du erst genug Speicher reservieren, in dem dann dein String Platz findet. Also etwa so:

Delphi-Quellcode:
var
  SrcStr, DestStr: PChar;
begin
  SrcStr := 'Beispieltext';
  GetMem(DestStr, Length(SrcStr));
  Translate(SrcStr, DestStr, False);
 
  // ...und am Ende nicht vergessen:
  FreeMem(DestStr);
end;

Gambit 28. Feb 2005 13:54

Re: Arbeiten mit PChar
 
jau Danke, jetzt hab' ichs begriffen. Funktion bringt bringt nur leider nicht das gewünschte Ergenbnis(der String sieht immer noch genauso aus)... :(

Binärbaum 28. Feb 2005 14:15

Re: Arbeiten mit PChar
 
Zitat:

Zitat von Oxmyx
Delphi-Quellcode:
var
  SrcStr, DestStr: PChar;
begin
  SrcStr := 'Beispieltext';
  GetMem(DestStr, Length(SrcStr));
  Translate(SrcStr, DestStr, False);
 
  // ...und am Ende nicht vergessen:
  FreeMem(DestStr);
end;

Man sollte den Speicher reservieren, bevor man etwas in den PChar schreibt.

Muetze1 28. Feb 2005 15:09

Re: Arbeiten mit PChar
 
Moin!

Zitat:

Zitat von Binärbaum
Man sollte den Speicher reservieren, bevor man etwas in den PChar schreibt.

Ja, und? Wo ist das Problem? Macht das irgendwer hier anders?

MfG
Muetze1

Khabarakh 28. Feb 2005 15:10

Re: Arbeiten mit PChar
 
Will Gambit es nicht einfach so :gruebel: ?
Delphi-Quellcode:
procedure test;
var srcString, DestString: string;
begin
  srcString:='a';
  DestString:='bb';
  Translate(PChar(srcString), PChar(DestString), false);
end;

Muetze1 28. Feb 2005 15:39

Re: Arbeiten mit PChar
 
Moin!

Die Funktion kann im Worst-Case Fall doppelt so lange Zeichenketten zurück geben, also:

Delphi-Quellcode:
procedure test(Const ASrcString: String);
var DestString: string;
begin
  SetLength(DestString, 2*Length(ASrcString));
  Translate(PChar(ASrcString), PChar(DestString), false);
  // Hier noch mit SetLength() den DestString auf die zurück gegebene Anzahl von zeichen kürzen...
end;
MfG
Muetze1

Pseudemys Nelsoni 28. Feb 2005 16:05

Re: Arbeiten mit PChar
 
was genau ist ein "Worst-Case Fall" ? ich meine wieso koennen doppelt soviele zeichen zurückgegeben werden ?

Gambit 28. Feb 2005 16:16

Re: Arbeiten mit PChar
 
Zitat:

Zitat von Khabarakh
Will Gambit es nicht einfach so :gruebel: ?
Delphi-Quellcode:
procedure test;
var srcString, DestString: string;
begin
  srcString:='a';
  DestString:='bb';
  Translate(PChar(srcString), PChar(DestString), false);
end;

Nene, so wollte ich es nicht, würde auch nicht funzen...

Ich würde viel jetzt viel lieber wissen, warum die Funktion nicht das tut was sie soll...

Luckie 28. Feb 2005 17:59

Re: Arbeiten mit PChar
 
Zitat:

Zitat von Gambit
Ich würde viel jetzt viel lieber wissen, warum die Funktion nicht das tut was sie soll...

Tja gute Frage. Aber ohne die Implementierung zu kennen, wird dir das wohl auch niemand sagen können. Aber: neue Frage, neuer Thread.

Oxmyx 28. Feb 2005 18:07

Re: Arbeiten mit PChar
 
Zitat:

Zitat von Binärbaum
Man sollte den Speicher reservieren, bevor man etwas in den PChar schreibt.

Nicht, wenn man ein Stringliteral schon zur Kompilierzeit zuweise. Dann nicht. In allen anderen Fällen schon.

Gambit 28. Feb 2005 18:28

Re: Arbeiten mit PChar
 
jepp und wenn ich anstelle von translate

Delphi-Quellcode:
OemToCharBuff(Pointer(S), Pointer(S), Length(S));
benutze, wo ich's mit der Speicherreservierung genauso handhaben muss, funzt es auch. Warum TDataSet.translate nicht funzt obwohl es genau das machen soll was OemToCharBuff macht, weiß ich auch nicht...


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