C++指標問題 |
答題得分者是:dllee
|
asd98537
一般會員 發表:27 回覆:25 積分:10 註冊:2002-10-23 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
asd98537
一般會員 發表:27 回覆:25 積分:10 註冊:2002-10-23 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
引言: int a = 4; int *p2a = &a; a=5; cout<<*p2a; ==> 印出5 BCB下 Edit1->Text = "this is a test"; AnsiString *p2e = &(Edit1->Text); Label1->Caption = *p2e; 為什麼Label1->Caption卻沒東西或是印出亂碼? 謝謝在 BCB 中所有的元件都有 property ,而在 property 中可以分 read 及 write,例如: Edit1->Text 我們可以由線上說明得到: __property AnsiString Text = {read=GetText, write=SetText}; 表示,當我們作: Edit1->Text="this is a test"; 時,就相當於: Edit1->SetText("this is a test"); 而當我們作: AnsiString asTemp=Edit1->Text; 時,就相當於 AnsiString asTemp=Edit1->GetText(); 在您的 code 中 Edit1->Text = "this is a test"; AnsiString *p2e = &(Edit1->Text); Label1->Caption = *p2e; 紅色的部分,可以說是不會在 BCB 中使用的,對於 Label1 的 Caption 同樣也是在 read/write 時叫用不同函式而來,而 &(Edit1->Text) 會取到的指標等於是 Edit1->GetText() 函式所傳回的 AnsiString 的指標,我想,一般 coding 應該是不會用到取回傳值的指標吧,所以 &(Edit1->Text) 之類的 code 是不應該出現的。 如果您想要用字串的指標來傳資料,那可以改成以下的 code Edit1->Text = "this is a test"; char *p2e = Edit1->Text.c_str(); Label1->Caption = p2e; 而在最後一行,將一個 char pointer 指定給 AnsiString 時,其實就相當於 Label1->Caption = AnsiString(p2e); 因為 AnsiString 本身是一個強大的轉換器,可以將很多資料轉成字串,如以上的 code 可以在 Label1 看到 this is a test 如果您想要直接類比 int 的運算,我想,應直接用 AnsiString 取代 int,如下: AnsiString a = "this is 4"; AnsiString *p2a = &a; a="This is 5"; Label1->Caption = *p2a; 最後再使用 Label 或其他元件來顯示結果。如此可以從 Label1 看到 This is 5 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://big5.to/吃軟也吃硬 http://coolsite.to/ushells 介紹Shells,LiteStep,GeoShell.... 發表人 - dllee 於 2003/04/29 23:48:20
------
http://www.ViewMove.com |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
asd98537
一般會員 發表:27 回覆:25 積分:10 註冊:2002-10-23 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
asd98537
一般會員 發表:27 回覆:25 積分:10 註冊:2002-10-23 發送簡訊給我 |
我的意思是
不管Edit1->Text怎麼變動,我用*p2e取出的都是最新值,而不是它之前舊的複本
AnsiString str=Edit1->Text;AnsiString *p2e =&(str);Label1->Caption= (*p2e) ; 這樣作的話,當Edit1->Text的值更動,*p2e的值只是它之前的copy 舉個例子
form上拉個Edit元件,在unit1.h中class TForm1裡會有這一行
__published:
TEdit *Edit1;
我寫
TEdit *p2e = Edit1;
當Edit1->Text變數
p23->Text會取到其變動的值
那能不能類比
我用一個AnsiString *p2a = &(Edit1->Text)//假設這樣可以的話,實際上如dllee大哥說的行不通
*p2a的值會隨著Edit1->Text變動而變動
這就是我的原意
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
asd98537您好:
我有點看不太懂您的意思...
您說要*p2a的值會隨著Edit1->Text變動而變動
而依您原題目的意思,在BCB要呈現:
Edit1中輸入5結果在Label1也呈現5
下面的方式可以做到啊^^?
假如之後Edit1中改成6,Label1就呈現6...
AnsiString str=Edit1->Text; AnsiString *p2e =&(str); Label1->Caption= (*p2e) ;您說這樣作的話,當Edit1->Text的值更動,*p2e的值只是它之前的copy 我不了解您說的copy指的是什麼耶... 還是您指的是這樣 void __fastcall TForm1::Edit1Change(TObject *Sender) { AnsiString str=Edit1->Text; AnsiString *p2e =&(str); Label1->Caption= (*p2e) ; }順心 <>~我也是在學習的階段,所以請您多多見諒與指教~> 發表人 - |
brant
一般會員 發表:1 回覆:64 積分:23 註冊:2003-04-07 發送簡訊給我 |
引言: 我的意思是 不管Edit1->Text怎麼變動,我用*p2e取出的都是最新值,而不是它之前舊的複本 AnsiString str=Edit1->Text;AnsiString *p2e =&(str);Label1->Caption= (*p2e) ; 這樣作的話,當Edit1->Text的值更動,*p2e的值只是它之前的copy 舉個例子 form上拉個Edit元件,在unit1.h中class TForm1裡會有這一行 __published: TEdit *Edit1; 我寫 TEdit *p2e = Edit1; 當Edit1->Text變數 p23->Text會取到其變動的值 那能不能類比 我用一個AnsiString *p2a = &(Edit1->Text)//假設這樣可以的話,實際上如dllee大哥說的行不通 *p2a的值會隨著Edit1->Text變動而變動 這就是我的原意沒有辦法的,因為這樣的操作違反了 OO 資料封裝的原則 會衍生出非常多的問題跟麻煩 所以 VCL 應該會把它內部存放真實資料的變數宣告為 private 就算要他傳指標出來也會帶上 const 修飾詞 而且傳出來的不一定就是直接指到內部資料的指標。 (我沒去看 TEdit 的原始碼,以上是依 OO Programming 的思考模式回答。) |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
to asd98537,
我想,您想要的東西可能需要自己作出來才行,如果是用別人的 code ,您很難保證傳出的指標是不變的(就算是它可以傳出存放資料的指標)。
為什麼呢?
如果您有注意的話,一些 VCL 元件有 Capacity 的屬性,這個 Capacity 表示目前它最多可以存放的量有多少,而當存放的量大於這個值時,它就會重新配置一塊記憶體並將舊資料移到新的記憶體,在使用上,您完全不知道它會如何處理... 當重新配置一塊記憶體的同時,就表示之前您所記錄的指標已經是無效了,必需重新取得。以 AnsiString 來說,就得重新叫用 c_str() 取得目前存放資料的指標。
如果 code 是您自己寫的,您可以在一開始就 new 一個不可能用到的「大」空間,以確保指標不需要改變... 但除非您很確的所用到的量,否則這樣作只是浪費記憶體。 用指標確實可以省下許多 code ,看起來很簡潔,但可不要用過頭了。
我們要玩指標,不要被指標玩喔 < >< > 沒空更新的網頁...
http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://big5.to/吃軟也吃硬 http://coolsite.to/ushells 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |