본문 바로가기

Embeded C

5_5 함수의 정의

average 함수의 정의를 살펴보겠습니다 함수의 정의는 표제부와 함수본체로 구성됩니다
아래와 같습니다

함수반환자료형 함수이름(인수리스트){명령문}

함수의 반환자료형이란 함수의 실행이 끝난 뒤 호출자에게 돌려주는 값의 자료형을 말합니다. int면 int, float이면 float으로 반환값의 호출자인 main()함수에게 돌려준다는 의미입니다 만약 함수의 자료형이 명시되지 않았을 경우 기본적으로 컴파일러는 int형으로 간주합니다 함수가 반환값(return)을 가지지 않을 경우에는 void형으로 다음과 같이 명시합니다
void average (int n1, int n2) { }

main()함수는 프로그램의 종료가 정상이면 0을 운영체제로 돌려줍니다
이럴경우 int main() ~ return0;
반환값을 사용하지 않는 경우 void main()으로 쓰고 return;을 생략하기도 합니다

인수리스트는 괄호를 사용하면 인수의 자료형과 인수가 옵니다 여러개를 사용할경우 콤마를 사용합니다 인수의 자료형을 표시하지 않으면 컴파일러은 int형으로 간주하기 때문에 자료형을 사용해주는 것이 좋습니다
인수가 없을 경우에는 괄호를 비워 두거나 void를 명시하기도 하지만 괄호는 생략 할 수 없습니다

//자료형이 일치하지 않는 경우를 보겠습니다
#include <stdio.h>
float average (short n1, short n2);
int main()
{
    int num1, num2;
    float avrg;
    printf("Please enter an interger: ");
    scanf("%d", &num1);
    printf("Please enter an interger: ");
    scanf("%d", &num2);
    avrg = average((short)num1,(short)num2);
    printf("The avergae of %d and %d is %6.3f\n", num1, num2, avrg);
    return 0;
}
float average(short n1, short n2)
{
    float avg;
    avg = (float)(n1+n2)/2;
    return(avg);

결과는 쓰레기값이 출력됩니다

위 예제의 문제는
average()는 short 형인데 반해 main()에서는 num1,num2가 int로 선언되어 있어 400000이라는 값을 넣게 되면short의 범위를 벗어나게 됩니다 잘못된 결과를 산출합니다

short형을 int로 바꾸거나
casting을 이용하여 

avrg = averag((short)num1,(short)num2);

바꿔주면 됩니다  하지만 short형으로 바꾸었기 때문에 short 범위내 값으로 입려해야 합니다 

'Embeded C' 카테고리의 다른 글

5_7 지역변수  (0) 2011.04.25
5_6 함수의 원형(선언)  (0) 2011.04.25
5_4 리눅스 make 명령어  (1) 2011.04.20
5_3 함수의 분리와 결합  (0) 2011.04.20
IEEE 754 표준 32비트 부동소수점 표현  (2) 2011.04.20