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

指標指向內容有誤

答題得分者是:鈴鐺
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-20 10:39:19 IP:61.220.xxx.xxx 未訂閱
請問各位前輩 : 為何ip指標可以指到Tony.name的內容 而d1指標所指的Tony.age內容不是15 卻是 0 何解?? 程式碼及執行結果如下 : type Tbody = Record name : String; age : integer; add : String; end; TPoint = set of 0..255 ; TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var Tony : Tbody ; i : integer; ip :^Tbody; d1 :^Tbody; begin Tony.name := 'fff'; Tony.age := 15; i := 12588; ip := @Tony.name; d1 := @Tony.age; ShowMessage(ip^.name ' ' IntToStr(d1^.age)); end; end. 回首來時路 也無風雨也無晴~~@.@ 發表人 - T.J.B 於 2002/08/20 10:40:11
------
天行健
君子當自強不息~~@.@
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-08-20 13:56:40 IP:61.219.xxx.xxx 未訂閱
你使用的型態不對

    ip :^Tbody; 
    d1 :^Tbody;
//ip, d1均是指向TBody之指標

   d1 := @Tony.age; 
//tony.age為一整數,id定義為TBody之指標卻用來指向整數故不對 以下兩種方法均可 1.
procedure Tfmdumy.Button1Click(Sender: TObject);
var
  Tony : Tbody ;
  i : integer;
  ip :^Tbody;
  d1 :^Tbody;
begin
  Tony.name := 'fff';
  Tony.age := 15;
  i := 12588;

  ip:=@Tony; 
  d1:=@Tony;      ShowMessage(ip^.name ' ' IntToStr(d1^.age));
end;
實際上用一個指標即可, ip^.name--dereference ip後取出name 2.
procedure Tfmdumy.Button2Click(Sender: TObject);
var
  Tony : Tbody ;
  i : integer;
  ip :^string;  // 由於下面用ip:=@tony.name故ip宣告為指向string 之pointer
  d1 :^integer;//d1為指向integer type之pointer
begin
  Tony.name := 'fff';
  Tony.age := 15;
  i := 12588;

  ip := @Tony.name; //ip直接指向字串tony.name所在address
  d1 := @Tony.age; //ip直接指向integer tony.age所在address      ShowMessage(ip^ ' ' IntToStr(d1^));
end;
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-08-20 14:02:31 IP:61.219.xxx.xxx 未訂閱
與原問題無直接關係, 不過 TPoint = set of 0..255 ; Delphi內含一Tpoint之record type, 故最好改個名字
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-08-20 15:04:25 IP:61.220.xxx.xxx 未訂閱
再一次感謝ccchen兄^^~~~~~~~~~~~~ 解決ㄌ 回首來時路 也無風雨也無晴~~@.@
------
天行健
君子當自強不息~~@.@
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-08-21 09:01:15 IP:61.58.xxx.xxx 未訂閱
請問前輩在藍色那行為什麼可以把字串指定給Pointer, 而在編譯時會出現 Variable "PBody2" might not have been initialized 的錯誤,在執行時會當掉,謝謝
type
  TBody = Record
    Name: String;
    Age : Integer;
  end;    implementation    procedure TForm1.Button1Click(Sender: TObject);
var
  Body1: TBody;
  PBody2: ^TBody;
begin
  Body1.Name := 'abc';
  Body1.Age := 20;
  PBody2.Name := Body1.Name;
  Label1.Caption := PBody2.Name;
end;
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-08-21 09:36:35 IP:210.3.xxx.xxx 未訂閱
PBody2 is unassigned (probably nil due to compiler).    
引言: 請問前輩在藍色那行為什麼可以把字串指定給Pointer, 而在編譯時會出現 Variable "PBody2" might not have been initialized 的錯誤,在執行時會當掉,謝謝
type
  TBody = Record
    Name: String;
    Age : Integer;
  end;    implementation    procedure TForm1.Button1Click(Sender: TObject);
var
  Body1: TBody;
  PBody2: ^TBody;
begin
  Body1.Name := 'abc';
  Body1.Age := 20;
  new(PBody2);
  try
    PBody2.Name := Body1.Name;
    Label1.Caption := PBody2.Name;
  finally
    dispose(PBody2);
  end;
end;
鈴鐺
初階會員


發表:33
回覆:81
積分:35
註冊:2002-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-08-21 11:05:47 IP:192.72.xxx.xxx 未訂閱
1. ccchen 兄應該已得分了 2. Variable "PBody2" might not have been initialized 是說, 你沒有給定 PBody2 初值. So,類似 PBody2 := @Body1; 寫法才對. 對了, 在 pascal 裏, 沒事不用拿石頭(Pointer)砸自己的腳. 這樣程式難懂,維護困難. 建議你多用 var(傳遞參數)替代. 或直接用一些高階的資料結構(List,...), 不用這樣麻煩, 執行效率並不會增加多少. ( 我都是直接使用 body1,body2: TBody; Body2.name := body1.name; 因為雖然我會用指標,但不表示其他接手我程式的人會用呀! )
引言: 請問前輩在藍色那行為什麼可以把字串指定給Pointer, 而在編譯時會出現 Variable "PBody2" might not have been initialized 的錯誤,在執行時會當掉,謝謝
type
  TBody = Record
    Name: String;
    Age : Integer;
  end;    implementation    procedure TForm1.Button1Click(Sender: TObject);
var
  Body1: TBody;
  PBody2: ^TBody;
begin
  Body1.Name := 'abc';
  Body1.Age := 20;
  PBody2.Name := Body1.Name;
  Label1.Caption := PBody2.Name;
end;
系統時間:2024-03-29 5:09:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!