2013-07-31 143 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, ...)