시간차 구하기


gettimeofday 함수를 활용하여 시간차이를 구하는 방법을 살펴 보겠다. 

참고로 해당 함수는 windows에서 동작하지 않고 unix, linux 환경에서 동작한다.



포인터의 자료형


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


#include <time.h>


위의 해더에는 아래와 같은 구조체가 존재하며 해당 구조체는 gettimeofday 호출시 필요하다.

  struct timeval {

        time_t          tv_sec;         /* seconds */

        suseconds_t     tv_usec;        /* and microseconds */

  };


이제 전체 시간 구하는 전체 예제를 확인해 보겠다.



#include <stdio.h>

#include <time.h>


int main()

{

struct timeval startTime, endTime, gepTime;


gettimeofday( &startTime, NULL );


sleep(1);


gettimeofday( &endTime, NULL );


gepTime.tv_sec = endTime.tv_sec - startTime.tv_sec;

gepTime.tv_usec = endTime.tv_usec - startTime.tv_usec;

if ( gepTime.tv_usec < 0 )

{

gepTime.tv_sec = gepTime.tv_sec - 1;

gepTime.tv_usec = gepTime.tv_usec + 1000000;

}


printf("ellapsed time [%02d.%02d] second\n", gepTime.tv_sec, gepTime.tv_usec);

}



반응형

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

[C] Call-By-Value와 Call-By-Reference  (0) 2017.07.22
[C] 포인터와 배열  (0) 2017.07.19
[C] 포인터 자료형  (0) 2017.07.13
[C] 포인터 기초  (0) 2017.07.06
[C] 배열 사용법  (0) 2017.03.22

포인터 자료형


포인터에도 int* i, char *ch, double* do...등등 처럼 여러개의 자료형이 존재 한다.

이처럼 여러개의 자료형이 존재 하는 이유는 포인터가 가리켜야 할 자료 사이즈를 정확히 알기 위해서다.



포인터의 자료형


다음 그림을 통해 이해를 도와 보도록 하겠다.

위에 그림은 int 자료형 데이터를 char*, int* 두개를 가리키도록 했다.

int 자료형은 4byte인데 char*로 가리키면 어떻게 될까?

char형은 1바이트 밖에 안되서 char*의 값은 제대로 가져 올 수가 없다.


#include <stdio.h>


int main()

{

int nValue = 10;

int* pInt = &nValue;

char* pCh = &nValue; //해당 구문이 어떤결과를 나타낼지 예측하기 어렵다.
        printf(" %d %d \n", *pInt, *pCh );

}



그림을 예제를 구성해 봤습니다.

보다 컴파일러 마다 컴파일시 결과가 틀리다 어떤 것은 자료형이 다르면  Error가 발생해 

실행이 안 될 수도 있고 Warnning만 발생할 수도 있다.

printf 결과도 컴파일러 OS별로 천차 만별이다. 

(windows10, visual c++에서는 char*에 int 주소를 넣었을때 친절하게 컴파일 오류가 발생한다.)


여기서 말하고자 하는 것은 포인터 자료형을 실제 데이터의 자료형과 일치 하도록 주의를 기울여야 프로그램을 작성해야

여러분이 원하는 올바른 결과를 얻을 수 있습니다.








반응형

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

[C] 포인터와 배열  (0) 2017.07.19
[C] 시간차이 구하기 ( millisecond 까지.. )  (0) 2017.07.16
[C] 포인터 기초  (0) 2017.07.06
[C] 배열 사용법  (0) 2017.03.22
[C] goto 제어문 사용법  (0) 2017.03.18

포인터 사용법


포인터란 메모리상의 주소 값을 가리키는 변수이다.

이해하기 난해하며 사용하기도 참 어렵다. 

잘못 사용하면 프로그램이 종료되는 일도 발생할 수 있어 사용하는데 항상 주의를 기울여야 한다.

포인터를 이해 하려면 우선적으로 컴퓨터의 메모리 구조 이해가 필수적이며 

여러분의 이해를 돕고자 포인터의 low level 부터 설명 하도록 하겠다.



메모리 구조


포인터를 이해하려면 메모리 구조를 먼저 파악해야 된다. 

아래와 같이 빈 메모리 공간이 있다고 가정하자.

위의 메모리는 0x0001 ~ 0x0008 까지 주소를 가지고 있으며 각 주소당 1byte 데이터 공간을 가지고 있다.

이제 위의 메모리에 다음과 같이 변수를 선언했다고 가정하자.

 int value = 10;


이제 메모리가 어떻게 변했는지 살펴 보겠다.

int는 4byte의 공간을 차지 하기 때문에 0x0001~0x0004까지 공간을 value가 할당하여 쓰고 있으며 값은 10이 저장된다.

그렇다면 위에서 할당받은 value의 시작 주소는 무엇일까?

value의 시작 주소는 위의 그림에서 보면 0x0001인 것을 알 수 있다.

그러므로 value의 시작 주소는 0x0001이며 이것을 표현하는 것은 &value 라 한다.


 int value = 10;

 printf("&value: %d \n", &value ); //는 0x0001이 출력 된다.
 // 여기서 주의할 점은 위의 메모리 구조를 가정하에 0x0001이라는 것이다. 매번 수행 할 때마다 주소값은 항상 변한다.


자 이제 포인터 변수를 하나 선언 하도록 하겠다.

포인터 표현 방식은 변수명에 *을 하나 붙여 주면 되며 포인터는 항상 주소 값만 갖는다.

또한 포인터는 4byte만 할당 받도록 되어 있다.


 int value = 10;

 int* pValue = &value;

위와 같이 pValue에는 value의 주소값인 0x0001이 할당 된다.

아래의 결과는 어떻게 될까?


 printf("pValue[%d] *pValue[%d] \n", pValue, *pValue ); 


pValue -> 주소 값
*pValue -> 해당 주소가 가리키는 값


결과는 pValue 주소 값이므로 0x0001이며 *pValue는 주소를 가리키는 변수의 값 즉 value의 값인 10을 나타낸다. 



전체 예제는 다음과 같습니다.



#include <stdio.h>


int main()

{

int nValue = 10;

int* pValue = &nValue;

        printf("pValue[%d] *pValue[%d] \n", pValue, *pValue ); 

return 0;

}



반응형

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

[C] 시간차이 구하기 ( millisecond 까지.. )  (0) 2017.07.16
[C] 포인터 자료형  (0) 2017.07.13
[C] 배열 사용법  (0) 2017.03.22
[C] goto 제어문 사용법  (0) 2017.03.18
[C]switch 제어문 사용법  (0) 2017.03.17

배열 사용법


배열이란 하나의 변수 명에 여러개의 값을 담을 수 있는 변수 이다.

예를 들어 10명의 학생이 있는 반의 성적을 변수로 담고 출력 한다고 생각해보자.

배열이 아닌 변수를 사용할 경우 변수를 10개를 만들어야 한다.

이런 문제를 배열을 통해 해결해 보는 과정을 갖어 보자.



배열 사용법


배열을 선언하고 사용하는 방법에 대해 간단히 알아보자

  int score[10];  // 배열 선언

  score[0] = 10;  // 배열 값 입력 

  printf( "%d\n", score[0]) // 배열 값 출력


int score[10];를 선언하면 아래의 그림처럼 메모리에 할당 된다.



score[0] = 10; 을 하면 배열의 0번째 공간에 10이라는 값이 입력된다.




배열을 사용하는 예제를 살펴 보도록 하겠다.



#include <stdio.h>


int main(int argc, char *argv[]) 

{

int score[10];

score[0] = 20 ;

score[1] = 30 ;

score[2] = 40 ;

score[3] = 50 ;

printf( "score[0] : %d \n", score[0] );

printf( "score[1] : %d \n", score[1] );

printf( "score[2] : %d \n", score[2] );

printf( "score[3] : %d \n", score[3] );

return 0;

}


int score[10]; -> int를 10개 가지고 있는 배열을 선언한다.

score[0] = 20; -> score 배열 첫 번째 값을 20으로 할당 한다.

printf( "score[0] : %d \n", score[0] ); -> score[0]의 값을 출력 한다.

반응형

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

[C] 포인터 자료형  (0) 2017.07.13
[C] 포인터 기초  (0) 2017.07.06
[C] goto 제어문 사용법  (0) 2017.03.18
[C]switch 제어문 사용법  (0) 2017.03.17
[C] continue, break 사용법  (0) 2017.03.16

+ Recent posts