함수에서 동적 배열과 정적 배열을 파라미터로 넘기는 방법


unit uMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }

    // 정적 배열형 선언
    type
      TArrVal = array[0..9] of Integer;
    function StaticSum(ArrVal: TArrVal): Integer;
    // 동적 배열형 선언
    type
      TDynArrVal = array of Integer;
    function DynamicSum(DynArr: TDynArrVal): Integer;

  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

procedure TForm2.Button1Click(Sender: TObject);
var
  ArrTestVal : TArrVal;
  i : integer;
begin
  for i := 1 to 10 do
    ArrTestVal[i - 1] := i;

  // 정적 배열 파라미터 함수 호출
  Button1.Caption := IntToStr(StaticSum(ArrTestVal));
end;

// 정적 배열 파라미터 함수
function TForm2.StaticSum(ArrVal: TArrVal): Integer;
var
  i : integer;
  iSum : integer;
begin
  iSum := 0;

  for i := Low(ArrVal) to High(ArrVal) do
    iSum := iSum + ArrVal[i];

  Result := iSum;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
  DynArrTest : TDynArrVal;
  i : integer;
begin
  // 동적 배열 크기설정
  SetLength(DynArrTest, 10);

  for i := Low(DynArrTest) to High(DynArrTest) do
    DynArrTest[i] := i + 1;

  // 동적 배열 파라미터 함수 호출
  Button2.Caption := IntToStr(DynamicSum(DynArrTest));
end;

// 동적 배열 파라미터 변수
function TForm2.DynamicSum(DynArr: TDynArrVal): Integer;
var
  i : integer;
  iSum : integer;
begin
  iSum := 0;

  for i := Low(DynArr) to High(DynArr) do
    iSum := iSum + DynArr[i];

  Result := iSum;
end;

end.


 위 예제를 보면 특별히 설명이 필요없을 것같다.

Posted by 띠리

함수의 고무줄 파리미터 초간단 예제


#include <stdio.h>
#include <stdarg.h>

void testit ( int i, ...)
{
    va_list argptr;
    int  n;

    // 가변 인수 수의 초기화
    va_start(argptr, i);

    if ( i == 5 ) {
     
        for(int j = 0; j < i; j++)
        {
            // 다음 인수 얻기
            n = va_arg( argptr, int );
            printf( "%d\n", n );
        }
    } else {
        char *s = va_arg( argptr, char* );
        printf( "%s\n", s);
    }
    // 가변 인수 수의 리셋
    va_end(argptr);
}

int main()
{
    testit( 5, 12, 34, 56, 78, 90 );
    testit( 1, "TEST" );     

    return 0;
}




 

Posted by 띠리

델파이에서의 VB의 ByRef같이 참조로 변수를 넘기는 방법


unit Unit1;

interface

uses
  Forms, StdCtrls, Controls, Classes;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure RefParam(var sParam : string);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  sTest : string;
begin

  sTest := '';
  RefParam(sTest);
  Button1.Caption := sTest;

end;

procedure TForm1.RefParam(var sParam: string);
begin
  sParam := '참조변수';
end;

end.


 함수의 파라미터를 정의할 때 var를 쓰면 그 파라미터는 참조형식으로 된다.

Posted by 띠리


숫자 변수를 참조 파라미터로 넘기는 간단한 C의 DLL 소스

extern "C"

{

    // Integer 인수를 참조로 넘겨주기

    int    PASCAL EXPORT NumChg(int& nChg)

    {

        nChg = nChg * 2;

        return nChg;

    }
}



DLL에서 숫자 변수를 참조 파라미터로 넘기려며는
참조 파라미터로 넘기는 파라미터 앞에 var를 넣으면 된다.


숫자 변수를 참조 파라미터로 넘기고 받는 델파이 소스

unit dtest;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, TeEngine, Series, TeeProcs, Chart;

