Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Vertauschen von Pointern in einer Funktion (https://www.delphipraxis.net/88069-vertauschen-von-pointern-einer-funktion.html)

Alexander Roth 9. Mär 2007 15:35


Vertauschen von Pointern in einer Funktion
 
Hi,

also, ich habe schon im Forum gesucht und auch gute Lösungen zum Vertauschen von Variablen gefunden.

Doch es wäre ideal wenn man nur die Pointer auf die Speicherbereiche verschiebt. So könnte man unabhängig von der Größe der eigentlichen Variable, die Pointer vertauschen. Notfalls mit einem Hilfspointer.

Und das ab besten in einer Funktion kapseln.

Kurzum ich will ungefähr so was, doch leider funktioniert das nicht:

Delphi-Quellcode:
procedure swap(var p1,p2:Pointer);
var pdummy:Pointer;
begin
  pdummy:=p1;
  p1:=p2;
  p2:=pdummy;
end;
aufrufen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i1,i2:integer;
begin
  i1:=1;
  i2:=2;
  swap(@i1,@i2);
  showmessage('i1= '+inttostr(i1)+#13+'i2= '+inttostr(i2));
end;

Wie kann man so was realisieren?

Gruß Alexander

Corpsman 9. Mär 2007 15:42

Re: Vertauschen von Pointern in einer Funktion
 
Das klappt nicht weil Integer kein Pointer ist.

Delphi-Quellcode:

type Pint = ^integer;

Procedure swap(Var p1, p2: Pint);
Var
  pdummy: Pointer;
Begin
  pdummy := p1;
  p1 := p2;
  p2 := pdummy;
End;

Procedure TForm1.Button1Click(Sender: TObject);
Var
  i1, i2: Pint;
Begin
  new(i1);
  new(i2);
  i1^ := 1;
  i2^ := 2;
  swap(i1, i2);
  showmessage('i1= ' + inttostr(i1^) + #13 + 'i2= ' + inttostr(i2^));
  dispose(i1);
  dispose(i2);
End;
Müste gehn.

Alexander Roth 9. Mär 2007 15:49

Re: Vertauschen von Pointern in einer Funktion
 
Klappt.

Aber Ich will ja ganz normale Variablen (Integer, String, etc..) vertauschen.
Da zeigt doch auch ein Pointer nähmlich @int auf int. Oder sehe ich das falsch?

Corpsman 9. Mär 2007 15:52

Re: Vertauschen von Pointern in einer Funktion
 
@int gibt dir die Addresse an der die Variable im Stack oder Heap gespeichert ist.

Die kannst du aber keinesfalls als Var Parameter übergeben.

Alexander Roth 9. Mär 2007 15:57

Re: Vertauschen von Pointern in einer Funktion
 
:( Schade. Also ist es nicht möglich für alle Typen die Pointer zu vertauschen?

Corpsman 9. Mär 2007 16:11

Re: Vertauschen von Pointern in einer Funktion
 
für Pointer Typen bestimmt.

Delphi-Quellcode:
Procedure swap(Var p1, p2: Pointer);
Var
  pdummy: Pointer;
Begin
  pdummy := p1;
  p1 := p2;
  p2 := pdummy;
End;
Müste in meinem Codebeispiel auch gehn. Weil Pint ja in Pointer ist.

Aber für Nicht Pointertypen kriegst du das bestimmt net hin. Zumindest weis ich net das es geht.

Texas 9. Mär 2007 16:52

Re: Vertauschen von Pointern in einer Funktion
 
schau doch mal in der Hilfe unter

Zeiger im Überblick

Alexander Roth 9. Mär 2007 16:59

Re: Vertauschen von Pointern in einer Funktion
 
Zitat:

Zitat von Texas
schau doch mal in der Hilfe unter

Zeiger im Überblick

In Bezug worauf?

Gruß Alexander

shmia 9. Mär 2007 17:02

Re: Vertauschen von Pointern in einer Funktion
 
Man könnte zuerst eine allgemeine Procedure schreiben:
Delphi-Quellcode:
procedure MemSwap(a,b : Pointer, Size:Integer);
Damit kann man dann schreiben:
Delphi-Quellcode:
procedure SwapInt(var a,b: integer);
begin
   MemSwap(@a, @b, sizeof(Integer));
end;
So kann man für andere Datentypen (double, Boolean, ...) dann weitermachen.
Spätestens aber bei Strings, dynamischen Arrays und Objekten versagt dann diese Methode.

3_of_8 9. Mär 2007 17:09

Re: Vertauschen von Pointern in einer Funktion
 
Wieso? Strings, dyn. Arrays, Objekte kann man ganz einfach vertauschen, genauso wie einen Integer.

Ich würds übrigens so machen:

Delphi-Quellcode:
procedure SwapMemory(var a, b; size: Cardinal=0);
var I, max: Cardinal;
begin
  if size=0 then size:=sizeof(a);
  I:=0;
  max:=(ALength div 4)*4-1;
  while I<=max do
  begin
    PCardinal(Cardinal(ADst)+I)^:=PCardinal(Cardinal(ASrc)+I)^;
    inc(I, 4);
  end;
  case ALength+4-I of
    1: PByte(Cardinal(ADst)+I)^:=PByte(Cardinal(ASrc)+I)^;
    2: PWord(Cardinal(ADst)+I)^:=PWord(Cardinal(ASrc)+I)^;
    3:
      begin
        PWord(Cardinal(ADst)+I)^:=PWord(Cardinal(ASrc)+I)^;
        PByte(Cardinal(ADst)+I+2)^:=PByte(Cardinal(ASrc)+I+2)^
      end;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:58 Uhr.
Seite 1 von 2  1 2      

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