'가변인수'에 해당되는 글 2건

  1. 2007.08.29 가변 인수 및 동적 배열 예제
  2. 2007.08.29 가변 인수 이야기

커맨드 버튼 하나만 만들어 놓고 붙여넣기


나머지는 알아서 주석으로 해결~~


Option Explicit
'가변 인수 테스트
'Inputbox로 수를 입력받아 그 합을 구한다.


'UBound 함수 : 배열의 마지막 번호를 넘긴다
'LBound 함수 : 배열의 첫 번호를 넘긴다.
'ex : Dim exam(2 to 4) as Integer
'Debug.print LBound(exam) 결과 : 2
'Debug.print UBound(exam) 결과 : 4

Public Function Sum(ParamArray vArgs())

    Dim i As Integer '루프 변수
    Sum = 0
   
    For i = LBound(vArgs) To UBound(vArgs) '합계 구하는 루프
   
        Sum = Sum + vArgs(i)
   
    Next i
   
End Function

Private Sub Command1_Click()
Dim Args() As Integer '인자 배열
Dim InputNumber As Integer '입력 변수
Dim Count As Integer '첫 입력인지 확인
Dim i As Integer '출력값

Count = 0



Rem 입력 받는 루프, 0이 나올때까지 루프

Do
    InputNumber = Val(InputBox("수를 입력해 주세요(0 : 입력 종료)", "입력")) '입력 받는다
   
    If InputNumber <> 0 Then '입력 받은게 0이 아니라면 배열에 수를 넣는다.
       
        If Count = 0 Then '제일 처음 입력하는 것이면
            ReDim Args(1) As Integer '일단 배열 한개 만들고
            Args(0) = InputNumber '0번째 배열에 첫 수를 넣는다.
            Count = Count + 1 '카운트 추가 -> 사실 이거는 bool형으로 해서 처음이냐 아니냐만 체크해도 되는데.. 일단 이걸로 수도 셀수 있고 하니 놔둠.
       
        Else '처음 입력이 아니면
       
            ReDim Preserve Args(UBound(Args) + 1) As Integer '데이터를 보존하면서 배열 크기 재선언
            Args(UBound(Args) - 1) = InputNumber 'VB의 배열 틍징 -> 배열 크기를 1로 하면 공간이 2개 생긴다 -_-;; -> 그래서 마지막 번호 앞의 거에다가 입력 값을 넣는다
        End If
   
    End If
   
Loop While InputNumber <> 0 '0이 입력안되는동안 계속 루프

If Count <> 0 Then
    ReDim Preserve Args(UBound(Args) - 1) As Integer '이거 지우고 한번 debug.print로 배열 첨부터 끝까지 루프 돌려보면 안다,(UBound,LBound 참조) 맨 마지막에 배열 요소 하나가 남기 때문에 공간 하나를 없앤다.
End If

'출력
For i = LBound(Args) To UBound(Args)
    Debug.Print "Args(" & i & ") : " & Args(i)
Next i

'가변 인수 테스트
Debug.Print
Debug.Print Sum(1, 2, 3, 4, 5)
End Sub

Posted by 머리
Study - Programming/C/C++2007. 8. 29. 01:13

혹시 이런 생각 해본적 있는가? 보통 함수의 인자의 개수는 정해져 있는데, printf함수 같은 경우는 그 수가 제한이 없지 않은가?


예전에 이런 것과 관련해서 함수 하나를 구현할 일이 있었는데 미루다 미루다 이제야(한 일주일 된듯 -_-;;) 한번 찾아 보았다.


먼저 printf 함수 원형을 한번 보자

int printf(const char*,...);

이렇게 되어 있다. 사실.. 이거는 컴파일러가 'printf(' 여기까지만 치면 원형을 보여주는데 쓸데없이 stdio.h를 열어보는 뻘짓까지 했다 ㅋ


한번 분석해 보자.


  우선 printf의 리턴 데이터 형식은 int형이였다. 이 함수의 리턴값은 출련한 변수의 갯수이다. 예를 들어 ("%d,"%d",a,b)했으면 리턴 값은 2.


 그리고 첫 번째 인자는 우리가 "name %s\b"하는 이런 거고.. 중요한 것은 두 번째 인자 '...'이다. 인자를 생략한다는 표시인데, 이 표시를 통해서 함수 호출 시 인자를 얼마든지 넣을 수 있게 된다. 그것을 처리하는 것은 원형에서 해줄 몫이고.. 그리고 이것을 '가변 인수'라고 한다. 뭐 자세한 사용법은 알아서 공부해볼것, 이건 대충 사용법만 보고 거기에서 합계 구하는 예제 있길래 안보고 만들어 본 것. 이해 자체는 그리 어렵지 않은데.. 음 좀더 공부해 봐야지.



#include
#include

int GetSum(int Num,...)
{
 va_list ap;
 va_start(ap,Num);
 int arg;
 int i;
 int Sum = 0;

 for(i = 0 ; i < Num ; i++)
 {
  arg = va_arg(ap,int);
  Sum+= arg;
 }

 va_end(ap);
 return Sum;
}

void main()
{
 printf("%d\n",GetSum(10,1,2,3,4,5,6,7,8,9,10));
}



참, 참고로 C#에서는 가변 인수를 사용하는 방법이 따로 지원한다. 이것보다 더 쉽게.. (맞나?) 그때는 이게 말 뜻 자체도 이해가 안되다가 아! printf! 해서 이해만 하고 그래서 뭘 만들어볼까할때 아이디어가 생각이 안나 넘어갔는데.. 이렇게 다시 해볼 기회가 생겨서 다행이다.  뭐 이거 찾다가 VB에서도 가변인수 쓸수 있다는거 알았고, VB,C# 둘다 연습해 봐야겠다 함.. 그리고 C/C++에서도 계속 공부하고..

Posted by 머리