Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 팁&트릭
Delphi Programming Tip&Tricks
[245] Dynamic Array 초기화의 주의점...
DrK [whitekid] 12754 읽음    2008-05-15 11:53
작업하다가 DynamicArray를 사용할 때 생겼던 일이지요..

var
  DynamicArray: Array of Integer;
begin
  SetLength(DynamicArray, 100);
  FillChar(DynamicArray, SizeOf(DynamicArray), 0);
  bla bla.....
  DynamicArray := 1234;
end;

이렇게 하고 실행했는데 Range check error 흠냠.. 이게 뭔가... 혹시하고 다음의 코드로 봤더니

var
  DynamicArray: Array of Integer;
  StaticArray: Array [0..99] of Integer;
begin
  SetLength(DynamicArray, 100);
  TraceFmt('Dynamic: %p, %p', [@DynamicArray, @DynamicArray[0]]);
  TraceFmt('Static: %p, %p', [@StaticArray, @StaticArray[0]]);

결과:
Debug Output: "Dynamic: 0012F50C, 01093368" Process Tests.exe (2584)
Debug Output: "Static: 0012F37C, 0012F37C" Process Tests.exe (2584)

음 DynamicArray와 StaticArray의 구조가 다릅니다. Static array는 상상하는데로 그렇게 바로 그 위치에 있는데.. DynamicArray는 배열 변수의 포인터와 배열이 데이터가 시작하는 변수의 포인터가 다름니다. 이걸보니 이해가되네요.. DynamicArray 변수는 배열의 포인터이고 실제 데이터는 데이터 크기 잡아줄때 그때 만들어서 설정해주는 것이다. 그런식으로 이해가 되는군요. 그러니 당연히 FillChar(DynamicArray, SizeOf(DynamicArray), 0)이 엉뚱한 결과를 가져오게 되는것이겠지요.

근데 또 재밌는 현상은 Dynamic array를 var 파라미터로 넘겨줄때(call by reference)는 static array와 동일하게 넘어갑니다. 그래서 위의 성질을 이용해서 생각했던 다음과 같은 함수는 정상적으로 작동하지 않습니다.

  function IsDynamicArray(var Ary: Array of Integer): Boolean;
  begin
    Result := @Ary <> @Ary[0];
  end;

이미 파라미터로 넘어오는 순간 @ary = @ary[0] 이되어 static array 처럼 됩니다.

그 럼 원 문제로 넘어가서 변수를 선언하고 바로 초기화하는데 dynamic array는 어떻게 하고 static array는 어떻게하고.. 이거 참 귀찮아서 파라미터로 넘어갈 때의 성질을 이용하면 다음과 같은 배열 초기화 함수를 만들 수 있겠네요.

  procedure InitArray(var Ary: Array of Integer);
  begin
    FillChar(Ary, SizeOf(Ary), 0);
  end;

내용은 똑같지만 함수 호출 과정에서 static array 처럼 @ary = @ary[0]이 되어서 실제 데이터를 초기화 하게 됩니다.

근데 쓰고보니 너무 기초적인 내용을 몰랐던가 하는 생각이 드네요.. :D
Lyn [tohnokanna]   2008-05-19 12:00 X
흠.. C++ 입장에서 보면 당연한거 같긴 하네요.

포인터 변수 자체의 주소값과, 포인터변수가 가르키고 있는 주소값은 다른...


근데 델로보니 순간 헤깔리는군요 =_=;

+ -

관련 글 리스트
245 Dynamic Array 초기화의 주의점... DrK 12754 2008/05/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.