Q&A

  • 동적배열을 리턴값으로?
동적배열을 리턴값으로 넘길 생각을 해보았습니다.



var

test : array of Char;

i : integer;

p : pointer;

begin

setlength(test, 4)

for i:=0 to 3 do

test[i] := 'a';

p := @test;

Result := p;

end;



pointer를 return하고서 다시 동적배열을 만들어 리턴받은 주소값을 할당하거나아예 포인터로 값을 받으려던 참이었죠. 그런데 디버깅하면서 값을 보니까 끝에

'end;' 하면서 test 에 들어갔던 'aaaa' 가 사삭~ 없어지데요? 동시에 포인터값

p 도 free 되더군요. 원래 그런가보죠? 안사라지게 할 방법은 없을까요?

동적배열을 리턴값으로 할 수는 없을까요? 가능하다면 그렇게 했을 경우에 동적

배열을 리턴받는 부분은 어떻게 만들 수 있을까요?





4  COMMENTS
  • Profile
    구창민 1999.08.31 18:51
    좋은 아침입니다.

    아래 형태의 함수를 말씀하신 건가요?

    동적배열이라는 말이 말이 동적배열이지 결국 할당된 메모리 영역의

    시작주소겠지요.

    결국 주소를 리턴받으려는 것이 아닌지요?



    function NewMem : Pointer;

    var

    P : Pointer;

    begin

    GetMem(P, 10);

    StrCopy(P, 'aaaaaaaaaa');

    Result := P;

    end;



    그럼..



    Lyle 께서 말씀하시기를...

    > 동적배열을 리턴값으로 넘길 생각을 해보았습니다.

    >

    > var

    > test : array of Char;

    > i : integer;

    > p : pointer;

    > begin

    > setlength(test, 4)

    > for i:=0 to 3 do

    > test[i] := 'a';

    > p := @test;

    > Result := p;

    > end;

    >

    > pointer를 return하고서 다시 동적배열을 만들어 리턴받은 주소값을 할당하거나아예 포인터로 값을 받으려던 참이었죠. 그런데 디버깅하면서 값을 보니까 끝에

    > 'end;' 하면서 test 에 들어갔던 'aaaa' 가 사삭~ 없어지데요? 동시에 포인터값

    > p 도 free 되더군요. 원래 그런가보죠? 안사라지게 할 방법은 없을까요?

    > 동적배열을 리턴값으로 할 수는 없을까요? 가능하다면 그렇게 했을 경우에 동적

    > 배열을 리턴받는 부분은 어떻게 만들 수 있을까요?

    >

    >





  • Profile
    Lyle 1999.08.31 20:22
    구창민 께서 말씀하시기를...

    > 좋은 아침입니다.

    > 아래 형태의 함수를 말씀하신 건가요?

    > 동적배열이라는 말이 말이 동적배열이지 결국 할당된 메모리 영역의

    > 시작주소겠지요.

    > 결국 주소를 리턴받으려는 것이 아닌지요?

    >

    > function NewMem : Pointer;

    > var

    > P : Pointer;

    > begin

    > GetMem(P, 10);

    > StrCopy(P, 'aaaaaaaaaa');

    > Result := P;

    > end;

    >

    > 그럼..

    >

    계속 참고할 수 있는 말씀을 주셔서 고맙습니다.

    그런데 제가 동적배열을 사용해서 리턴하려한데는 뭔가 목적이 있었겠죠?

    그걸 단순화시켜서 질문을 드려야 답해주는 분들도 편하게 볼 수 있기때문에

    아래같이 소스를 만든 것이고, 여튼 포인터를 사용해서 리턴하는 것은 아니에요

    그리고 저도 동적 배열이라면 포인터 변수에다가 메모리를 할당해주는 식으로,

    배열의 인덱스를 포인터의 변수형(char, integer, etc)등등의 바이트 사이즈로

    매핑해서 사용할 수 있게 만든 것이 아닐까하는데서 동적배열을 리턴값으로

    넘겨 사용할 생각을 했었지요. 그런데 블럭을 벗어났을 때 free 되는 것으로

    봐서는 그게 아닌가봅니다.



  • Profile
    구창민 1999.08.31 20:53
    Lyle님이 질문하신 내용을 다시 한번 정독해보세요.

    "포인터로 값을 받으려던 참이었죠.."라는 질문을 하셨죠?

    컴파일러는 내부적인 연산을 모두 주소를 참조해 연산해 갑니다.

    그래서 제가 답변을 드렷구요.

    그런데 지금 Lyle님은 엉뚱한 말씀을 하고 계시는 군요.

    블럭을 벋어났을때 지역변수의 값이 해제되는 것은 당연한

    결과가 아닙니까?

    Lyle님이 작성해서 문제점을 올린 소스를 보세요.

    한마디로 말이 안되는 소스이지 않나요?

    test라는 변수는 지역변수이므로 생존범위는

    함수내에서 입니다.

    돌려준건 test의 주소고 결국은 주소를 리턴했으며,

    그 가르키고 있는 주소를 찾아갔을때, 주소의 메모리 영역이

    남아 있을까요?

    제가 올려드린 강좌를 이미 보셧다구 하셨는데 전혀 그렇지

    않는 거 같네요.

    말이 길어졌는데, 다시 한번 잘 생각해 보세요.

    그럼..

    =======Lyle님이 질문하신 부분========================

    동적배열을 리턴값으로 넘길 생각을 해보았습니다.



    var

    test : array of Char;

    i : integer;

    p : pointer;

    begin

    setlength(test, 4)

    for i:=0 to 3 do

    test[i] := 'a';

    p := @test;

    Result := p;

    end;



    pointer를 return하고서 다시 동적배열을 만들어 리턴받은 주소값을 할당하거나아예 포인터로 값을 받으려던 참이었죠. 그런데 디버깅하면서 값을 보니까 끝에

    'end;' 하면서 test 에 들어갔던 'aaaa' 가 사삭~ 없어지데요? 동시에 포인터값

    p 도 free 되더군요. 원래 그런가보죠? 안사라지게 할 방법은 없을까요?

    동적배열을 리턴값으로 할 수는 없을까요? 가능하다면 그렇게 했을 경우에 동적

    배열을 리턴받는 부분은 어떻게 만들 수 있을까요?

    ================================================================









    Lyle 께서 말씀하시기를...

    > 구창민 께서 말씀하시기를...

    > > 좋은 아침입니다.

    > > 아래 형태의 함수를 말씀하신 건가요?

    > > 동적배열이라는 말이 말이 동적배열이지 결국 할당된 메모리 영역의

    > > 시작주소겠지요.

    > > 결국 주소를 리턴받으려는 것이 아닌지요?

    > >

    > > function NewMem : Pointer;

    > > var

    > > P : Pointer;

    > > begin

    > > GetMem(P, 10);

    > > StrCopy(P, 'aaaaaaaaaa');

    > > Result := P;

    > > end;

    > >

    > > 그럼..

    > >

    > 계속 참고할 수 있는 말씀을 주셔서 고맙습니다.

    > 그런데 제가 동적배열을 사용해서 리턴하려한데는 뭔가 목적이 있었겠죠?

    > 그걸 단순화시켜서 질문을 드려야 답해주는 분들도 편하게 볼 수 있기때문에

    > 아래같이 소스를 만든 것이고, 여튼 포인터를 사용해서 리턴하는 것은 아니에요

    > 그리고 저도 동적 배열이라면 포인터 변수에다가 메모리를 할당해주는 식으로,

    > 배열의 인덱스를 포인터의 변수형(char, integer, etc)등등의 바이트 사이즈로

    > 매핑해서 사용할 수 있게 만든 것이 아닐까하는데서 동적배열을 리턴값으로

    > 넘겨 사용할 생각을 했었지요. 그런데 블럭을 벗어났을 때 free 되는 것으로

    > 봐서는 그게 아닌가봅니다.

    >





  • Profile
    Lyle 1999.08.31 21:23
    구창민 께서 말씀하시기를...

    > Lyle님이 질문하신 내용을 다시 한번 정독해보세요.

    > "포인터로 값을 받으려던 참이었죠.."라는 질문을 하셨죠?

    > 컴파일러는 내부적인 연산을 모두 주소를 참조해 연산해 갑니다.

    > 그래서 제가 답변을 드렷구요.

    동적 배열의 첫번째 주소값을 리턴하겠다는 의미입니다.제가 질문을 잘못해서 오해하셨고 그래서 그렇게 답변하신 것으로 이미 알고있습니다.



    > 그런데 지금 Lyle님은 엉뚱한 말씀을 하고 계시는 군요.

    > 블럭을 벋어났을때 지역변수의 값이 해제되는 것은 당연한

    > 결과가 아닙니까?

    제가 이야기하려 한 것은 '블럭밖에서 블럭 안의 변수가 해제된다'는 문제가 아니고 동적배열의 동작이 마치 포인터같길래 동적배열의 주소값을 리턴해서 동적

    배열에 할당하여 리턴값을 사용할 수 있겠다 싶었으나 리턴한 후에 프리되어

    일단 소용게 된다는 것입니다. 혹시 어떤 방법으로 동적배열의 메모리 주소를 리턴할 수 있는가 하는 것을 여쭤본 것이죠.



    > Lyle님이 작성해서 문제점을 올린 소스를 보세요.

    > 한마디로 말이 안되는 소스이지 않나요?



    > 제가 올려드린 강좌를 이미 보셧다구 하셨는데 전혀 그렇지

    > 않는 거 같네요.

    네, 제가 질문을 잘못했으니 이해를 다르게 하셨겠죠. 말이 안된다고 하셔도

    할 말이 없습니다. 이제 정확한 제 질문의 의미를 충분히 밝힌 듯하니 누군가

    질문에 대답해주면 고맙겠습니다.



    ps. 본의아니게 분위기 흐리는 말을 제가 유도하게 되었습니다. 구창민님과

    이곳 게시판을 사용하는 분들께 사과드립니다.