c언어/ C++ 에서 딜레이 함수 사용하기


프로그램을 진행하다보면 프로그램을 멈추어야할 떄가 존재합니다.


api를 사용하지 않고 아래와 같이 for문을 중첩사용하여 시간을 끄는 방식이 존재합니다.


int a=0;

for(int i=0; i < 10000; i++){ //1중첩 for문

for(int j=0; j < 10000; j++){ //2중첩 for문

a++; //무의미한 연산

}

}


하지만 위와 같은 방식은 원하는 시간만큼 정확하게 딜레이 시키기가 불가능 합니다.


그래서 C와 C++에서는 Sleep 함수를 사용합니다.


windows에 api 를이용하는 방식입니다.


#include <windows.h> 로 헤더파일을 추가해야합니다.


그리고 Sleep( ) 함수를 사용 합니다.


파라미터로 int 데이터를 사용하는데 ms단위입니다.


예를들어 Sleep(1000); 는 1000ms로 1초를 의미합니다.


프로그램을 사용하다보면 유용하게 쓸일이 많이 있습니다.


아래 예제를 참고바랍니다.



- 사용예제1 -


1
2
3
4
5
6
7
8
#include <stdio.h>
#include <windows.h>
 
int main() {    
    printf("시작\n");
    Sleep(1000); //1초정지
    printf("끝\n");
}
cs



- 사용예제2 -


1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <windows.h>
void main()
{
     int i=0;
     for(i=0; i<100; i++){
        printf("%d\n",i);
        Sleep(200);   //200ms 일시정지
     }
}
 
cs


- 사용예제3 -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <windows.h>
 
void main() {    
    printf("1초 정지\n");
    Sleep(1000);
    printf("2초 정지\n");
    Sleep(2000);
    printf("3초 정지\n");
    Sleep(3000);
    printf("4초 정지\n");
    Sleep(4000);
    printf("5초 정지\n");
    Sleep(5000);
    printf("끝\n");
}
cs


Posted by 꿈만은공돌
,

포인터 배열(Array of Pointer)배열 포인터(Pointer to Array)는 비슷해 보이지만 많은 차이점이 있다.


기본적으로 포인터와 배열에 개념을 정확하게 이해해야 아래 내용을 이해하기 쉽다.


간단히 설명하자면 둘다 비슷한 속성을 가지고 있지만 배열은 메모리공간을 사용자 마음대로 접근하며 데이터를 넣고 수정할 수 있다.


포인터 같은 경우에는 특정 메모리에 주소값을 가지고 있어서 간접참조를 하는 방식이다.


쉽게 이해가 안가면 기본서를 참고해서 공부하는 것이 좋다.


배열 포인터와 포인터 배열 말장난 같지만 가장 쉽게 구분하는 방식은 앞에 붙은 단어는 수식어이고 뒤에 단어가 명사이다.


바나나우유, 딸기우유가 있으면 우유인데 딸기나 바나나가 첨가된 우유이다.


포인터 배열은 주소값들을 저장하는 배열 이다.


배열 포인터는 배열의 시작주소값을 저장할 수 있는 포인터 이다.



- 포인터 배열- 


char *data[] = {"가나다", "ABC", "포인터"};


의 경우 연산자 우선순위에 따라 뒤에 붙은 []이 우선이고 그다음 char *가 그 다음이다.


따라서 data 변수는 배열이다. 그리고 그 배열에 char *를 담는다.


"가나다" 문자열에 시작주소 값을 data[0] 에 넣고


"ABC" 문자열에 시작주소 값을 data[1] 에 넣는다.



아래는 사용 예제 이다. 위에 그림을 코드화 한 것이다. data는 포인터 배열로 char *를 저장하는 배열이다. 그래서 for문을 사용하여 해당 배열들을 탐색하며 값을 출력하는 것을 알 수 있다. data 배열의 사이즈는 명시하지 않았지만 오른쪽에 데이터 갯수를 보고 컴파일러가 알아서 3을 넣게된다.

char *data[] = {"가나다", "ABC", "포인터"};

int i;

for (i=0;i<3;i++) {
    printf("%s\n",data[i]);
}

- 출력 결과 -

가나다

ABC

포인터





 위와같이 포인터 배열은 문자열등과 같이 큰 길이에 데이터들을 포인터로 가르키게하고 해당 포인터들을 다시 배열로 묶어서 관리하기 쉽게 할때 사용하면 좋다. 위와같이 문자열 여러개를 각각 포인터가 가르키게하고 그 포인터들을 하나의 배열로 묶어서 관리해서 사용하기도 쉽고 가독성도 좋다. 만약에 따로따로 하나의 char* 로 할당을 했다면 for문을 사용하기도 힘들었을 것이다.


