Q&A

  • delphi에서 dos C 처럼 swap 함수를 사용하려면요?
안녕하세요.

   C에서 사용했던 함수 swap문을 함수로 만들려고 합니다.

    델파이에서는 어떻게 하나요.  포인터로 값을 넘겼는데,

   함수 내에서는 바뀌어 지는 데  나와서는 그래도가 되어 버리네요.

public
    stra, strb : string;
    pstra, pastr : pointer;   //여기서도 ^string 포인터를 잡으니깐요
                                    // 함수에서는 ^String 포인터가 되지 않더라구요.
......

pstra := @stra;
pstrb := @strb;
인자를 넘길때 는

swap(pstra,pstrb);   //포인터로 넘겼습니다.


procedure swap(str1,str2 : pointer);
var
   temp : pointer
begin
   temp := str1;
   str1 := str2;
   str2 := temp;

  //내부에서는 포인터값이 바뀌었는데,
// swap만 빠져나가면 돌아와버리네요.   주소가 바꾸려면 어떻게 하나요?
end;


평안한 시간되세요.
5  COMMENTS
  • Profile
    김길현 2004.04.14 07:45
    안녕하세요.

      질문했던 사람인데요.  

      답변들 모두 감사드립니다.

      그런데 답변주신분 중에 틀린 것이 있어 수정하려고 합니다.

       @ 가 포인터 변수에 주소값을 넘기는 것입니다.   ^을 변수 되에 붙이게

       되면 값을 넘겨주게 됩니다.


        아참 그리고 var 붙이는 부분에서는 없어도 되고 있어도 되더군요.


        그리고 swap문 을 풀려고 생각하다보니 이렇게 생각이 들더군요.

        델파이에서는 swap문이 필요없는것이 아닌가?   전역변수로 선언할 시

        간단하게 temp변수를 두어서 교환 하게 되고,  그리고   어떤 이벤트가

         발생했을 시 그 변수의 값을  주소를 가지고 있는다 할들 이벤트가 끝나

        버리면 변수주소는 쓸모 없는 것이 되어 버린다는 결론입니다.

       그래서 지역 변수값은 함수나 프로시져로 돌려서 그값을 가져가면 된다.

       C와 값이    Call by Reference  나 Call by Pointer 로  swap 문을

      구성할 필요성이 없는듯합니다.

       저의 생각이 무언가 잘못인는 듯 한데....

       이상하점을 찾아서 좀 가르쳐 주세요.  

    평안한 하루되세요.

  • Profile
    너구리 2004.04.14 19:24
    아 먼저 죄송합니다.

    님 말씀이 맞습니다. 제가 헷갈렸네요..

    @ 이게 주소가 맞네요..

    그리고 var은 C언어에서도 있었던거 같았는데

    call by value 와 call by reference 이건가요??

    var 이면 call by reference 입니다.

    주소를 이용 하는거지요..

    포인터를 넘기면

    a 라는 변수의 포인터 a1과 이것은 포인터 a2가 있으면

    procedure swap(var a1 : pointer);;

    저렇게 쓴다면 프로시져 내부에서는 a1의 포인터 a2로 이용하는 거죠...??

    결과 적으로 a1^ 값이나 a2^ 값은 모두 같습니다.

    하지만 이런점은 염두해 두고 넘어가야 할거 같습니다.

    a1 과 a2는 엄연히 다른 놈이죠..

    a1의 값은 a의 주소이고 a2는 a1의 주소입니다..

    procedure swap(var a1:string);
    begin
      a1 := '가나다';
    end;

    procedure swap(var a1:pointer);
    begin
      a1^ := '가나다';
    end;

    이렇게 쓰는 차이점이 있습니다.

    그리고 위의 프로시져라면 var은 필요 없네요..

    그리고 포인터는 반드시 쓸때가 있습니다.

    전체적인 프로그램 구조를 봐야 얘기 할수 있겠지만..

    저같은 경우엔 두개의 스레드가 하나의 StringList를 사용하는데

    스레드 생성시 인자로 저 StringList의 포인터를 가지고 있어야만 했습니다.

    방법은 그때그때 상황에 맞게 선택 해야 겠죠..



  • Profile
    이중철 2004.04.14 02:48
    procedure TForm1.BitBtn1Click(Sender: TObject);
      Procedure Swap(var s, t);
      var p : pointer;
      begin
        p := Pointer(s);
        pointer(s) := pointer(t);
        Pointer(t) := p;
      end;
    var
      stra, strb : string;
    begin
      stra := '아름다운 세상';
      strb := '더러운 세상';
      Swap(stra, strb);
      caption := strb;
    end;

    이런식으로 해보세요

    Output은 "아름다운 세상" 이 나옵니다. 그럼...



  • Profile
    한원희 2004.04.13 23:55
    안녕하세요. 한원희입니다.

    실제 값을 바꿀 경우에 델파이에서 var 를 앞에 붙이면 됩니다.

    procedure swap(var str1,str2 : pointer);
    var
       temp : pointer
    begin
       temp := str1;
       str1 := str2;
       str2 := temp;
    end;

    그럼, 즐프~

  • Profile
    너구리 2004.04.13 23:36
    아 잘못 넘기신거 같은데요..

    약간 오해를 하신듯 합니다.

    pstra := @stra;

    위문장은 stra의 값을 넘겨주는 거구요..

    이렇게 바껴야 할거 같아요..

    pstra := ^stra;

    그런데 처음 문장이 에러가 안나던가요??

    포인터에 스트링을 넘겨주면 에러 안나나??

    암튼 '^'은 포인터구요..'@'은 값입니다.

    @pstra 이렇게 하면 stra값으로 접근합니다.

    • ybkim
    • 2004.04.14 19:19
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박민수
    • 2004.04.14 19:18
    • 2 COMMENTS
    • /
    • 0 LIKES
    • [勳]후니
      2004.04.14 19:39
      지금 프로젝트 개발하면서 DBISAM을 사용하고 있습니다. 팀장님이 좋다고 해서 사용하고 있지만 많은 아...
    • 박민수
      2004.04.14 21:24
      저희가 개발할 것은 로컬에서만 돌아가는 것이므로 서버나 그런 기능들은 사실 필요가 없거든요. 아폴로에 ...
    • 최은석
    • 2004.04.14 17:55
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 너구리
      2004.04.14 19:44
      무슨 말씀이신지 잘 모르겠네요.. 서버에서 조회하면?? 로컬에서 조회 하면?? 한글 문제는 캐릭터셋 ...
    • 델초보
      2005.04.06 03:57
      냉무
    • 박수영
      2004.04.14 17:49
      우선 두개의 테이블을 조인부터 해야 것죠... select a.Date, a.MainCode, b.TotalData from Mai...
    • 허 강
    • 2004.04.14 07:08
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 박수영
      2004.04.14 17:52
      그냥 봐서는 문제가 없는 듯 한디....혹시 숫자가 아니구 문자인가요??? 만약 그렇다면 해당 조...
    • 데미안
    • 2004.04.14 06:27
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 너구리
      2004.04.14 18:53
      실행까지는 가능한데.. 외부에서 제어하도록 지원해 주지 않으면 하기 힘들겁니다. 아이다 아예 할수...
    • ybkim
    • 2004.04.14 02:55
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박태선
    • 2004.04.14 01:25
    • 1 COMMENTS
    • /
    • 0 LIKES
    • [ROOKIE]
      2004.04.14 05:20
      NT 계열에서 프린터 상태를 체크해 볼 수 있는 방법이 있나 오랫동안 찾아 봤지만 아직은 찾지 못했네요. ...
    • 김만수
    • 2004.04.14 00:59
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이중철
      2004.04.14 03:11
      실제 실행속도가 그러한 결과를 보이는 것 인가요 경험상 그렇지 않다고 보입니다. AsyncPro 어떤 컴퍼넌...
    • 김만수
      2004.04.14 17:18
      CPU 펜티엄 2.0기가 메모리 512에서는 VB-MSCOMM으로 된것은 30초 DELPHI-ASYNCPRO로 된것은 25초 오히려...
    • 류상민
    • 2004.04.14 00:35
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김길현
    • 2004.04.13 22:50
    • 5 COMMENTS
    • /
    • 6 LIKES
    • 김길현
      2004.04.14 07:45
      안녕하세요.   질문했던 사람인데요.     답변들 모두 감사드립니다....
    • 너구리
      2004.04.14 19:24
      아 먼저 죄송합니다. 님 말씀이 맞습니다. 제가 헷갈렸네요.. @ 이게 주소가 맞네요.. 그리고 var...
    • 이중철
      2004.04.14 02:48
      procedure TForm1.BitBtn1Click(Sender: TObject);   Procedure Swap(var s, t);   ...
    • 한원희
      2004.04.13 23:55
      안녕하세요. 한원희입니다. 실제 값을 바꿀 경우에 델파이에서 var 를 앞에 붙이면 됩니다. procedur...
    • 너구리
      2004.04.13 23:36
      아 잘못 넘기신거 같은데요.. 약간 오해를 하신듯 합니다. pstra := @stra; 위문장은 stra의 값을...
    • 양구주
    • 2004.04.13 20:58
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 너구리
      2004.04.14 01:48
      팁게시판에 보면 이종간 어플리케이션 이벤트 던지기?? 암튼 이런 제목으로 첫페이지에 올라온게 있네요...
    • 바람
      2004.04.13 19:20
      음,.. 이벤트를 던진다는게 아떤 의민지.... 암튼 던지고 받는 각각의 윈도우가 있을 때 받은쪽...
    • 박근호
    • 2004.04.13 06:04
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 너구리
      2004.04.13 23:38
      의도데로 하시려면 콘솔용 프로그램을 만들어야 하는걸로 알고 있습니다. 프로젝트 - 뉴 에 보시면 ...
    • 하얀까마귀
      2004.04.13 09:52
      안녕하세요 하얀까마귀 입니다. 무슨 말씀이신지 정확히는 모르겠네요.. 파일명.exe <-- 이게 제...
    • help me
    • 2004.04.13 05:19
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2004.04.13 10:31
      안녕하세요 하얀까마귀 입니다. TTime 은 TDateTime 형이구요 이건 Double 형식 입니다. double 의 ...
    • 바람
      2004.04.13 19:05
      앞에 하얀까마귀님이 설명하였듯이 TDateTIme형은 더블형식이고 정수부분은 날자를 나타냅니다. ...
    • 곰다방~미스김
      2004.04.13 07:28
      jpg나 bmp로 검색해보세요...있습니다. 원하시는게 하드에 저장하는게 아니구 메모리에 올려서 이미지 처...
    • sarang프돌
      2004.04.13 08:43
      답변 감사드립니다. 저도 글 올리기전에 몇번 검색을 해보았는데, 제가 원하는 방식이 아닌듯 하여 ...
    • 하얀까마귀
      2004.04.13 05:11
      안녕하세요 하얀까마귀 입니다. 불가능합니다. ㅎㅎㅎ 어떻게 다운을 받지 않은상태에서 이미지를 볼...
    • sarang프돌
      2004.04.13 05:48
      답변 감사드립니다. 구럼..디비에 이미지파일 자체를 저장한다면.. 제가 말한 1,2번이 가능한가요. ...
    • 하얀까마귀
      2004.04.13 09:46
      안녕하세요 하얀까마귀 입니다. DB 에 파일을 저장한다면 당연히 1번과 2번 모두 가능합니다. 문제는...
    • sarang프돌
      2004.04.13 18:07
      님의 답변 너무 감사드립니다. 많은 도움이 될듯 하네요. 감사합니다.
    • 박동호
    • 2004.04.13 02:17
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 장태원
      2004.04.13 02:41
      민감한거 맞습니다. 민감함을 없애기 위해서 프로그램 제작시 많은 테스트를 거쳐야 하죠. 하지만 개...
    • 장태원
      2004.04.13 02:45
      델파이 버젼이 안맞은거 같군요. DsgnIntf 파일은 아마..델파이 5이하 버젼업하면서 바뀐거 같던데.. ...