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);
}
C 파일 ------à 컴파일 -----------à 목적파일 ------------à .exe
본래 C파일의 컴파일 과정에서는 object 파일이 있음 그러나 분리해 놓은 경우에는 myfunc.c와 pointerSample.c 를 그룹화하여 컴파일하라는 명령을 내려줘야 하기 때문에 별도로 gcc 컴파일러에 명령어를 준다.
아래과 같이 컴파일 먼저한 후에 pointerSample.exe 를 실행하면 잘 실행되는 것을 알 수 있음
gcc –o pointerSample.exe –g pointerSample.c myfunc.c
목적파일 이라는 의미의 -o , 뒤의 c 파일들을 그룹화하라는 의미의 -g 라고 이해하면 편함!