2013-07-31 3 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을 델파이로 변환

+1

어떤 부분에서 문제가 있습니까? C의'realloc'에 대한 문서를 읽었습니까? 그리고 나머지 프로그램에서 사용하고있는 델파이 메모리 관리 함수와 비교 했습니까? 남은 건 뭐야? –

답변

6

C realloc과 유사한 델파이 함수는 ReallocMem입니다.

원하는 경우 C 구조체를 Delphi 레코드로 리터럴 변환 한 다음 ReallocMem을 호출 할 수 있습니다. 그러나 델파이에서 당신은 대부분 원시 포인터 대신 동적 배열을 사용 : 델파이 동적 배열은 자신의 길이를 추적하기 때문에 배열과 크기가 모두 포함 된 구조체에 대한 필요가 없습니다

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

.

더 많은 정보는 0 또는 1을 반환 값으로 사용하여 오류를 표시하지 않습니다. 대신 코드에 명시 적 오류 검사를 쓰지 않고 SetLength에 대한 호출이 실패하면 런타임에서 예외를 발생시킵니다.

스택을 구현하는 것으로 보이므로 Contnrs 유닛에있는 TStack 클래스를 사용할 수 있습니다. 현대 델파이에서는 대신 Generics.Collections.TStack<Integer>을 사용할 수 있습니다.

제쳐두고, C 코드가 깨졌습니다. 오류를 올바르게 처리하지 못합니다. realloc에 대한 호출이 실패하면 NULL이 리턴됩니다. 그걸 멀리 S->array에 저장 했으므로 원래 메모리 블록을 잃어버린 것이므로 누출됩니다. C 프로그래밍의 황금률 중 하나는 결코 쓸 수 없다는 것입니다 : p = realloc(p, ...).