- 배열 포인터 -


char arr[3][7] = {"가나다", "ABC", "포인터"};

char (*data)[7];

data = arr;


의 경우 (*data) 가 먼저이고 char [7]가 그 다음이다.


따라서 data는 포인터 이다. 포인터는 주소값을 저장하는 곳이다. 따라서 char [7] 자료형에 주소값을 담는다.



data는 char [7]의 주소값을 가지기 때문에 data + 1을 하면 주소값이 sizeof(char) * 7 증가한 메모리의 주소 값을 가진다.  아래 그림과 같다.



아래는 사용 예제 이다. 위에 그림을 코드화 한것이다. arr은 2차원 배열로 문자열들을 할당하고 data는 배열 포인터이다. char [7]을 의 포인터를 가르키는 역활을 한다. 

char arr[3][7] = {"가나다", "ABC", "포인터"};
char (*data)[7];

data = arr;

int i;

for (i=0 ; i<3 ; i++) {
    printf("%s\n", *(data+i));
}


- 출력 결과 -

가나다

ABC

포인터


 배열 포인터는 보통 함수선언을 해서 2차원 배열의 데이터를 파라미터로 받을때 많이 사용한다. 위의 예제에서 처럼 2차원으로 선언한 배열이 있다면 이것을 배열 포인터로 가리키게 하여 접근할 수 있다.

 한가지 주의해야 할 점은  위의 예제에서 처럼 data 입장에서는 arr이 몇개의 데이터를 가지고 있는지 알 수 없다. 그래서 함수에 넘겨줄때에는 3개의 char [7]의 데이터가 존재한다는 사실을 알려주기 위해 추가에 파라미터 변수가 필요하다. 그래야 안정적인 코드작성이 가능하다.

 포인터라는 개념을 공부할 때에는 이해가 가는것 같지만 나중에 실전에서 내가 선언한 배열이나 포인터등을 다른함수에 넘겨주고 다시 반환하는 등에 과정에서 많이 어려워하는 경우가 많다.  


- 참고 사이트 : http://www.soen.kr/

Posted by 꿈만은공돌
,





프로그래밍을 하다보면 딜레이가 발생하거나해서 어느 부분이 느린지 알아내야 하는 경우가 생길 수 있습니다.

또는 알고리즘을 공부하다보면 내가 구현한 알고리즘의 속도를 알고싶을 때가 있습니다.

그럴때 특정 구간에 코드 실행시간을 알아야내야 하는 경우에 필요한 포스팅 입니다.

C언어, C++에서 프로그램 실행시간을 측정하는 방법은 두 가지가 있습니다.




1. time 함수를 이용한 방법

우선 time 함수를 이용한 방법 입니다.

time(NULL) 함수를 이용하여 받아옵니다.

단점은 ms단위가 아닌 초(s) 단위로 측정이 됩니다.

#include <time.h> 헤더파일을 포함시키고 아래와 같이 사용하시면 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <time.h>
 
int main() {
    time_t start, end;
    double result;
    int i, j;
    int sum = 0;
 
    start = time(NULL); // 시간 측정 시작
 
    for (i = 0; i < 100000; i++) {
        for (j = 0; j < 10000; j++) {
            sum += i * j;
        }
    }
 
    end = time(NULL); // 시간 측정 끝
    result = (double)(end - start);
    printf("%f", result); //결과 출력
    return 0;
}




2. clock 함수를 이용한 방법

clock 함수를 이용하여 앞에 방법의 단점을 해결하여 ms 단위로 시간을 측정 할 수 있습니다.
time 함수와 마찬가지로 include<time.h> 헤더 파일을 포함 시켜야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <time.h>
 
int main() {    
    clock_t start, end;
    double result;
    int i,j;
    int sum = 0;
 
    start = clock(); //시간 측정 시작
    
    for (i = 0; i < 100000; i++) {
        for (j = 0; j < 10000; j++) {
            sum += i * j;
        }
    }
 
    end = clock(); //시간 측정 끝
    result = (double)(end - start);
    printf("%f", result);
    return 0;
}



clock 함수는 아래와 같이 1초 1000 clock으로 정의되어 있습니다.
따라서 1clock은 1ms 입니다.
Visual studio 에서 clock 함수에서 F12를 누르면 아래와 같은 정의를 볼 수 있습니다.





Posted by 꿈만은공돌
,