全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:984
推到 Plurk!
推到 Facebook!

請問一個指標的問題

答題得分者是:jest0024
aip999
初階會員


發表:10
回覆:63
積分:44
註冊:2002-03-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-02 13:51:58 IP:218.162.xxx.xxx 未訂閱
type
  pObj = ^TObj;
  TObj = record
     Next : PObj;
     ID : DWORD;
     Name : array[0..12] of char;
     ...
  end;
var
   pObjList : pObj;    //想要將pObjList中的兩個pObj交換 
//是可以只把資料交換
//不過不是可以把pObj所指的記憶體位址跟pObj.Next所指的記憶體位址交換就可以了?
//寫法不會寫@@"
procedure Swap_pObj(var aObj1,aObj2:pObj);
var
   T :pObj;
begin
//
//請問一下,底下這邊應該要怎麼寫才對?
//試了很多寫法 都不正確@@"
   T:=aObj1;
   aObj1:=aObj2;   
   aObj2:=T;
   
end;
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-02 16:23:19 IP:211.74.xxx.xxx 未訂閱
引言:
type
  pObj = ^TObj;
  TObj = record
     Next : PObj;
     ID : DWORD;
     Name : array[0..12] of char;
     ...
  end;
var
   pObjList : pObj;    //想要將pObjList中的兩個pObj交換 
//是可以只把資料交換
//不過不是可以把pObj所指的記憶體位址跟pObj.Next所指的記憶體位址交換就可以了?
//寫法不會寫@@"
procedure Swap_pObj(var aObj1,aObj2:pObj);
var
   T :pObj;
begin
//
//請問一下,底下這邊應該要怎麼寫才對?
//試了很多寫法 都不正確@@"
   T:=aObj1;
   aObj1:=aObj2;   
   aObj2:=T;
   
end;
這樣沒錯吧?問題在哪!? 學而時習之不亦樂乎!
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-02 16:27:20 IP:211.74.xxx.xxx 未訂閱
引言:
引言:
type
  pObj = ^TObj;
  TObj = record
     Next : PObj;
     ID : DWORD;
     Name : array[0..12] of char;
     ...
  end;
var
   pObjList : pObj;    //想要將pObjList中的兩個pObj交換 
//是可以只把資料交換
//不過不是可以把pObj所指的記憶體位址跟pObj.Next所指的記憶體位址交換就可以了?
//寫法不會寫@@"
procedure Swap_pObj(var aObj1,aObj2:pObj);
var
   T :pObj;
begin
//
//請問一下,底下這邊應該要怎麼寫才對?
//試了很多寫法 都不正確@@"
   T:=aObj1;
   aObj1:=aObj2;   
   aObj2:=T;
   
end;
這樣沒錯吧?問題在哪!? 或則?! procedure Swap_pObj(var Obj:pObj); var T :pObj; begin T:=Obj.Next; Obj.Next:=Obj; Obj:=T; end; 學而時習之不亦樂乎!
學而時習之不亦樂乎!
aip999
初階會員


發表:10
回覆:63
積分:44
註冊:2002-03-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-02 16:44:40 IP:218.162.xxx.xxx 未訂閱
引言:
引言:
type
  pObj = ^TObj;
  TObj = record
     Next : PObj;
     ID : DWORD;
     Name : array[0..12] of char;
     ...
  end;
var
   pObjList : pObj;    //想要將pObjList中的兩個pObj交換 
//是可以只把資料交換
//不過不是可以把pObj所指的記憶體位址跟pObj.Next所指的記憶體位址交換就可以了?
//寫法不會寫@@"
procedure Swap_pObj(var aObj1,aObj2:pObj);
var
   T :pObj;
begin
//
//請問一下,底下這邊應該要怎麼寫才對?
//試了很多寫法 都不正確@@"
   T:=aObj1;
   aObj1:=aObj2;   
   aObj2:=T;
   
