AGB  ·  Datenschutz  ·  Impressum  







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

Get(anyPointer) Verständnisfrage

Ein Thema von Nintendo · begonnen am 29. Apr 2013 · letzter Beitrag vom 2. Mai 2013
Antwort Antwort
Seite 2 von 2     12   
Nintendo

Registriert seit: 16. Feb 2009
82 Beiträge
 
#1

AW: Get(anyPointer) Verständnisfrage

  Alt 29. Apr 2013, 21:01
Danke für Eure Mithilfe aber

bei mir klappt es noch nicht.


Delphi-Quellcode:
unit UPChar;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    Label2: TLabel;
    lbOut: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    FValue: String;
  public
    { Public-Deklarationen }
    procedure GetValue(p: PChar);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var pc: PChar;
begin
  FValue := Edit1.Text;
  GetValue(@pc);
  lbOut.Caption := StrPas(pc);
  //Freemem(pc, Length(FValue) + 8 + 1);
  //Hier ungültige Zeifer Operation
  //wer slso gibt am Ende den Speicher wieder frei???
end;

procedure TForm1.GetValue(p: PChar);
begin
  getmem(p, Length(FValue) + 8 + 1);
  p := PChar(FValue);
end;

end.
Ich erhalte immer noch Datenmüll als Rückgabe.

@Furtbichler:

Wenn ich eine eigene Implementation wählen kann, übergebe ich sowas als call by reference.

Wenn ich aber auf ein Interface zugreifen will/muss und der das Interface festgelegt hat hat eine Get Methode mit dem Übergabeparameter call by value definiert, dann habe ich leider keine Wahl, dann muss die Wertübergaben eben damit funktionieren.

Ich habe dem PChar Parameter jetzt Speicher zugewiesen und dann erst den Wert übergeben. Dennoch erhalte ich Datenmüll.

Ich hab mir mal interessehalber das OpenTools API angeschaut

Zum Beispiel hier:

Delphi-Quellcode:
  TIEditReader = class(TInterface)
  public
    function GetText(Position: Longint; Buffer: PChar; Count: Longint): Longint;
      virtual; stdcall; abstract;
  end;
wollte ich dieses Interface verwenden, hätte ich keine Wahl. Für mich selber würde ich natürlich var Buffer: PChar definieren. Aber bei einem vorgegebenen Interface???

Deshalb will ich auch hier die Parameterübergabe beherrschen. Get heißt für mich, Wert holen. Also muss das doch irgendwie gehen, sobald es sich bei dem Parameter um einen Zeiger handelt. Aber wie.

Gibt es vielleicht eine Compileroption, die sagt, in diesem Fall keinen Stack FRame anlegen?

Oder gibt es eine andere Lösung?

Wie also kann ich aus der Methode GetValue() den PChar Wert erhalten, analog zur oben aufgeführten Interfacefunktion, die über den Buffer ihren Wert übergibt, obwohl Buffer dort nicht als VAR Parameter definiert ist.

Speicher ist zugewiesen. Klappt auch dann bei mir noch nicht mit der Übergabe, wenn ich entweder sowohl innerhalb der Methode als auch in Button1Click Speicher zuweise und auch nicht, wenn ich das nur in Button1Click mache.

Wenn also Compileroption, welche? (Delphi 7 oder 2006)

Geändert von Nintendo (29. Apr 2013 um 21:11 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#2

AW: Get(anyPointer) Verständnisfrage

  Alt 29. Apr 2013, 21:12
Wieso? Der Pointer (Buffer) wird nicht verändert. Er enhält eine Adresse, an der mindestens 'Count' Bytes reserviert sind. So. Du übergibst die Adresse und hinterher steht an der Adresse etwas drin. Die Adresse selbst wird nicht verändert. Also wird diese auch als 'Call by Value' übergeben. Wenn Du das nicht machen würdest, hast Du etwas nicht richtig verstanden.
So, nun zu deinem Code: Der Aufrufer reserviert Speicher, der von der aufgerufenen Methode gefüllt wird.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var pc: PChar;
begin
   FValue := Edit1.Text;
   getmem(pc, Length(FValue) + 8 + 1); // DER AUFRUFER RESERVIERT DEN SPEICHER
   GetValue(pc);
   lbOut.Caption := StrPas(pc);
...
  FreeMem(pc, Length(FValue) + 8 + 1); // UND GIBT IHN WIEDER FREI ("Wer Müll macht, muss aufräumen")
end;

procedure TForm1.GetValue(p: PChar);
begin
   Move (@FValue[1],p, SizeOf(FValue[0]) * Length(FValue)); // Verschiebe Bytes (1 Zeichen könnte auch 2 Bytes lang sein(
end;
  Mit Zitat antworten Zitat
Nintendo

Registriert seit: 16. Feb 2009
82 Beiträge
 
#3

AW: Get(anyPointer) Verständnisfrage

  Alt 29. Apr 2013, 21:41
Danke! Muss mich aber erst mal mit Deiem Code beschäftigen.

.... Also wird diese auch als 'Call by Value' übergeben. Wenn Du das nicht machen würdest, hast Du etwas nicht richtig verstanden.
Ja, so sieht es wohl aus. Genau deshalb beschäftige ich mich auch mit der Problematik. Ich habe wirklich noch nicht verstanden, warum in diesem Fall Call by Value übergeben wird.

Ich will doch gerade den Inhalt dieses Puffers lesen, sowohl mit der Methode GetValue wie es auch die IDE mit der Interface Methode TIEditReader macht.

Wie ich Call by reference verstanden habe, wird doch dort der Wert an die Adresse übergeben, die mit dem VAR Parameter angegeben ist.

Ich kann momentan zur obigen Übergabemethode keinen grundsätzlichen Unterschied erkennen, und richtig, ich habe noch nicht verstanden, warum im von mir betrachteten Fall call by value übergeben wird. Sonst übergebe ich call by value doch nur, wenn ich Werte an die Methode zur internen Verwendung übergeben will. In meinem Fall aber will ich den Wert von der Methode haben.
  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 06:53 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 by Thomas Breitkreuz