Q&A

  • 정말 쉬운 질문이여서 죄송합니다.
델파이 공부하던중에...



펑션안에서 변수앞에 var를 붙여서 파라미터 값을 변경하는 예제가 이해가 안되서요..



function valueadded(v : integer) : integer;

begin

v :=5;

Result :=v;

end;



function valueAddedToRef(var v: integer) : integer;

begin

v :=5;

Result :=v;

end;



Procudure TForm1.Button1Click(Sender : TObject);

var i, j : integer;

begin

i :=10;

j :=valesAdded(i);

showmessage(IntToStr(i)+ ' '+IntToStr(j));

j :=valesAddedToRef(i);

showmessage(IntToStr(i)+ ' '+IntToStr(j));

end;



이렇게 하면 처음에는 '10 15'라는 값이 나오고



다음에는 '15 15'라는 값이 나오는데..



왜 이런걸까요? i의 주소값이 j랑 동일해 진다는 건가요?



또 한가지만요



procedure AddOne(var X,Y : integer);

begin

X := X+1;

Y := Y+1;

end;



procedure TForm1.Button1Click(Sender: TObject);

var

i : integer;

begin

i :=1;

AddOne(i,i);

Showmessage(IntToStr(i));



end;



위의 결과값은 3인데요.. 왜 3인가요? 분명히 i값이 따료 x,y에 들어갔는데...





2  COMMENTS
  • Profile
    조건일 2001.11.15 11:06
    포인터사용의 모호함이 있는 코드입니다...



    > function valueadded(v : integer) : integer;

    > begin

    > v :=5;

    > Result :=v;

    > end;

    >

    > function valueAddedToRef(var v: integer) : integer;

    > begin

    > v :=5;

    > Result :=v;

    > end;

    >

    > Procudure TForm1.Button1Click(Sender : TObject);

    > var i, j : integer;

    > begin

    > i :=10;

    > j :=valesAdded(i);

    > showmessage(IntToStr(i)+ ' '+IntToStr(j));

    > j :=valesAddedToRef(i);

    > showmessage(IntToStr(i)+ ' '+IntToStr(j));

    > end;

    >

    > 이렇게 하면 처음에는 '10 15'라는 값이 나오고

    >

    > 다음에는 '15 15'라는 값이 나오는데..

    >

    > 왜 이런걸까요? i의 주소값이 j랑 동일해 진다는 건가요?



    간단하게 C로 옮기면



    int valueadded(int v)

    {

    v = 5;

    return(v);

    }



    int valueaddedToRef(int *v)

    {

    *v = 6; // 넘겨받은 주소의 데이터저장소에 값을 넣쵸...

    return(*v);

    }



    int main()

    {

    int j, i = 10;

    j = valueadded(i);

    printf("i is %d, j is %dn", i, j);



    j = valueaddedToRef(&i); //주소를 넘겨주구... 값으로 받죠... 그렇타면 주소안의 데이터는 넘겨받은 쪽에서 주무를 수도 있다는 말이구여...

    printf("i is %d, j is %dn", i, j);

    return 0;

    }



    와 같은 말이져...

    결과는



    i is 10, j is 5

    i is 6, j is 6



    즉, 델파이에서는여...

    호출할때 넘겨주는 인자의 형태가 C랑 다를 뿐이라구 이해하시면...

    글구 사용하시다보믄 더 편하구나 감탄하시구여...



    >

    > 또 한가지만요

    >

    > procedure AddOne(var X,Y : integer);

    > begin

    > X := X+1;

    > Y := Y+1;

    > end;

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > i : integer;

    > begin

    > i :=1;

    > AddOne(i,i);

    > Showmessage(IntToStr(i));

    >

    > end;

    >

    > 위의 결과값은 3인데요.. 왜 3인가요? 분명히 i값이 따료 x,y에 들어갔는데...



    3 이 맞습니다...

    왜 3 이냐하면여...

    처음에 i := 1; 로 시작을 하구여...

    AddOne함수에서는 i의 주소를 받게 됩니다...

    그렇타면 같은 주소가 인자로 전달되는 결과이며...

    X := X+1; ==> i := i+1; // 2

    Y := Y+1; ==> i := i+1; // 3

    이라는 말씀이져...



    이것두 간단히 C코드로 옮겨보믄여,...



    void AddOne(int *x, int *y)

    {

    *x = *x + 1;

    *y = *y + 1;

    }



    int i = 1;

    AddOne(&i, &i); // 같은 주소가 넘어가는것이 겠죠...



    고로 i == 3 이 되는 것입니다...







    아~ 오랜만에 별거아닌거 정말 어렵게 설명하는 군여...

    이해가 되셨나 모르것네여... 걍 C코드루 보면 아실꺼 가타서여...

    히 즐델공~ 하셔여... 쌩~

  • Profile
    델피언 2001.11.15 17:41
    ..