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

ReallocMem()該如何使用?

尚未結案
baker0907
一般會員


發表:2
回覆:2
積分:0
註冊:2004-10-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-27 12:09:02 IP:203.70.xxx.xxx 未訂閱
請問大家, ReallocMem()該如何使用? 因為當我用GetMem()動態配置一塊陣列之後, 卻無法用ReallocMem()改變陣列的大小, 希望大家可以幫小弟一下...Thanks ^^ procedure TForm1.Button1Click(Sender: TObject); type PIntArray = ^TIntArray; TIntArray = array [0..10-1] of Integer; var IntArrayP: PIntArray; begin IntArrayP := nil; GetMem(IntArrayP, 10 * SizeOf(Integer)); //此行沒有任何反應 ReallocMem(IntArrayP, 20 * SizeOf(Integer)); ReallocMem(IntArrayP, 0); end;
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-27 12:40:08 IP:61.222.xxx.xxx 未訂閱
您問的問題有點奇怪! 您已經定義該陣列最大值。 TIntArray = array [0..10-1] of Integer; 何來超過且重新分配記憶體說?
baker0907
一般會員


發表:2
回覆:2
積分:0
註冊:2004-10-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-27 15:59:41 IP:203.70.xxx.xxx 未訂閱
感謝板主的回覆^^ 因為我在Delphi自己對於TList物件的程式碼發現 在SetCapacity()有用到ReallocMem()來重配置他自己的FList記憶體 但是我發現FList本身型態定義為... FList: PPointerList; PPointerList = ^TPointerList; TPointerList = array[0..MaxListSize - 1] of Pointer; 為何Delphi自己可以這樣來使用ReallocMem()呢? 或者ReallocMem()正確的用法應該是?
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-28 01:13:07 IP:61.31.xxx.xxx 未訂閱
我看不出有任何產生疑問的地方? ReallocMem 是指重新分配記憶體的大小!(指針內容) 而您所指的為陣列的數量(不知道這個說詞對不對) 關於陣列的使用,可使用動態陣列 var IntArray: Array of integer; 改變陣列的數量,可以使用 SetLength
baker0907
一般會員


發表:2
回覆:2
積分:0
註冊:2004-10-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-28 10:14:46 IP:203.70.xxx.xxx 未訂閱
再次感激板主的解答。 其實會提出這樣的疑問是因為我依照Delphi使用ReallocMem()的方式依樣畫葫蘆卻沒有相同的結果。 看到Delphi內 unit Classes - TList Class中的 FList: PPointerList 且型態為 PPointerList = ^TPointerList; TPointerList = array[0..MaxListSize - 1] of Pointer; 明明是Static Array卻可以重新分配記憶體的大小 像是在他自己的SetCapacity()中所使用來修改ListItem的容量 procedure TList.SetCapacity(NewCapacity: Integer); begin if (NewCapacity < FCount) or (NewCapacity > MaxListSize) then Error(@SListCapacityError, NewCapacity); if NewCapacity <> FCapacity then begin //明明是固定[0..MaxListSize - 1]卻呼叫ReallocMem.... ReallocMem(FList, NewCapacity * SizeOf(Pointer)); FCapacity := NewCapacity; end; end; 如果可以用中斷追蹤至Delphi內部程式段就好了=...=
rexchiu
中階會員


發表:14
回覆:88
積分:70
註冊:2002-03-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-28 11:02:15 IP:220.229.xxx.xxx 未訂閱
procedure TForm1.Button1Click(Sender: TObject);
type
PIntArray = ^TIntArray;
TIntArray = array [0..10-1] of Integer;
var
IntArrayP: PIntArray;
i:integer;
begin
IntArrayP := nil;
GetMem(IntArrayP, 10 * SizeOf(Integer));
for i :=0  to 9 do
begin
  intarrayp^[i]:=i;
end;    for i:=0 to 9 do
begin
  memo1.Lines.Add(inttostr(intarrayp^[i]));
end;
showmessage(inttostr(sizeof(intarrayp)));
//此行沒有任何反應
ReallocMem(IntArrayP, 20 * SizeOf(Integer));
for i :=0  to 19 do
begin
  intarrayp^[i]:=i;
end;    for i:=0 to 19 do
begin
  memo1.Lines.Add(inttostr(intarrayp^[i]));
end;
showmessage(inttostr(sizeof(intarrayp)));
end; 
不知道你的ReallocMem是怎樣沒反應? 我用你的code,很正常呀~~ 上面二段,紅色部分的程式碼是我加的~~ 你可以做個簡單的測試,若把第一段紅色程式碼中 的所有for loop故意讓他超出10,就會得到錯誤的結果. 因此,ReallocMem是有用滴呀~~
------
Best Regards,
Rex Chiu
rexchiu
中階會員


發表:14
回覆:88
積分:70
註冊:2002-03-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-01-28 11:04:26 IP:220.229.xxx.xxx 未訂閱
procedure TForm1.Button1Click(Sender: TObject);
type
PIntArray = ^TIntArray;
TIntArray = array [0..10-1] of Integer;
var
IntArrayP: PIntArray;
i:integer;
begin
IntArrayP := nil;
GetMem(IntArrayP, 10 * SizeOf(Integer));
for i :=0  to 9 do
begin
  intarrayp^[i]:=i;
end;    for i:=0 to 9 do
begin
  memo1.Lines.Add(inttostr(intarrayp^[i]));
end;
showmessage(inttostr(sizeof(intarrayp)));
//此行沒有任何反應
ReallocMem(IntArrayP, 20 * SizeOf(Integer));
for i :=0  to 19 do
begin
  intarrayp^[i]:=i;
end;    for i:=0 to 19 do
begin
  memo1.Lines.Add(inttostr(intarrayp^[i]));
end;
showmessage(inttostr(sizeof(intarrayp)));
end; 
不知道你的ReallocMem是怎樣沒反應? 我用你的code,很正常呀~~ 上面二段,紅色部分的程式碼是我加的~~ 你可以做個簡單的測試,若把第一段紅色程式碼中 的所有for loop故意讓他超出10,就會得到錯誤的結果. 因此,ReallocMem是有用滴呀~~
------
Best Regards,
Rex Chiu
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-01-28 11:41:33 IP:61.222.xxx.xxx 未訂閱
ReallocMem  是指重新分配記憶體的大小!(指針內容) 與Static Array 無關(事實上,是並未動到)。 TList (Count 與 Capacity 意境不同啊~) ReallocMem(FList, NewCapacity * SizeOf(Pointer));
系統時間:2024-05-09 3:16:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!