2013-02-04 4 views
2

무료로 제공 할 수있는 포인터가 들어있는 레코드가 있습니다.Delphi의 레코드 열거

var 
MyStruct : FreeStruct: 
begin 
//MyStruct.Addr1 := ...; 
for i := 0 to NumberOfFieldsInRecord do begin 
    VirtualFree (ValueOfFieldNumberOfMyStruct[I],0, MEM_RELEASE); 
end; 
end; 
내가 들어

이 RTII 같은 것이하지만 난 레코드와 제대로하는 방법을 알 수없는 델파이 7

+1

왜'배열 [0..N] Pointer' 대신, 예를 들어 사용 하는가? – TLama

+0

왜냐하면 나중에 그 레코드에 더 많은 vars 또는 다른 종류의 vars가있을 수 있기 때문입니다. 또한 처리가 더 쉽기 때문에 구조체가 필요합니다. –

+2

음, 그 배열을 레코드에 넣으십시오. 즉,'type FreeStruct = record Addr : 포인터의 배열 [0..n]; {other fields} end' – ain

답변

1

Delphi-7 버전에는 Rtti 솔루션이 없습니다.

레코드 안에 포인터 배열로 @ ain의 제안을 구현하지 않으려는 경우 여기 은 variant part in the record을 사용하여 유사한 작업을 수행 할 것을 제안합니다. 코드에서 명확하게하기 위해 myStruct.AddrX 이름을 자유롭게 사용할 수 있지만 동일한 필드를 처리하려면 myStruct.allAddresses[X-1]을 사용하십시오.

Type 
    FreeStruct = 
    record   
     intExample : Integer; // not in the variant part 

     case boolean of // Variant structure where the different parts overlap in memory 
     true : (Addr1 : Pointer; 
       Addr2 : Pointer; 
       Addr3 : Pointer); 
     false : (allAddresses : array[0..2] of Pointer);   
    end; 

procedure ClearFreeStruct(var AStruct : FreeStruct); 
var 
    i: Integer; 
begin 
    for i := 0 to High(AStruct.allAddresses) do 
    begin 
    // Dispose of allocated pointers 
    end; 
end; 

더 많은 포인터를 사용하여 구조를 확장 할 수 있지만 변형 필드 앞의 다른 필드도 포함 할 수 있습니다.


명확성을 포기하지 않고 레코드 내에 포인터 배열을 사용할 수 있습니다. enumeration을 사용하면 각 포인터를 관련 이름으로 지정할 수 있습니다.

예 : myStruct.Addr [peAddr1]

Type 
    PointerEnum = (peAddr1,peAddr2,peAddr3); 

    FreeStruct = 
    record 
     intExample : Integer; 

     Addr : array[PointerEnum] of Pointer; 
    end; 

procedure ClearFreeStruct(var AStruct : FreeStruct); 
var 
    pe : PointerEnum; 
begin 
    for pe := Low(PointerEnum) to High(PointerEnum) do 
    begin 
    // Dispose(AStruct.Addr[pe]); 
    end; 
end; 
+0

고마워요!이것은 잘 작동합니다. 내가 예상했던 것보다 조금 더 복잡하지만 작동한다. –

+1

벤자민, 구조체 필드 이름을 가정하면 포인터 배열을 사용하지 않는 것이 맞을 것이라고 생각합니까? 이 경우 간단하고 똑같은 대체 솔루션을 게시 할 수 있습니다. –

+0

두 번째 수정 사항이 더 명확합니다. 배열을 열거하는 것은 정말 쉬운 방법입니다 (?!). 방금 구조체에 새로운 것을 추가하기 때문에 너무 많은 코드를 작성하지 않고 같은 함수를 반복해서 호출하는 솔루션을 원했습니다. –

2
:

type 
FreeStruct = record 
Addr1 : Pointer; 
Addr2 : Pointer; 
Addr3 : Pointer; 
// .... 
end; 

그래서 내가 좋아하는 일을하고 싶습니다

필자는 레코드 필드 반복을 지원할 방법이 없음을 알고 있습니다. 그러나 낮은 레벨 기준으로 레코드 구조와 함께 플레이 할 수 있습니다 (여기를보십시오 : http://www.delphigroups.info/2/18/295611.html)

아마도 포인터 저장을위한 레코드가 필요하지 않으므로 코드를 재구성하는 것이 좋습니다.

+0

난 그냥 필드의 개수를 포함하고 다음 4 바이트마다 계산하는 정수와 함께 첫 번째 필드를 추가 끝낼 수도 있습니다. –

+3

레코드 필드 반복을위한 Rtti는 Delphi-2010에서 왔습니다. –