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

函式傳值問題

尚未結案
huei_brother
一般會員


發表:36
回覆:15
積分:10
註冊:2004-08-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-07 00:05:13 IP:211.76.xxx.xxx 未訂閱
各位前輩小弟寫了一個函式但是傳回來的值並不是計算的結果可否請大家幫忙 一下看我哪裡出錯了謝謝 我的問題是如何把A[i]的值傳回給D [code] double *D; D = new double[5]; D = double MM(); for(int i = 0;i < 5;i ) { ListBox1->Items->Add(D[i]); } //----------------------------------- double MM() double *A; A = new double[5]; double B[5] = {1.2,1.3,1.4,1.5,1.6}; double C[5] = {2.2,2.3,2.4,2.5,2.6}; for(int i = 0;i < 5;i ) { A[i]= B[i] C[i]; return (A[i]); } [code]
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-07 08:54:24 IP:203.70.xxx.xxx 未訂閱
引言:
    double *D;
D = new double[5];
D = MM();  //語法錯誤
for(int i = 0;i < 5;i  )
{
  ListBox1->Items->Add(D[i]);
}
//-----------------------------------
double* MM()  //函式回傳值改成double*
{
  double *A;
  A = new double[5];
  double B[5] = {1.2,1.3,1.4,1.5,1.6};
  double C[5] = {2.2,2.3,2.4,2.5,2.6};
  for(int i = 0;i < 5;i  )
  {
    A[i]= B[i]   C[i];
    //return (A[i]);
  }
  return A;
}
huei_brother您好 您需要的是回傳整個A陣列吧!? 如果將return敘述寫在迴圈裡,那麼迴圈只會執行一次就離開函式了... 上面紅字部分是小弟幫您修正的部分,這樣就可以了 *另外提醒您,函式裡面動態配置的A陣列會造成記憶體漏失的現象, 比較建議的方法是直接將D陣列當成參數傳入(以指標或參考的方式),請再試試看~~< > 參考看看< > 程式迷人之處,在於邏輯思考,然而卻也是惱人之處 發表人 -
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
huei_brother
一般會員


發表:36
回覆:15
積分:10
註冊:2004-08-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-07 09:46:28 IP:140.127.xxx.xxx 未訂閱
ENIX007:    謝謝您的幫忙我的問題已解決了,另外您有提到利用動態配置會造成記憶體漏失    的現象,因為最近剛接觸程式撰寫解決方法我不是很清楚可否請舉個例子幫我    說明一下,謝謝您囉 
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-07 11:47:49 IP:203.70.xxx.xxx 未訂閱
huei_brother您好 使用new得到的記憶體空間必須使用delete來釋放,而前提是你必須知道new 時配置給你的記憶體位置... 以您的例子
double *D;
D = new double[5]; //D已經配置記憶體了
D = MM(); //注意這裡D指標已經被改成A在函式裡new配置的位址了
for(int i = 0;i < 5;i  )
{
  ListBox1->Items->Add(D[i]);
}
delete [] D; //這裡只能delete D(其實是釋放到A)
//-----------------------------------
double* MM()  //函式回傳值改成double*
{
  double *A;
  A = new double[5]; //
  double B[5] = {1.2,1.3,1.4,1.5,1.6};
  double C[5] = {2.2,2.3,2.4,2.5,2.6};
  for(int i = 0;i < 5;i  )
  {
    A[i]= B[i]   C[i];
    //return (A[i]);
  }
  return A;//因為必須回傳,所以無法delete
}
以上做法會變成D一開始配置的記憶體遺失...(之前說錯了,是D會遺失不是A) 所以要正確的話,D一開始不要配置記憶體就行了,不過這樣的話就變成函式內配置的 記憶體在外面才做釋放, 當程式越來越大時,會變得不好維護... 因此改成傳入指標的方式...
 
void MM(double *A)
{
  //double *A;
  //A = new double[5];
  double B[5] = {1.2,1.3,1.4,1.5,1.6};
  double C[5] = {2.2,2.3,2.4,2.5,2.6};
  for(int i = 0;i < 5;i  )
  {
    A[i]= B[i]   C[i];
  }
  //return (A);
}      double *D;
  D = new double[5]; //在這裡配置
  MM(D);  //函式內只做運算,不配置記憶體
  for(int i = 0;i < 5;i  )
  {
    ListBox1->Items->Add(D[i]);
  }
  delete [] D; //做完釋放記憶體
這樣會比較好維護... 解釋的有點小複雜,將就將就囉< > 參考看看< > 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
huei_brother
一般會員


發表:36
回覆:15
積分:10
註冊:2004-08-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-07 23:15:08 IP:211.76.xxx.xxx 未訂閱
ENIX007您好    謝謝您替我詳細說明我已經了解囉
系統時間:2024-05-03 20:03:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!