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)?

4

1 回答 1

6

类似于 C 的 Delphi 函数reallocReallocMem.

如果您愿意,您可以将 C 结构直接翻译成 Delphi 记录,然后调用ReallocMem. 但是在 Delphi 中,您很可能会使用动态数组而不是原始指针:

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

不需要同时包含数组和大小的结构,因为 Delphi 动态数组会跟踪它自己的长度。

更重要的是,您不会使用0or1作为您的返回值来表示错误。相反,您不会在代码中编写任何显式错误检查,并让运行时在调用SetLength失败时引发异常。

由于您似乎正在实现一个堆栈,因此您可以使用TStack该单元中的类Contnrs。在现代 Delphi 中,您可以Generics.Collections.TStack<Integer>改用。

顺便说一句,C代码被破坏了。它无法正确处理错误。如果调用realloc失败,则NULL返回。由于您将其存储到S->array,因此您丢失了原始内存块的跟踪,因此会泄漏它。C 编程的黄金法则之一是永远不要编写:p = realloc(p, ...).

于 2013-07-31T12:45:47.143 回答