type
  TfrmMain = class(TForm)
    btnTest: TButton;
    edtStr: TEdit;
    lblStr: TLabel;
    edtNo: TEdit;
    lblNo: TLabel;
    procedure btnTestClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

// 정수 변수를 참조 인수로 넘기기 위해서는 var를 써준다.
function NumChg(var nNo:Integer):integer; stdcall; external 'dtest.dll';

procedure TfrmMain.btnTestClick(Sender: TObject);
var
  nNo:Integer;
  psStr:PChar;
  sString:String;
  nWork:Integer;

begin

  // 문자를 숫자로
  nNo := StrToInt(edtNo.Text);

  // 참조 숫자 인수에 데이터를 넘기고
  // 바뀌어진 인수데이터 얻기
  nWork := NumChg(nNo);
  lblNo.Caption := IntToStr(nNo);

end;

end.


Posted by 띠리


문자열 넘기고 받는 간단한 C의 DLL 소스

char    szTemp[50];


extern "C"

{

    // DLL 문자열 인수 입력

    BOOL PASCAL EXPORT SetStr(char *pszSend)

    {

        sprintf(szTemp, "%s", pszSend);

        return true;

    }


    // DLL 문자열 인수로 문자열 넘겨주기

    BOOL PASCAL EXPORT GetStr(char *pszSend)

    {

        sprintf(pszSend, "%s + %s", szTemp , szTemp);

        return true;

    }


}



DLL에서 문자열을 주고 받기 위해서는
델파이에서 PChar형으로 문자를 DLL에 넘겨주고 받으면 된다.


문자열을 넘기고 받는 델파이 소스

unit dtest;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, TeEngine, Series, TeeProcs, Chart;

type
  TfrmMain = class(TForm)
    btnTest: TButton;
    edtStr: TEdit;
    lblStr: TLabel;
    edtNo: TEdit;
    lblNo: TLabel;
    procedure btnTestClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

// DLL에서 문자열을 넘겨주고 받기 위해서는 PChar형을 쓴다.
function SetStr(psStr:PChar):integer; stdcall; external 'dtest.dll';

function GetStr(psStr:PChar):integer; stdcall; external 'dtest.dll';

procedure TfrmMain.btnTestClick(Sender: TObject);
var
  nNo:Integer;
  psStr:PChar;
  sString:String;
  nWork:Integer;

begin

  // 문자열 초기화
  psStr := Nil;
  // 문자열 사이즈 잡기
  psStr := AllocMem(50);

  sString := edtStr.Text;

  // String형을 PChar형으로 캐스트
  psStr := PChar(sString);

  // dll에 문자열 입력
  SetStr(psStr);

  // 문자열 초기화
  psStr := Nil;
  // 문자열 사이즈 잡기
  psStr := AllocMem(50);

  // dll에서 문자열 가져오기
  GetStr(psStr);

  // PChar형에서 String형으로 바꾸기
  sString := StrPas(psStr);

  lblStr.Caption := sString;
 
  if psStr <> Nil then FreeMem(psStr);

end;

end.



Posted by 띠리
BLOG main image
프로그래밍 공부하면서 써가는 개인 노트 (따라서 여기에 씌여있는 소스의 신빙성을 보장 못함 -.-;;) 이 블로그 보면서 틀린 점이 있으면 꼬옥 알려주세요. by 띠리

공지사항

카테고리

분류 전체보기 (323)
Win32 SDK 초보 (27)
통신관련 (11)
MFC TIP (20)
C/C++ TIP (10)
개발기타 (10)
링크 (2)
견물생심 (24)
이것저것 (8)
용어메모 (3)
데이터베이스 (32)
비주얼 베이직 (10)
하드웨어 (3)
C# (42)
Xcode (3)
델파이 (82)
홈페이지 (5)
MindStorm (0)
낙서 (5)
스크래치 (0)
기타 (6)
아두이노 (1)
라즈베리파이 (2)
안드로이드 (6)
파이썬 (0)
WEB (2)
Total : 964,050
Today : 65 Yesterday : 370