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

函式傳回陣列,使用指標。

答題得分者是:justdo
hofgk
一般會員


發表:1
回覆:1
積分:0
註冊:2005-01-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-05 14:43:29 IP:211.76.xxx.xxx 未訂閱
各位好: 我寫了一個外部的函式,這函式最後會回傳一個一維陣列(兩個變數)的指標給呼叫者。 但是我要看這個陣列的內容時,卻只能看到第一個值,而第二個卻是零。 以下是我的程式碼:    這是Unit.cpp中的呼叫者:
        long double *tmp;
        tmp = Cart2Ang(Edit1->Text.ToDouble(),Edit2->Text.ToDouble(),ARM_BTM,ARM_UPR);
        Memo1->Lines->Add(FloatToStrF(*tmp,ffFixed,18,18));
        Memo1->Lines->Add(FloatToStrF(*(tmp 1),ffFixed,18,18));
這是我另外寫的函式,並include到Unit.cpp中:
long double* __fastcall Cart2Ang(.......){
        long double arc_cosine_ARM_UPR[2];
                :
                :
                :
                :
        return arc_cosine_ARM_UPR;
}
我用debug來看變數的值,都只能看到tmp指抓到第一個值,而第二個值就消失了。 謝謝! 發表人 - hofgk 於 2005/01/05 15:02:45
smartboss
初階會員


發表:19
回覆:93
積分:42
註冊:2004-12-29

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-05 16:59:02 IP:211.76.xxx.xxx 未訂閱
引言: 各位好: 我寫了一個外部的函式,這函式最後會回傳一個一維陣列(兩個變數)的指標給呼叫者。 但是我要看這個陣列的內容時,卻只能看到第一個值,而第二個卻是零。 以下是我的程式碼: 這是Unit.cpp中的呼叫者:
        long double *tmp;
        tmp = Cart2Ang(Edit1->Text.ToDouble(),Edit2->Text.ToDouble(),ARM_BTM,ARM_UPR);
        Memo1->Lines->Add(FloatToStrF(*tmp,ffFixed,18,18));
        Memo1->Lines->Add(FloatToStrF(*(tmp 1),ffFixed,18,18));
這是我另外寫的函式,並include到Unit.cpp中:
long double* __fastcall Cart2Ang(.......){
        long double arc_cosine_ARM_UPR[2];
                :
                :
                :
                :
        return arc_cosine_ARM_UPR;
}
我用debug來看變數的值,都只能看到tmp指抓到第一個值,而第二個值就消失了。 謝謝!
您好,依小弟之見,您傳回的應該不是第一個值,而是那個陣列的位址,且當您的程式離開了那個func 之後,陣列的值就算是不存在了,當程式又進到裡面時那個陣列算是重新被配置過了,小弟董的不多依小弟我會這麼做: long double arc_cosine_ARM_UPR[2]; 將陣列做成全域 long double* __fastcall Cart2Ang(.......) { } 或者在裡,做一個copy 的動作,但是原則上您還是要有全域的陣列來收。 long double Arry[2]; long double* __fastcall Cart2Ang(.......) { memcpy(Arry,arc_cosine_ARM_UPR,2); }
hofgk
一般會員


發表:1
回覆:1
積分:0
註冊:2005-01-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-05 21:50:35 IP:211.76.xxx.xxx 未訂閱
引言: 您好,依小弟之見,您傳回的應該不是第一個值,而是那個陣列的位址,且當您的程式離開了那個func 之後,陣列的值就算是不存在了,當程式又進到裡面時那個陣列算是重新被配置過了,小弟董的不多依小弟我會這麼做: long double arc_cosine_ARM_UPR[2]; 將陣列做成全域 long double* __fastcall Cart2Ang(.......) { } 或者在裡,做一個copy 的動作,但是原則上您還是要有全域的陣列來收。 long double Arry[2]; long double* __fastcall Cart2Ang(.......) { memcpy(Arry,arc_cosine_ARM_UPR,2); }
所以由Function產生的陣列,離開Function以後就會消失,是這樣嗎? 也就是說要讓Function處理函式,就一定得用傳址呼叫,或是複製一份並傳回去,而不能僅僅傳回一個陣列的開頭位址即可? 謝謝!!
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-05 22:14:32 IP:221.169.xxx.xxx 未訂閱
函式內的陣列可以宣告成static, 如此在函式結束之後,其內容依然會繼續保留著 不過不建議這麼做 因為下次呼叫的時候,有可能會改變其值,導致上次的結果也跟著改變
系統時間:2024-06-28 19:00:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!