Q&A

  • DLL의 함수에서 인자의 위치에 따라 값이 이상하
DLL에 아래와 같은 함수가 있습니다..



function GetCpk10(data: Pointer; std: double): double;



외부 프로그램에서

GetCpk10(data, 18.05);

이렇게 사용하니 DLL 내부의 위 함수내에서 std값을 확인해 보니 쓰레기 값이 들어가더군요...



그런데 함수를 아래처럼 바꾸어 사용하면 제대로 돌아갑니다..

function GetCpk10(std: double; data: Pointer): double;

원인이 뭘까요??





data는 동적배열로 제대로 들어갑니다...

그리고 DLL로 하지 않았을 때는 이상없이 잘 됩니다.





아래와 같이 사용했습니다..



procedure TForm1.Button5Click(Sender: TObject);

var

data: array of double;

tmp: double;

begin

SetLength(data, 10);

data[0] := 18.14;

data[1] := 18.07;

data[2] := 18.16;

data[3] := 17.92;

data[4] := 18.13;

data[5] := 17.94;

data[6] := 18.04;

data[7] := 18.14;

data[8] := 17.89;

data[9] := 18.12;





tmp := GetCpk10(data, 18.50);

ShowMessage('cpk:' + FloatToStr(tmp));



SetLength(data, 0);

end;





-------------------------DLL----------------------------------------

function GetCpk10(data: Pointer; std: double): double;

type

Ptr = array of double;

var

tmp: Ptr;

diff, k: double;

begin

tmp := data;

std := RoundValue(std);

diff := GetAvg(tmp) - std;

if diff < 0 then

diff := -diff;



k := RoundValue(diff/1);

result := RoundValue((1-k)*GetCp10(tmp));

end;



1  COMMENTS
  • Profile
    정근 2000.10.21 09:22
    stdcall을 빼먹었군요..

    function GetCpk10(data: Pointer; std: double): double; stdcall;





    이정근 wrote:

    > DLL에 아래와 같은 함수가 있습니다..

    >

    > function GetCpk10(data: Pointer; std: double): double;

    >

    > 외부 프로그램에서

    > GetCpk10(data, 18.05);

    > 이렇게 사용하니 DLL 내부의 위 함수내에서 std값을 확인해 보니 쓰레기 값이 들어가더군요...

    >

    > 그런데 함수를 아래처럼 바꾸어 사용하면 제대로 돌아갑니다..

    > function GetCpk10(std: double; data: Pointer): double;

    > 원인이 뭘까요??

    >

    >

    > data는 동적배열로 제대로 들어갑니다...

    > 그리고 DLL로 하지 않았을 때는 이상없이 잘 됩니다.

    >

    >

    > 아래와 같이 사용했습니다..

    >

    > procedure TForm1.Button5Click(Sender: TObject);

    > var

    > data: array of double;

    > tmp: double;

    > begin

    > SetLength(data, 10);

    > data[0] := 18.14;

    > data[1] := 18.07;

    > data[2] := 18.16;

    > data[3] := 17.92;

    > data[4] := 18.13;

    > data[5] := 17.94;

    > data[6] := 18.04;

    > data[7] := 18.14;

    > data[8] := 17.89;

    > data[9] := 18.12;

    >

    >

    > tmp := GetCpk10(data, 18.50);

    > ShowMessage('cpk:' + FloatToStr(tmp));

    >

    > SetLength(data, 0);

    > end;

    >

    >

    > -------------------------DLL----------------------------------------

    > function GetCpk10(data: Pointer; std: double): double;

    > type

    > Ptr = array of double;

    > var

    > tmp: Ptr;

    > diff, k: double;

    > begin

    > tmp := data;

    > std := RoundValue(std);

    > diff := GetAvg(tmp) - std;

    > if diff < 0 then

    > diff := -diff;

    >

    > k := RoundValue(diff/1);

    > result := RoundValue((1-k)*GetCp10(tmp));

    > end;

    >