AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Vertauschen von Pointern in einer Funktion
Thema durchsuchen
Ansicht
Themen-Optionen

Vertauschen von Pointern in einer Funktion

Ein Thema von Alexander Roth · begonnen am 9. Mär 2007 · letzter Beitrag vom 9. Mär 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Alexander Roth
Alexander Roth

Registriert seit: 17. Mai 2004
Ort: Kenn
574 Beiträge
 
Turbo Delphi für Win32
 
#1

Vertauschen von Pointern in einer Funktion

  Alt 9. Mär 2007, 16:35
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
Alexander Roth
Ich bin umgestiegen auf: Lazarus und Ubuntu! Alles OpenSource!

Besuch doch mal: www.roth.us.ms
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Vertauschen von Pointern in einer Funktion

  Alt 9. Mär 2007, 16:42
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.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von Alexander Roth
Alexander Roth

Registriert seit: 17. Mai 2004
Ort: Kenn
574 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Vertauschen von Pointern in einer Funktion

  Alt 9. Mär 2007, 16:49
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?
Alexander Roth
Ich bin umgestiegen auf: Lazarus und Ubuntu! Alles OpenSource!

Besuch doch mal: www.roth.us.ms
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Vertauschen von Pointern in einer Funktion

  Alt 9. Mär 2007, 16:52
@int gibt dir die Addresse an der die Variable im Stack oder Heap gespeichert ist.

Die kannst du aber keinesfalls als Var Parameter übergeben.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von Alexander Roth
Alexander Roth

Registriert seit: 17. Mai 2004
Ort: Kenn
574 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Vertauschen von Pointern in einer Funktion

  Alt 9. Mär 2007, 16:57
Schade. Also ist es nicht möglich für alle Typen die Pointer zu vertauschen?
Alexander Roth
Ich bin umgestiegen auf: Lazarus und Ubuntu! Alles OpenSource!

Besuch doch mal: www.roth.us.ms
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Vertauschen von Pointern in einer Funktion

  Alt 9. Mär 2007, 17:11
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.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Texas

Registriert seit: 15. Jul 2005
Ort: Laatzen
59 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#7

Re: Vertauschen von Pointern in einer Funktion

  Alt 9. Mär 2007, 17:52
schau doch mal in der Hilfe unter

Zeiger im Überblick
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Alexander Roth
Alexander Roth

Registriert seit: 17. Mai 2004
Ort: Kenn
574 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Vertauschen von Pointern in einer Funktion

  Alt 9. Mär 2007, 17:59
Zitat von Texas:
schau doch mal in der Hilfe unter

Zeiger im Überblick
In Bezug worauf?

Gruß Alexander
Alexander Roth
Ich bin umgestiegen auf: Lazarus und Ubuntu! Alles OpenSource!

Besuch doch mal: www.roth.us.ms
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

Re: Vertauschen von Pointern in einer Funktion

  Alt 9. Mär 2007, 18:02
Man könnte zuerst eine allgemeine Procedure schreiben:
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Vertauschen von Pointern in einer Funktion

  Alt 9. Mär 2007, 18:09
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;
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 01:07 Uhr.
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