C, C++

헤더와 메소드 분리하기, 메소드 포인터 이용하기

SuuuuuuuL 2018. 12. 27. 09:17

메인함수 부분 : 파일명 pointerSample.c (실행부)

#include <stdio.h>
#include "myfunc.h" // 내가 만든 헤더를 가져옴 같은 폴더에 위치하면 큰따옴표로 가져올 수 이있음

//main()----------------------------------
int main(){
    int iArray[] = {5,2,1,11,56,34,4,44,32,10};
    double dArray[] = {10.4,22.1,1,55.2,40.5};
    char word[][15] ={"apple", "banana", "strawberry", "pineapple", "pear"};

   mysort(iArray,sizeof(iArray)/sizeof(iArray[0]),sizeof(iArray[0]),intCompare);
    mysort(dArray,sizeof(dArray)/sizeof(dArray[0]),sizeof(dArray[0]),doubleCompare);
    mysort(word,sizeof(word)/sizeof(word[0]),sizeof(word[0]),stringCompare);
   
    for(int i = 0; i < sizeof(iArray)/sizeof(iArray[0]); i++){
        printf("%d ", iArray[i]);
    }   
    printf("\n");

    for(int i = 0; i < sizeof(dArray)/sizeof(dArray[0]); i++){
        printf("%lf ", dArray[i]);
    }   
    printf("\n");

    for(int i = 0; i < sizeof(word)/sizeof(word[0]); i++){
        printf("%s ", word[i]);
    }   
}


파일명 : myfunc.h  함수의 선언부(선언)    

** mysort라는 함수가 어떤 값이든 받아서 비교를 할 수 있게끔 선언하기 위해서 함수포인터를 인자로 받는다! 

/*실행부는 헤더에 들어가면 안됨 선언부는 헤더에 들어가야 함
정의부(초기화)는 .c로 따로 파일을 만들어야 함 */

//정렬(어떤 타입이든 정렬가능) - 마지막 인자는 함수포인터
// 두번째 인자는 배열 사이즈 세번째 int 는 방 하나의 size
void mysort(void*, int, int, int(*)(void*,void*));
//정수 비교
int intCompare(void*,void*);
//실수비교
int doubleCompare(void*,void*);
//string 비교
int stringCompare(void*, void*);

// 앞이 작으면 -1, 같으면 0 , 뒤가 작으면 1 을 리턴


함수의 정의부  파일명 myfunc.c

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
// 정의부는 c파일로, 그리고 함수를 컴파일하기 위해서 나머지 헤더파일도 상단에 선언해준다.

void mysort(void* p, int count , int size, int(*dataCompare)(void*,void*)){
    void *tmp = //int temp =0;, 자신이 가리키는 것이 몇바이트인지 모르는 채로 인자가 넘어오므로 tmp도 이와 같이 선언
    tmp = malloc(size);// 동적으로 할당된 메모리 공간 에 넘어온 사이즈만큼 메모리를 잡아준다.
    
        printf("size : %d, count : %d\n",size, count);
    for(int i = 0; i < count -1; i++){
        for(int j = i+1; j < count; j++){
            if(dataCompare((char*)p+i*size, (char*)p+j*size) > 0){ // 앞의 큰 경우 교환
            // char로 형변환 하는 이유는 1byte씩 잡기 위해서 *size를 해주면 본래 사이즈만큼 잡아줌!
                //printf("값 : %d \n ",(char*)p+j*size);
                memcpy(tmp, (char*)p+i*size, size);
// 주소를 알려주면 그 주소에서 부터 지정한 byte 수만큼 복사할 수 있음
                memcpy((char*)p+i*size, (char*)p+j*size, size);
                memcpy((char*)p+j*size, tmp, size);
            }
        }
    }// 선택정렬 끝
    free(tmp); // 메모리 해제
}
int intCompare(void* p1, void* p2){
    //  printf("%d , %d\n",*(int*)p1, *(int*)p2);
    if(*(int*)p1 > *(int*)p2){
        return 1;
    }else if(*(int*)p1 == *(int*)p2){
        return 0;
    }else{
        return -1;
    }
}

int doubleCompare(void* p1, void* p2){
    if(*(double*)p1 > *(double*)p2){
        return 1;
    }else if(*(double*)p1 == *(double*)p2){
        return 0;
    }else{
        return -1;
    }
}

int stringCompare(void* p1, void* p2){ //stringcmp 이용
    return strcmp((char*)p1, (char*)p2);
}




파일 ------à 컴파일 -----------à 목적파일 ------------à .exe


본래 C파일의 컴파일 과정에서는 object 파일이 있음 그러나 분리해 놓은 경우에는 myfunc.c와 pointerSample.c 를 그룹화하여 컴파일하라는 명령을 내려줘야 하기 때문에 별도로 gcc 컴파일러에 명령어를 준다.

아래과 같이 컴파일 먼저한 후에 pointerSample.exe 를 실행하면 잘 실행되는 것을 알 수 있음 


gcc –o pointerSample.exe –g pointerSample.c myfunc.c




목적파일 이라는 의미의 -o ,  뒤의 c 파일들을 그룹화하라는 의미의 -g 라고 이해하면 편함!