Einzelnen Beitrag anzeigen

brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#15

Re: PChar to String & zurück - Zeichen geht verloren

  Alt 14. Okt 2007, 16:53
wtf? Entweder ich hab nen Denkfehler weil ich noch zu besoffen bin, hab das Prinzip von String/PChar in Delphi nicht verstanden oder ihr programmiert alle grauenhaft.

Strings werden von Delphi verwaltet, sind also auch gültig wenn man sie als Rückgabewert missbraucht.

PChar ist das selbe wie ein Pointer. Und wenn ihr das so programmiert dann ist dieser Pointer nicht mehr gültig da dieser auf eine Lokale Variable zeigt. Sowas macht man eben nicht.
Machs so wie MS mit ihren APIs: Sobald du PChars zurückbekommen willst, muss die aufrufende Funktion den Speicher allokieren und freigeben wenn sie den nicht mehr braucht.

z.B. GetModuleFileName

Meienr Meinung nach kann es auftreten, dass Delphi merkt, dass der lokale String nicht mehr benutzt wird und ihn überschreibt, bzw. dessen Speicher freigibt. Du arbeitest u.U. noch weiter mit diesem String (bzw. nur der Adresse) und es kann ggf crashen.

Oder schreibt ihr auch so geniale Funktionen wie:
Delphi-Quellcode:
function blub(a: integer): pinteger;
var s: integer;
begin
  s := a;
  result := @s;
end;
Wäre nett wenn mir mal jemand meine falsche denkweise erklärt.
Danke!

Edit:
Zitat von mkinzler:
Zitat von brechi:
Nein versuchs so nicht. Funktionen geben keine PChars zurück. Nimm nen String oder packs als Parameter rein und lass die Aufrufende Funktion den Speicher allokieren.
Funktionen in Dlls schon!
Was hat ein allgemeines Stack/Speicher/Addressproblem mit Dlls zu tun. Da wäre das genau so falsch (meiner Auffassung nach)


Edit2:
wer es testen will (Aufruf mit dem wort 'lol')

Rückabe: lol
Delphi-Quellcode:
var
  meinString: String;
function aufreg(meinParameter: PChar): PChar;
begin
   meinString := meinParameter;
   result := PChar(meinString);
end;
Rückgabe: lo
Delphi-Quellcode:
function aufreg(meinParameter: PChar): PChar;
var
  meinString: String;
begin
   meinString := meinParameter;
   result := PChar(meinString);
end;
  Mit Zitat antworten Zitat