線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1473
推到 Plurk!
推到 Facebook!

如何取得動態矩陣的大小?

尚未結案
hornacek
一般會員


發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-25 18:15:24 IP:61.63.xxx.xxx 未訂閱
int func(int *a)
{
    // 想在此取得 a 的大小 10,回傳 a 的大小 10
}    int main()
{
    int *a = new int[10];        int b = func(a);        return 0;
}
請問上面這段程式中的func,要如何完成? 我才能在主程式的b得到10呢?謝謝!
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-25 18:27:46 IP:61.70.xxx.xxx 未訂閱
您好: 應該沒有辦法得到大小,傳入為指標的話,就算用超過,編譯器也不會理你. 所以才會一般傳入時還必需多一個Size傳入,像下面這個Win32 SDK的宣告.
DWORD GetPrivateProfileString(
    LPCTSTR lpAppName,        // points to section name 
    LPCTSTR lpKeyName,        // points to key name 
    LPCTSTR lpDefault,        // points to default string 
    LPTSTR lpReturnedString,        // points to destination buffer 
    DWORD nSize,        // size of destination buffer 
    LPCTSTR lpFileName         // points to initialization filename 
   );
因此,要完成他只能像下面這樣
int func(int *a,int Size)
{
for (int i=0;i    另外再提供一個訊習給您參考,但不適用於C  的new配置記憶體.
http://delphi.ktop.com.tw/topic.php?topic_id=60816    發表人 - supman 於 2005/04/25  19:27:17    發表人 - supman 於 2005/04/25  20:42:13
        
hornacek
一般會員


發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-25 23:23:10 IP:59.112.xxx.xxx 未訂閱
引言: 您好: 應該沒有辦法得到大小,傳入為指標的話,就算用超過,編譯器也不會理你. 所以才會一般傳入時還必需多一個Size傳入,像下面這個Win32 SDK的宣告.
DWORD GetPrivateProfileString(
    LPCTSTR lpAppName,        // points to section name 
    LPCTSTR lpKeyName,        // points to key name 
    LPCTSTR lpDefault,        // points to default string 
    LPTSTR lpReturnedString,        // points to destination buffer 
    DWORD nSize,        // size of destination buffer 
    LPCTSTR lpFileName         // points to initialization filename 
   );
因此,要完成他只能像下面這樣
int func(int *a,int Size)
{
for (int i=0;i    另外再提供一個訊習給您參考,但不適用於C  的new配置記憶體.
http://delphi.ktop.com.tw/topic.php?topic_id=60816    發表人 - supman 於 2005/04/25  20:42:13
既然用malloc配置的記憶體可以用_msize來得到矩陣的size,那不是比用傳參數進去還要來得方便嗎?但為什麼大部份的API卻都還是選擇用傳參數大小的方法來建立函數呢?
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-26 00:18:17 IP:211.76.xxx.xxx 未訂閱
hornacek 您好:    如果您真的需要計算陣列的大小的話,底下程式碼可以試試!    
int func(int *a)
{
    // 想在此取得 a 的大小 10,回傳 a 的大小 10
   int size = _msize(a) / sizeof(a[0]);
   return (size);
}
不過您提出了個有趣的問題,使用 _msize(.) 。 1.經查BCB線上說明,對該函式的描述,讓人有點失望! 該函式僅存在win32,可攜性低;還有傳回值可能會大一些。 2.我嘗試在Windows與console mode下分別測試一下發現, 在Windows mode下會多出 4 bytes,console mode 則正常。 或許需要更多的測試來找出真正的規則。不過可攜性低與傳回值不盡相同的狀況下,使用者將失去對該函式的信任! RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-26 00:30:07 IP:203.204.xxx.xxx 未訂閱
您好: API會要您輸入大小主要應該是相容性與效率. 您想想看,如果您是使用New所配置的出來的計憶體,傳入API中,但他卻又不接受,那是否作業系統必需另外在提供那樣的函數,而如果他能在函數內幫您處理這些計憶體,那函數效率不是下降了,您如果有用過Delphi就可以感覺到,Delphi在計憶體與與資料型態都會嚴格限制,而BCB卻不管您怎麼使用,因此編譯時編譯器檢查東檢查西的,造成Delphi與BCB的編譯速度差距甚大. 想想看,如果Windows Api是您寫的,您會怎麼去寫那些函數. 發表人 - supman 於 2005/04/26 00:33:29
hornacek
一般會員


發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-26 10:06:54 IP:220.135.xxx.xxx 未訂閱
感謝supman及richtop大大詳盡的說明,讓我更能體會為什麼寫API的那些人在設計函式時,會需要在傳陣列的同時又再多傳一個陣列大小的參數,雖然表面上看起來似乎有些多此一舉,不過為了增加相容性及效率,不得不為此做一些犧牲來換取,謝謝!
系統時間:2024-06-01 23:06:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!