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을 델파이로 변환
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을 델파이로 변환
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, ...)
.
어떤 부분에서 문제가 있습니까? C의'realloc'에 대한 문서를 읽었습니까? 그리고 나머지 프로그램에서 사용하고있는 델파이 메모리 관리 함수와 비교 했습니까? 남은 건 뭐야? –