Q&A

  • 배열의 크기를 구하려면 어떻게 해야 되나요?
배열의 크기를 구하려면 어떻게 해야 되나요?



정적 배열이구요 일차원과 이차원인경우에 말입니다.



감사합니다.

3  COMMENTS
  • Profile
    최용일 2000.02.21 12:05
    김진호 wrote:

    > 배열의 크기를 구하려면 어떻게 해야 되나요?

    >

    > 정적 배열이구요 일차원과 이차원인경우에 말입니다.

    >

    > 감사합니다.



    SizeOf 함수를 이용하면 됩니다..



    var

    TArray = array[0..MaxSize, 0..MinSize, 1..2000 ......] of integer;

    begin

    Size := SizeOf(TArray);

    end;



    단일 타입의 배열은 어떤 배열, 어떤 차원이든지 SizeOf함수를 이용하면됩니다..

    하지만 레코드 배열일때는 우리들이 추정하는크기와 다를 수도 있습니다.

    델파이가 레코드를 메모리상에 배열할 때 4바이트 단위로 배열하거든요...

    그럴때는 레크드를 packed로 선언하면 됨니다. 그럴수 없는 경우는 수작업으로

    계산해줘야 겠죠.



    에를 들면

    type

    Rec = record // 이 경우 크기는 5라고 생각되지만 메모리상의 실제크기는

    AByte: Byte; // 8이다. packed를 사용하면 실제 크기는 5가 된다.

    AInt: Integer;

    end;

    var

    TArray: Array[0..MaxXSize-1, 0..MaxYSize-1, 0..MaxZSize-1] of Rec;

    begin

    Size:= MaxXSize * MaxYSize * MaxZSize * ActualSize;

    end;



    위의 경우 Rec = packed record로 선언부를 고쳐주면 단지 SizeOf(TArray)만 사용하면

    크기를 구할 수 있다.. 물론 소스코드가 없는 외부변수들 같은 경우는 어쩔수 없이

    수 작업을 해야되겠죠...







  • Profile
    DelChobo 2000.02.20 01:54
    김진호 wrote:

    > 배열의 크기를 구하려면 어떻게 해야 되나요?

    >

    > 정적 배열이구요 일차원과 이차원인경우에 말입니다.

    >

    > 감사합니다.



    다음과 같은 Source는 어떨까요...



    Var

    MyArr : Array[1..50] of Double;

    ArrMax : Double; <--- 배열의 크기를 저장할 변수

    begin

    Case varType(MyArr[1]) of

    varBoolean : ArrMax := SizeOf(MyArr);

    varInteger,varString : ArrMax := SizeOf(MyArr)/4;

    varDouble,varCurrency : ArrMax := SizeOf(MyArr)/8;

    end;

    end



    그런데 Single/Byte형은 Double/Integer형으로 인식되는 문제점이 있습니다.

  • Profile
    김진호 2000.02.22 22:56
    DelChobo wrote:

    > 김진호 wrote:

    > > 배열의 크기를 구하려면 어떻게 해야 되나요?

    > >

    > > 정적 배열이구요 일차원과 이차원인경우에 말입니다.

    > >

    > > 감사합니다.

    >

    > 다음과 같은 Source는 어떨까요...

    >

    > Var

    > MyArr : Array[1..50] of Double;

    > ArrMax : Double; <--- 배열의 크기를 저장할 변수

    > begin

    > Case varType(MyArr[1]) of

    > varBoolean : ArrMax := SizeOf(MyArr);

    > varInteger,varString : ArrMax := SizeOf(MyArr)/4;

    > varDouble,varCurrency : ArrMax := SizeOf(MyArr)/8;

    > end;

    > end

    >

    > 그런데 Single/Byte형은 Double/Integer형으로 인식되는 문제점이 있습니다.



    질문 하신분이 저랑 동명 이시네여..



    암턴 배열의 크기를 구할방법은 간단 합니다..

    일차원의 배열인경우.. High(AAA) 하면

    AAA 의 배열의 크기를 가져 옵니다..



    배열이 이렇게 있다고 가정하고...

    1,1,1,1,1,1,1,1,1,1

    2,2,2,2,2,2,2,2,2,2

    3,3,3,3,3,3,3,3,3,3



    이차원 인경우..

    High(AAA[0]) 하면 맨 첫줄...의 갯수를 구해 옵니다..

    즉 임의의 한줄을 읽어 가져 온다는 것입니다..