Q&A

  • C에서 double* value는 어떤식으로...?
안녕하세요.

activeX component를 사용하다가 잘 모르는 것이 있어서요~

보통 C에서 함수의 인자에 배열을 넘길때는 이런 식으로 하잖아요~

void functionName(double* arg1)

activeX에 위와 같은 method가 있는데 델파이에 install시켜서 사용하면

procedure ProcedureName(var arg1 : double);

처럼 나오더라구요

이렇게 되어 있을때 함수에 어떤식으로 배열 인자를 전달해야 되나요?

예를 들어서...

procedure test1;

var

temp : array [0..2] of double;

begin

ProcedureName(temp);

end;

이런식으로 했더니 에러가 나더군요.



그래서, ProcedureName(temp[0]); 로 하면 에러는 안나는데...

제대로된 실행 결과가 나오지 않는 것 같아서요.

이번기회에 확실히 알고 싶기도 하고요.

답변 부탁드립니다.

3  COMMENTS
  • Profile
    도지성 2001.02.15 18:32
    srookie wrote:

    > 안녕하세요.

    > activeX component를 사용하다가 잘 모르는 것이 있어서요~

    > 보통 C에서 함수의 인자에 배열을 넘길때는 이런 식으로 하잖아요~

    > void functionName(double* arg1)

    > activeX에 위와 같은 method가 있는데 델파이에 install시켜서 사용하면

    > procedure ProcedureName(var arg1 : double);

    > 처럼 나오더라구요

    > 이렇게 되어 있을때 함수에 어떤식으로 배열 인자를 전달해야 되나요?

    > 예를 들어서...

    > procedure test1;

    > var

    > temp : array [0..2] of double;

    > begin

    > ProcedureName(temp);

    > end;

    > 이런식으로 했더니 에러가 나더군요.

    >

    > 그래서, ProcedureName(temp[0]); 로 하면 에러는 안나는데...

    > 제대로된 실행 결과가 나오지 않는 것 같아서요.

    > 이번기회에 확실히 알고 싶기도 하고요.

    > 답변 부탁드립니다.



    Object pascal 의 open array 를 사용해 보세요.

    아래와 같은 코드를 넣으면 배열을 바로 넘겨 줄 수 있습니다.

    참고로 Low() 와 High() 는 이때 배열 첨자의 제일

    처음과 끝을 알려 줍니다..



    procedure ProcedureName(var arg1 : array of double);

    var

    i : Integer;

    begin

    for i := Low( arg1 ) to High( arg1 ) do begin

    ShowMessage( FloatToStr(arg1[i]) );

    end;

    end;





    procedure TForm1.Button1Click(Sender: TObject);

    var

    temp : array [0..2] of double;

    begin

    temp[0] := 1.1;

    temp[1] := 1.2;

    temp[2] := 1.3;

    ProcedureName(temp);

    end;





  • Profile
    srookie 2001.02.15 18:49
    답변 감사합니다.

    하지만 제가 질문을 잘못해서 그런지... 제가 의도했던 질문에 대한 답변이 아니군요.

    그래서 다시 질문 드립니다.

    제 질문은 이거죠.

    ActiveX control을 import했는데 그 중의 method가 function ProceName(var arg1: double):HRESULT; 처럼 되어 있다는거죠.

    메뉴얼에는 HRESULT ProceName(double* arg1) 이런 식으로 정의 되어 있구요.

    이 함수는 고정되어 있는 것이라 제가 고치지 못합니다. COM의 Method라서염...

    이런 상황에서 제가 어떤식으로 인자를 넘기는 것이 옳은 것인지를 알고 싶어서 질문드린것입니다.

    예를 들어서,

    procedure Temp;

    var

    fTemp : array [0..2] of double;

    begin

    ProceName(fTemp[0]);

    end;

    이것이 정말 옳은 것인지..

    아님 어떤 방법이 옳은 것인지 알고 싶군요.

  • Profile
    도지성 2001.02.15 22:38


    > ActiveX control을 import했는데 그 중의 method가 function ProceName(var arg1: double):HRESULT; 처럼 되어 있다는거죠.

    > 메뉴얼에는 HRESULT ProceName(double* arg1) 이런 식으로 정의 되어 있구요.



    > procedure Temp;

    > var

    > fTemp : array [0..2] of double;

    > begin

    > ProceName(fTemp[0]);

    > end;

    > 이것이 정말 옳은 것인지..

    > 아님 어떤 방법이 옳은 것인지 알고 싶군요.



    ProceName(fTemp[0]);



    에서 파라메터가 var 로 선언되면 무조건 내부적으로는

    포인터로 넘어갑니다.. 그래서 문제가 없어야 하는데요...



    ( Direct X 등의 COM 기반의 헤더들도 interface 부분에서

    모두 이런식의 var 로 포인터를 받습니다.

    만약 C 로 작성된 COM 을 직접 헤더로 컨버팅 했다면

    HRESULT; 뒤에다가 stdcall; 이 빠지지 않았나 생각

    되는데요.. ( 델파이는 fastcall 이 디폴트니까.. ) )



    일단 제가 볼 때는 아무런 문제가 없어 보입니다.

    그래도 이상이 있을때는 고수님들이 이 글을 볼 때가지

    기다리는 수 밖에요...