指標指向內容有誤 |
答題得分者是:鈴鐺
|
T.J.B
版主 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
請問各位前輩 : 為何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 發送簡訊給我 |
你使用的型態不對
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 發送簡訊給我 |
|
T.J.B
版主 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
|
cubi
初階會員 發表:56 回覆:94 積分:35 註冊:2002-04-15 發送簡訊給我 |
請問前輩在藍色那行為什麼可以把字串指定給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 發送簡訊給我 |
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 發送簡訊給我 |
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; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |