CallByValue와 CallByReference


함수를 호출할 때 필요한 경우 인자값을 전달해줄 때가 있다.

인자값을 전달 할 때 2가지 방식이 존재 한다. 

값을 복사하여 전달 하거나 참조값을 넘겨주는 방식인데 이것을 각각

Call-By-Value와 Call-By-Reference 라 한다.



Call-By-Value


각각에 대해 자세히 살펴 보자.

값을 복사 해서 인자 값을 전달 하는 것은 아래와 같다.


#include <stdio.h>


void callByValue( int value )

{

value += 2 ;

}

int main()

{

int i= 5;


callByValue(i);

printf( "callByValue -> i= %d\n", i);
}



main에서 i=5이다.

callByValue를 호출 할 때 i를 인자 값으로 넘겨 주면 함수 인자 value에 i의 값이 복사 된다.

그러므포 callByValue 함수의 인자 값 value는 5가 되며 함수 안에서 아무리 value 값을 바꿔도

main 함수의 i 값에 영향을 미치지 않는다.


위의 프로그램을 수행하면 함수안에서 2를 더했는데도 main의 i 값에는 영향을 받지 않아

printf의 결과는 i 값은 초기값 5 그대로 출력이 된다.




Call-By-Reference


이번에는 함수의 인자를 참조 값으로 전달하는 예를 살펴 보도록 하겠다. 


#include <stdio.h>


void callByReference( int *value )

{

*value += 2;

}


int main()

{

int i= 5;


callByReference(&i);

printf( "callByReference -> i = %d\n", i );

}



callByReference 함수가 정의 된 것을 보면 포인터로 값을 받도록 되어있다.

이말을 callByReference를 호출 할 때 값을 주는 것이 아닌 주소 값을 전달을 받는다.


callByReference( &i ); 부분을 보면 i 앞에 &가 있으며 이 뜻은 i의 주소 값이라는 의미다.

callByReference 함수안의 인자 value는 main 함수의 i와 동일한 주소를 가리키고 있다는 뜻이다.

*value += 2; 를 수행하면 "value가 가리키는 i의 값을 2를 더해줘" 라는 뜻이 되며

함수안에서 value 값이 변경 되면 i의 값이 바뀐다.


위의 프로그램을 수행하면 함수안에서 *value 즉 value가 가리키는 값에 2를 더한 것이 되어 

main의 i 값에는 영향을 받게 되어 printf의 결과는 i 값은 초기값 5에 2를 더한 값인 2가 출력된다.



반응형

'프로그램 > C' 카테고리의 다른 글

[C] 구조체  (0) 2017.07.24
[C] 포인터와 상수(const)  (0) 2017.07.23
[C] 포인터와 배열  (0) 2017.07.19
[C] 시간차이 구하기 ( millisecond 까지.. )  (0) 2017.07.16
[C] 포인터 자료형  (0) 2017.07.13

포인터와 배열


배열은 여러개의 값을 담을 수 있는 변수로써 각 값마다 주소 값을 가지고있다.

그렇기 때문에 포인터로 각 주소에 접근을 하여 값을 얻어 올수 있는데

이번 설명에서 그 방법에 대해 설명 하도록 하겠다.



포인터와 배열


다음과 같은 5개의 값을 가지고 있는 배열이 있다.

포인터로 각 값을 접근 하고 싶으면 어떻게 해야 할까?


int arr[5] = { 3, 7, 12, 24, 51 };

    int* ptr = NULL;


아래 답을 보기 전에 고민을 해보자..

....


ptr = &arr[0];


그렇다면 ptr이 24를 가리키려면 어떻게 바꿔야 할까?

...


ptr = &arr[3];

printf( " ptr 값 = %d, arr[3] 값 = %d \n", *ptr, arr[3] );


위의 printf을 실행해 보면 같은 값이 나오는 것을 확인 할 수 있다.


ptr = arr;

위의 ptr의 값은 무엇을 나타 낼까?

배열의 이름은 배열의 첫 번째 공간을 주소 값을 나타낸다. 

따라서 ptr이 가리키는 값은 arr 배열의 첫 번째 값인 3이다.


ptr = arr; // ptr = &arr[0] 과 같다.


전체 예제는 다음과 같다.


#include <stdio.h>


int main()

{

int arr[5] = { 3, 7, 12, 24, 51 };

int* ptr = NULL;


ptr = arr;


printf( " arr의 값=%d \n", *ptr );


ptr = &arr[0];


printf( " arr의 값=%d \n", *ptr );


ptr = &arr[3];


printf( " ptr 값 = %d, arr[3] 값 = %d \n", *ptr, arr[3] );


}



반응형

'프로그램 > C' 카테고리의 다른 글

[C] 포인터와 상수(const)  (0) 2017.07.23
[C] Call-By-Value와 Call-By-Reference  (0) 2017.07.22
[C] 시간차이 구하기 ( millisecond 까지.. )  (0) 2017.07.16
[C] 포인터 자료형  (0) 2017.07.13
[C] 포인터 기초  (0) 2017.07.06

sqlglm 함수를 이용한 오류 메시지 출력하기


pro*c에서 쿼리 실행시 오류가 발생하면 sqlca 구조체에 sqlerrm 구조체에 있는 것을 활용하여 메시지를 출력을 할 수 있으나

sqlerrm.sqlerrmc가 항상 마지막 문자열에 null을 주는 것이 아니라 메시지가 제대로 출력 되지 않아 sqlerrm.sqlerrml 로 길이를 구해서

출력해야 되는 번거로움이 있다.

이런 번거로움 대신 sqlglm 함수를 사용하여 간단하게 메시지를 출력 해보자.



sqlglm 함수 알아보기


아래와 같이 해더를 추가한다.


    #include <sqlcpr.h>


함수의 원형은 아래와 같다.

void sqlglm( char* message_buffer, size_t * buffer_size, size_t * message_length);



오류 메시지 출력하는 예제를 보겠다.



#include <sqlcpr.h>

....

....


char msg_buf[512] = {0,};

size_t size_buf = 512;

size_t msg_len = 0;


EXEC SQL 

    UPDATE USER_TBL 

SET AGE = '50'

WHERE NAME LIKE '%Suzan%';


if( sqlca.sqlcode != 0 && sqlca.sqlcode != 1403 )

{

sqlglm( msg_buf, &size_buf, &msg_len );

prinf(" error[%s] \n", msg_buf );

}


반응형

'프로그램 > Pro*c' 카테고리의 다른 글

[Pro*c] sqlca 구조체 설명 ( 오류 처리 )  (0) 2017.07.17
[Pro*c] Connect, DisConnect  (0) 2016.11.22

Sqlca 구조체 설명 및 오류 처리


Pro*c에서 쿼리를 실행 할 때 마다 sqlca로 결과를 전달 해 준다.

그래서 sqlca의 구조체를 이해해야 오류 발생시 적절하게 조치 하는데 필요하다.



Sqlca 알아보기


아래와 같이 해더를 추가한다.


    #include <sqlca.h>

    혹은

EXEC SQL INCLUDE SQLCA;


위의 해더에는 아래와 같은 구조체를 활용 하여 에러 처리를 한다.

  struct sqlca

{

char sqlcaid[8]; 

long sqlabc;

long sqlcode;    // oracle error code 저장


struct

{

unsigned short sqlerrml; // 오류메시지 길이

char sqlerrmc[70];       // 오류메시지

} sqlerrm;


char sqlerrp[8];

long sqlerrd[6];

char sqlwarn[8];

char sqlext[8];

};


struct sqlca sqlca;


각 구조체 상세 설명은 아래와 같다.

sqlca.sqlcode

 sqlca.sqlcode == 0 

 정상 처리

 sqlca.sqlcode == 1403

 조회된 데이터 없음

 sqlca.sqlcode == 100

 insert 된 데이터 없음 ( 컴파일 옵션이 MODE=ANSI 일 때 )

 sqlca.sqlcode < 0

 오류 발생


sqlca.sqlerrd

 sqlca.sqlerrd[2]

 select 조회 건수

 fetch 누적 조회 건수

 insert, update, delete 건수

 sqlca.sqlerrd[4]

 sql문 오류가 발생한 위치



오류 처리 예제를 보겠다.



#include <sqlca.h>

....

....


EXEC SQL 

    UPDATE USER_TBL 

SET AGE = '50'

WHERE NAME LIKE '%Suzan%';


if( sqlca.sqlcode == 0  )

{

prinf(" 정상 처리, 처리 된 건 수[%d] \n", sqlca.sqlerrd[2]);

}

else if( sqlca.sqlcode == 1403 )

{

      printf(" 조회된 건 수가 없음 \n" );

}

else if( sqlca.sqlcode < 0 )

{

     printf(" 오류 발생, code[%d] msg[%s] \n" sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc  );

}


반응형

+ Recent posts