end;
這樣沒錯吧?問題在哪!? 學而時習之不亦樂乎!
//我用這樣把一個pobj用pObjList串起來 procedure AddObj(var aList,aObj:pObj); begin if aList=nil then begin aList:=aObj end else AddGobj(aList^.Next,aObj); end; //然後想排序那個pObjList所以想寫個把pObjList中的某兩個pObj對調的.. //不過都會出錯... //
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-02 18:09:13 IP:211.74.xxx.xxx 未訂閱
試試這個方法 procedure Swap(var Obj1,Obj2:PObj); var p:PObj; t:TObj; begin //互換記憶體原始位置 t:=Obj1^; Obj1^:=Obj2^ Obj2^:=t; //互換Next指標 p:=Obj1^.Next; Obj1^.Next:=Obj2^.Next; Obj2^.Next:=p; end; 學而時習之不亦樂乎!
aip999
初階會員


發表:10
回覆:63
積分:44
註冊:2002-03-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-02 20:32:14 IP:218.170.xxx.xxx 未訂閱
引言: 試試這個方法 procedure Swap(var Obj1,Obj2:PObj); var p:PObj; t:TObj; begin //互換記憶體原始位置 t:=Obj1^; Obj1^:=Obj2^ Obj2^:=t; //互換Next指標 p:=Obj1^.Next; Obj1^.Next:=Obj2^.Next; Obj2^.Next:=p; end; 學而時習之不亦樂乎!
謝謝你得回應^^ 不過還有點怪怪的說 我把Code貼上來
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;    type
  pObj = ^TObj;
  TObj = record
     Next : PObj;
     X,Y : Byte;
     ID : DWORD;
  end;      TForm1 = class(TForm)
    ListBox1: TListBox;
    btAdd: TButton;
    btSwap: TButton;
    procedure btAddClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure btSwapClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;
  pObjList : pObj=nil;    implementation    {$R *.dfm}    function NewGObj:pObj;
begin
  New(Result);
  Result^.Next := nil;
end;    procedure AddObj(var aList,aObj:pObj);
begin
   if aList=nil then
   begin
      aList:=aObj
   end else
      Addobj(aList^.Next,aObj);
end;    procedure ClearObjList(var aList:pObj);
var
   P: pObj;
begin
   P := aList;
   while aList <> nil do
   begin
     aList := aList^.Next;
     Dispose(P);
     P := aList;
  end;
end;    procedure PrintList;
var
  P: pObj;
begin
  Form1.ListBox1.Clear;
  P := pObjList;
  while P <> nil do
  begin
    Form1.ListBox1.Items.Add(IntToStr(P^.ID));
    P:=P^.Next;
  end;
end;    procedure Swap(var Obj1,Obj2:PObj);
var
   p:PObj;
   t:TObj;
begin
   //互換記憶體原始位置
   t:=Obj1^;
   Obj1^:=Obj2^;
   Obj2^:=t;
   //互換Next指標
   p:=Obj1^.Next;
   Obj1^.Next:=Obj2^.Next;
   Obj2^.Next:=p;
end;    procedure TForm1.btAddClick(Sender: TObject);
var
   i : integer;
   P : pObj;
begin
   for i:=0 to 9 do
   begin
      P:=NewGObj;
      P.ID:=random(100);
      Addobj(pObjList,P);
   end;
   PrintList;
end;    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   ClearObjList(pObjList);
end;    procedure TForm1.btSwapClick(Sender: TObject);
var
   i,T : integer;
begin
   T := GetTickCount;
   for i:=0 to 100000 do
   begin
      Swap(pObjList,pObjList.Next);//<==這樣會有問題0跟1對換
//      Swap(pObjList,pObjList.Next.Next);//<==這樣就不會0跟2對換
   end;
   Caption:=Caption ',' IntToStr(GetTickCount-T);
end;    end.
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-02 22:05:52 IP:211.74.xxx.xxx 未訂閱
procedure Swap(Const Obj1,Obj2:PObj); 學而時習之不亦樂乎!
aip999
初階會員


發表:10
回覆:63
積分:44
註冊:2002-03-29

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-02 22:53:39 IP:218.170.xxx.xxx 未訂閱
引言: procedure Swap(Const Obj1,Obj2:PObj); 學而時習之不亦樂乎!
另一種寫法^^
procedure SwappObj(var aObj1,aObj2:PObj);
var
   T1,T2 :TObj;
begin
   T1:=aObj1^;
   T1.Next:=aObj2.Next;
   T2:=aObj2^;
   T2.Next:=aObj1.Next;
   aObj1^:=T2;
   aObj2^:=T1;
end;
系統時間:2024-05-16 6:10:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!