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

關於TryStrToInt和TryStrToFloat

尚未結案
gmobug
一般會員


發表:10
回覆:28
積分:12
註冊:2004-02-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-15 20:43:43 IP:221.169.xxx.xxx 未訂閱
他們的形狀大概長的都像是 TryStrToInt(AnsiString S, int & Value) 問題是第2個參數 我不懂他&的意思 而且這個&似乎也不是取址運算子 如果是的話他應該會寫int * 而且實際上我用了取址運算子的話編譯會發生錯誤 所以應該是直接打變數名進去就好囉? 但是 這樣他傳進去的將會是那個邊數的值 他是怎麼把轉出來的值放進去的啊? 發表人 - gmobug 於 2005/07/15 22:39:12
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-15 21:14:12 IP:211.76.xxx.xxx 未訂閱
TryStrToInt(AnsiString S, int & Value) 似乎是把S轉換成int然後存入Value這個變數中,所以先宣告Value變數,不用傳值進去
   String s="1234214";
   bool TF;
   int value;
   TF=TryStrToInt(s,value);
   Edit1->Text=IntToStr(TF); //判斷是否可以轉換成int,0表示不行,1表示可以
   Edit2->Text=value;
我是這麼認為...不知道有沒有說錯^^
gmobug
一般會員


發表:10
回覆:28
積分:12
註冊:2004-02-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-15 22:20:43 IP:221.169.xxx.xxx 未訂閱
那TryStrToInt的函式內容要怎麼把值放到 Value這個變數在記憶體裡面的位置呢?    這樣看起來在乎叫TryStrToInt()的過程中並沒有告訴他Value在記憶體的位址啊?    還有他function prototype第二個parameter的那個& 是啥意思ㄚ? 還有 >
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-15 22:50:01 IP:211.76.xxx.xxx 未訂閱
如果我沒記錯的話..TryStrToInt()這個function的回傳值是bool...所以我才會加了那行判斷是否可以轉換成int 關於傳值到value這個變數我就不知道該怎麼解釋了
psl
一般會員


發表:6
回覆:30
積分:7
註冊:2003-06-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-16 00:14:15 IP:220.129.xxx.xxx 未訂閱
gmobug 你好: 這個函數 TryStrToInt(AnsiString S, int & Value) 裡 第二個參數的意思是 '傳參考' [pass by reference] 其實他是取那個參數的位址傳進去的 從以下的反組譯程式碼就可以知道了     
Unit1.cpp.13: int i=0;
00401414 33D2             xor edx,edx
00401416 8955D4           mov [ebp-0x2c],edx
ebp-0x2c 就是區域變數 i 的位址
所以 mov [ebp-0x2c],edx 就是把 0 填入 i (edx已再上一行清為零了)    Unit1.cpp.14: bool a = TryStrToInt(as, i);
00401419 8D55D4           lea edx,[ebp-0x2c]  <-- (就是這一行 取 i 的位址到 edx) 
0040141C 8B45FC           mov eax,[ebp-0x04]  <-- (ebp-0x04 是那個 as 的位址)
0040141F E8E80E0000       call Sysutils::TryStrToInt(const System::AnsiString,int &)
00401424 8845D3           mov [ebp-0x2d],al
可以看到 BCB/Delphi 參數都盡量用 register 傳 ^_^ 傳參考跟傳指標的差異 以下是一種狀況
void Swap(int* a, int* b)
{
    int c;
    c = *a;
    *a = *b;
    *b = c;
};    void Swap(int& a, int& b)
{
    int c;
    c = a;
    a = b;
    b = c;
};
第一種要這樣用 Swap( &x, &y ); 第二種要這樣用 Swap( x, y ); 有沒有感覺第二種寫法程式碼比較清爽 ^_^ 可以其他參考C 的書籍應該都會有詳細的解釋的
gmobug
一般會員


發表:10
回覆:28
積分:12
註冊:2004-02-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-16 01:11:53 IP:221.169.xxx.xxx 未訂閱
所以說是compiler會自己幫我作取址的動作囉! 嘿...這樣好棒 那如果我要寫一個可以這樣的函式是否就向那樣宣告 int & value呢? 對了C底下可以這樣做嗎 我沒仔細K過C 的書 我只有K過C的書 發表人 - gmobug 於 2005/07/16 01:13:13
psl
一般會員


發表:6
回覆:30
積分:7
註冊:2003-06-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-16 07:42:56 IP:220.143.xxx.xxx 未訂閱
gmobug 你好    > 那如果我要寫一個可以這樣的函式是否就向那樣宣告 int & value呢?      在 C++ 裡本來就可以這樣用  請不用客氣 ^_^    > 對了C底下可以這樣做嗎      在 C 裡面似乎沒有 pass by reference   下面是我查到的連結  給你參考一下   http://www.eskimo.com/~scs/C-faq/q4.11.html  (1995 年 -_-a)   語言大都有在演進  不知最新的 C 標準有沒有加進什麼元素      C++ 裡 reference 的一個重要用途是有效實作出 operator overload   如果用 pointer 來實作 overload "+" 這個運算子
Matrix operator ( Matrix *m1, Matrix *m2 )
{
    Matrix result;
    // do the computation in result
    return result;
}
使用時要這樣 兩個相加 &a &b 三個相加 &(&a &b) &c 你會不會感覺很 orz 但是如果我用 reference 來實作
Matrix operator ( const Matrix &m1, const Matrix &m2 )
{
    Matrix result;
    // do the computation in result
    return result;
} 
就可以這樣用 兩個相加 a b 三個相加 a b c 寫程式不再 orz 了 詳細說明可以參考任何一本 "好的" >
系統時間:2024-04-26 19:58:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!