Function 傳回 Array 的問題 |
答題得分者是:william
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
請問一下各位前輩,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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 :嗯,這個我也有想過,目前是有幾個不是直接傳回 Array 的做法,也都很好用 所以功能上沒有問題,剩下的就是純個人好奇而已.. Function 有辦法直接傳回 dynamic array 嗎?? 可以利用一個 Pointer 傳回 Array 的開始 Address 這種做法嗎??//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; |
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
引言: 嗯,這個我也有想過,目前是有幾個不是直接傳回 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 發送簡訊給我 |
引言:謝謝 William 版主,果然可以傳 dynamic array .. 經過測試後改成如下,希望對有類似問題的人有幫助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. 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; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |