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

Function 傳回 Array 的問題

答題得分者是:william
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-24 15:21:25 IP:203.66.xxx.xxx 未訂閱
請問一下各位前輩,Delphi 如何傳回完整的陣列??    
function TForm1.Rearrange(Ranges:array of TRange): array of TRange;
var
   i,Count,RCount:integer;
   NewRanges : array of TRange;
begin
  RCount := 2*High(Ranges)-1;
  Count := 0;      SetLength(NewRanges,RCount);      for i:=0 to High(Ranges) do
  begin
    NewRanges[Count].StartRow := Ranges[i].StartRow;
    NewRanges[Count].EndRow := Ranges[i 1].StartRow;
    Inc(Count);
    NewRanges[RCount].StartRow := Ranges[i 1].EndRow;
    NewRanges[RCount].EndRow := Ranges[i].EndRow;
    Dec(RCount);
  end;      Result :=  NewRanges;    end; 
PS. TRange 是一個 Record; 紅色地方是錯得離譜 ..... 請問
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-24 15:51:58 IP:203.66.xxx.xxx 未訂閱
Sorry!! 浪費版面了 ..     我找到站內舊文章 : http://forum.vclxx.org/topic.php?TOPIC_ID=3236&FORUM_ID=8&CAT_ID=2&Topic_Title=function+%A5i%A5H%A6%5E%B6%C7%B0%7D%A6C%B6%DC&Forum_Title=Pascal    裡面利用 TStringList 傳遞,跟我原本想用 TList 接近.. 文章內 georges 前輩提到可以將 array 宣告成一個 Type ..    不過,如果是 dynamic array , Run-Time 會發生錯誤 ... 不過 compile 會過 ....
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-24 16:11:53 IP:203.203.xxx.xxx 未訂閱
This make u a little easyer and faster    since NewRange will and always be double the Range size + 1 set array size out side the function and change function to procedure to :    
//thought var, const all call by address, this make u faster,delphi will take care of const, make sure u can not change Ranges
procedure TForm1.Rearrange(var NewRanges:array of TRange;const Ranges:array of TRange);
var
   i,Count,RCount:integer;
   
begin
  RCount := High(NewRanges) - Low(NewRanges)   1;
  Count := 0;      //SetLength(NewRanges,RCount); already done outside, so u don't need this anymore
  [red]// use Low in case array is not start at 0 
  for i:=Low(Ranges) to High(Ranges) do
  begin
    NewRanges[Count].StartRow := Ranges[i].StartRow;
    NewRanges[Count].EndRow := Ranges[i 1].StartRow;
    Inc(Count);
    NewRanges[RCount].StartRow := Ranges[i 1].EndRow;
    NewRanges[RCount].EndRow := Ranges[i].EndRow;
    Dec(RCount);
  end;    end;     
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-24 16:30:50 IP:203.66.xxx.xxx 未訂閱
引言: This make u a little easyer and faster since NewRange will and always be double the Range size 1 set array size out side the function and change function to procedure to :
//thought var, const all call by address, this make u faster,delphi will take care of const, make sure u can not change Ranges
procedure TForm1.Rearrange(var NewRanges:array of TRange;const Ranges:array of TRange);
var
   i,Count,RCount:integer;
   
begin
  RCount := High(NewRanges) - Low(NewRanges)   1;
  Count := 0;      //SetLength(NewRanges,RCount); already done outside, so u don't need this anymore
  [red]// use Low in case array is not start at 0 
  for i:=Low(Ranges) to High(Ranges) do
  begin
    NewRanges[Count].StartRow := Ranges[i].StartRow;
    NewRanges[Count].EndRow := Ranges[i 1].StartRow;
    Inc(Count);
    NewRanges[RCount].StartRow := Ranges[i 1].EndRow;
    NewRanges[RCount].EndRow := Ranges[i].EndRow;
    Dec(RCount);
  end;    end;     
嗯,這個我也有想過,目前是有幾個不是直接傳回 Array 的做法,也都很好用 所以功能上沒有問題,剩下的就是純個人好奇而已.. Function 有辦法直接傳回 dynamic array 嗎?? 可以利用一個 Pointer 傳回 Array 的開始 Address 這種做法嗎??
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-24 16:40:47 IP:147.8.xxx.xxx 未訂閱
引言: 嗯,這個我也有想過,目前是有幾個不是直接傳回 Array 的做法,也都很好用 所以功能上沒有問題,剩下的就是純個人好奇而已.. Function 有辦法直接傳回 dynamic array 嗎?? 可以利用一個 Pointer 傳回 Array 的開始 Address 這種做法嗎??
type
    TRanges = array of TRange;    function TForm1.Rearrange(const Ranges: TRanges): TRanges;
begin
{...}
    SetLength(Result,RCount);
{...}
end;
Remember to free (SetLength(xxx,0)) the resulting array in the caller.
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-24 17:12:07 IP:203.66.xxx.xxx 未訂閱
引言:
type
    TRanges = array of TRange;    function TForm1.Rearrange(const Ranges: TRanges): TRanges;
begin
{...}
    SetLength(Result,RCount);
{...}
end;
Remember to free (SetLength(xxx,0)) the resulting array in the caller.
謝謝 William 版主,果然可以傳 dynamic array .. 經過測試後改成如下,希望對有類似問題的人有幫助
TARange = array of TRange;    function Rearrange(const Ranges:array of TRange):TARange;
var
   i,Count,RCount:integer;
   NewRanges : TARange;
begin
  RCount := 2*(High(Ranges) 1)-1;
  Count := 0;      SetLength(NewRanges,RCount);
  SetLength(Result,RCount);      for i:=0 to High(Ranges) do
  begin
    NewRanges[Count].StartRow := Ranges[i].StartRow;
    NewRanges[Count].EndRow := Ranges[i 1].StartRow;
    Inc(Count);
    NewRanges[RCount].StartRow := Ranges[i 1].EndRow;
    NewRanges[RCount].EndRow := Ranges[i].EndRow;
    Dec(RCount);
  end;      Result := NewRanges;    end; 
系統時間:2024-04-19 21:30:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!