ReallocMem()該如何使用? |
尚未結案
|
baker0907
一般會員 發表:2 回覆:2 積分:0 註冊:2004-10-15 發送簡訊給我 |
請問大家,
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 發送簡訊給我 |
|
baker0907
一般會員 發表:2 回覆:2 積分:0 註冊:2004-10-15 發送簡訊給我 |
感謝板主的回覆^^ 因為我在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 發送簡訊給我 |
|
baker0907
一般會員 發表:2 回覆:2 積分:0 註冊:2004-10-15 發送簡訊給我 |
再次感激板主的解答。 其實會提出這樣的疑問是因為我依照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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |