2013-07-31 116 views
1
int StackRealloc(stack* S){ 

    if ((S->array = realloc(S->array,sizeof(int)*(S->size)*2)) != NULL){ 
    S->size = (S->size)*2; 
    return 1; 
    } 
    else return 0; 
} 

如何將此代碼(c)轉換爲Delphi(Delphi7)?將C realloc轉換爲Delphi

+1

它是你遇到問題的一部分?你已經閱讀過C的'realloc'的文檔,對吧?你已經將它與你在程序其餘部分使用的Delphi內存管理功能進行了比較,對吧?還剩下什麼? –

回答

6

Delphi的功能很是類似至C reallocReallocMem

你可以,如果你願意,使C結構的字面翻譯成德爾福記錄,然後調用ReallocMem。但是,在Delphi中你可以將最有可能使用一個動態數組,而不是原始指針:

var 
    arr: array of Integer; 
... 
SetLength(arr, Length(arr)*2); 

沒有必要既包含陣列和大小,因爲一個Delphi動態數組跟蹤其自身長度的結構。

更重要的是使用01爲您的返回值,你就不會信號誤差。相反,您不會在代碼中編寫任何明確的錯誤檢查,並在SetLength調用失敗時讓運行時發出異常。

由於您似乎正在實施堆棧,因此可以使用Contnrs單元中的TStack類。在現代Delphi中,您可以使用Generics.Collections.TStack<Integer>代替。

順便說一句,C代碼被打破了。它無法正確處理錯誤。如果realloc的呼叫失敗,則返回NULL。既然你把它存儲到S->array,那麼你失去了原始內存塊的軌道,並因此泄漏它。 C編程的一個黃金法則是你永遠不會寫:p = realloc(p, ...)