![]() |
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:
aufrufen:
procedure swap(var p1,p2:Pointer);
var pdummy:Pointer; begin pdummy:=p1; p1:=p2; p2:=pdummy; end;
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 |
Re: Vertauschen von Pointern in einer Funktion
Das klappt nicht weil Integer kein Pointer ist.
Delphi-Quellcode:
Müste gehn.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; |
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? |
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. |
Re: Vertauschen von Pointern in einer Funktion
:( Schade. Also ist es nicht möglich für alle Typen die Pointer zu vertauschen?
|
Re: Vertauschen von Pointern in einer Funktion
für Pointer Typen bestimmt.
Delphi-Quellcode:
Müste in meinem Codebeispiel auch gehn. Weil Pint ja in Pointer ist.
Procedure swap(Var p1, p2: Pointer);
Var pdummy: Pointer; Begin pdummy := p1; p1 := p2; p2 := pdummy; End; Aber für Nicht Pointertypen kriegst du das bestimmt net hin. Zumindest weis ich net das es geht. |
Re: Vertauschen von Pointern in einer Funktion
schau doch mal in der Hilfe unter
Zeiger im Überblick |
Re: Vertauschen von Pointern in einer Funktion
Zitat:
Gruß Alexander |
Re: Vertauschen von Pointern in einer Funktion
Man könnte zuerst eine allgemeine Procedure schreiben:
Delphi-Quellcode:
Damit kann man dann schreiben:
procedure MemSwap(a,b : Pointer, Size:Integer);
Delphi-Quellcode:
So kann man für andere Datentypen (double, Boolean, ...) dann weitermachen.
procedure SwapInt(var a,b: integer);
begin MemSwap(@a, @b, sizeof(Integer)); end; Spätestens aber bei Strings, dynamischen Arrays und Objekten versagt dann diese Methode. |
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:38 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