-
헤더와 메소드 분리하기, 메소드 포인터 이용하기C, C++ 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 는 방 하나의 sizevoid 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);}C 파일 ------à 컴파일 -----------à 목적파일 ------------à .exe
본래 C파일의 컴파일 과정에서는 object 파일이 있음 그러나 분리해 놓은 경우에는 myfunc.c와 pointerSample.c 를 그룹화하여 컴파일하라는 명령을 내려줘야 하기 때문에 별도로 gcc 컴파일러에 명령어를 준다.
아래과 같이 컴파일 먼저한 후에 pointerSample.exe 를 실행하면 잘 실행되는 것을 알 수 있음
gcc –o pointerSample.exe –g pointerSample.c myfunc.c
목적파일 이라는 의미의 -o , 뒤의 c 파일들을 그룹화하라는 의미의 -g 라고 이해하면 편함!
'C, C++' 카테고리의 다른 글
static과 전역변수, 지역변수 (0) 2018.12.27 void 포인터 (0) 2018.12.21 함수의 포인터 표현 + 포인터와 배열의 차이점 (0) 2018.12.20 포인터 연산과 배열 표현(심화 연습편) (0) 2018.12.19 String 함수의 사용, 선택정렬- 버블정렬 (0) 2018.12.18