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

請問一個陣列的問題

尚未結案
is90057
一般會員


發表:3
回覆:1
積分:0
註冊:2004-02-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-16 14:18:46 IP:61.56.xxx.xxx 未訂閱
我設定一個動態的陣列SetLength(dynArray,49); 有時我們很難去估算陣列的大小,很可能造成不夠使用,一旦宣告太大,又會浪費許多寶貴的記憶體,想請問各位大大我要怎麼辦,當我遇到陣列的基底數不固定時要如何去設定?
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-16 14:25:22 IP:218.170.xxx.xxx 未訂閱
轉貼自help的範例    
    var      A: Variant;
begin
  A := VarArrayCreate([0, 4], varVariant);
  A[0] := 1;
  A[1] := 1234.5678;
  A[2] := 'Hello world';
  A[3] := True;
  A[4] := VarArrayOf([1, 10, 100, 1000]);
  WriteLn(A[2]);        { Hello world }
  WriteLn(A[4][2]);        { 100 }    end;    
用variant似乎是個可行之道
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-16 14:29:49 IP:218.170.xxx.xxx 未訂閱
補充一個     用tlist也是一種做法    在 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=49907    參與的討論中有寫了一段短短的code也很接近你的需求,不過已經不是用陣列解決了    
procedure test(s: tlist);
var i:integer;
begin
    for i:=0 to s.count-1 do begin
      if tobject(s[i]) is tlabel then
         showmessage ('label');
      if tobject(s[i]) is tbutton then
         showmessage ('button');
    end;
end;
yachanga
資深會員


發表:24
回覆:335
積分:296
註冊:2003-09-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-16 15:02:49 IP:61.230.xxx.xxx 未訂閱
引言: 我設定一個動態的陣列SetLength(dynArray,49); 有時我們很難去估算陣列的大小,很可能造成不夠使用,一旦宣告太大,又會浪費許多寶貴的記憶體,想請問各位大大我要怎麼辦,當我遇到陣列的基底數不固定時要如何去設定? < face="Verdana, Arial, Helvetica"> Hi is90057: 參考william大大做法 看看是不是您要的
type
    TMyReals = array of real;    procedure test(var x: TMyReals; y:Integer);
begin
    SetLength(x,10);
end;    
以下為相關討論 http://delphi.ktop.com.tw/topic.php?topic_id=23024 http://delphi.ktop.com.tw/topic.php?topic_id=30503 http://delphi.ktop.com.tw/topic.php?topic_id=26756 http://delphi.ktop.com.tw/topic.php?topic_id=25062 發表人 - yachanga 於 2004/05/16 15:16:55
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-17 22:04:03 IP:61.229.xxx.xxx 未訂閱
如果dynArray一開始設為49,並且對內容都給值了.當發現dynArray不夠大時,其實可以直接呼叫SetLength(dynArray,60),把陣列加到需要的大小(假設要60才夠),這時,原本在dynArray陣列內的前49個元素內的值並不會改變.當然,如果你要的功能複雜的話,建議用TList或TStringList會來得比較快,畢竟Delphi是OO的語言,既然已經有了TList/TStringList這類的陣列管理物件,何苦要自己寫呢? 底下的程式是加大陣列的sample,您可以測試看看:
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;    type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
  private
    aa:array of string;
    procedure ShowArrayData;
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}    { TForm1 }    procedure TForm1.ShowArrayData;
var
  i:Integer;
begin
  ListBox1.Items.Clear;
  for i:=0 to high(aa) do
    ListBox1.Items.Add(aa[i]);
end;    procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  //第一次設定陣列大小為4
  SetLength(aa,4);
  aa[0]:='0';
  aa[1]:='1';
  aa[2]:='2';
  aa[3]:='3';
  ShowArrayData;
end;    procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  //第一次設定陣列大小為8
  SetLength(aa,8);
  aa[4]:='4';
  aa[5]:='5';
  aa[6]:='6';
  aa[7]:='7';
  ShowArrayData;
end;    end.
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-24 18:42:21 IP:61.219.xxx.xxx 未訂閱
用一個新增一個元素,應該是最經濟實惠的方法 下面的方法試試 type TMyReals = array of real; procedure test(var x: TMyReals; y:Integer); begin SetLength(TMyReals,1); if need add array then begin j:=high(TMyReals) SetLength(TMyReals,j 1); end; end; 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
系統時間:2024-05-19 18:36:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!