프로그래밍305 Quick Sort #include #include typedef int(*Sort)(void * , void *); void swap(void *p1, void *p2, int s) { int i; char *p3 = (char *)p1; char *p4 = (char *)p2; char t; for(i=0; i 2009. 7. 19. Function Pointer EX #include // 함수포인터 예제 // 컴파일해서 라이브러리로 보관(즉 이진 기계어 코드 형식으로) typedef int(*Compare)(int, int); // 결국 qsort()의 원리가 이처럼 함수를 인자로 받아서 sort 한다. // 알고리즘은 : sort 함수가 // sort 기준은 : 사용자가 void sort(int* x, int sz, Compare cmp) { int i, j, temp; for(i=0; i 2009. 7. 19. 함수 및 포인터 #include // 10 page => 복잡한 표현식. -> C에서 복잡한것은 배열 포인터 아니면 함수 포인터 밖에 없다. // int (*p)[2]; //배열 포인터 // void (*f)(int); //함수 포인터 (정확한 모양을 어딘가에 적어 놓으세요..) // fp1은 ? // 절대 아래 표현은 사용하면 안된다 !!! -> 하지만 해석할줄은 알아야 !! // 실제로는 typedef로 해야 한다 !! // 숙제 10 page 4가지 표현을 모두 typedef 바꾸어서 만들어 보세요 !!. void*(*(*fp1)(int)[10]; // 1. symbol을 찾아라 ! -> fp1 // 2. symbol 뒤가 "(" ==> 무조건 함수. // "[" ==> 무조건 배열. // ")[" ==> 무조건 .. 2009. 7. 19. Flexible Array // 1. Data Align - VC 에서는 #pragma pack (1) // 2. struct hack ==> flexible Array 이야기 #include #include // Data Align(정렬,기본적으로 4byte단위)로 개념 #pragma pack( 1 ) //모든 컴파일러 마다 다르다 (해당 컴파일러의 메뉴얼 참고) // 하지만 여기서 Align 개념을 정확히 익혀 두세요 ~~ //실행시 결정되는 크기의 배열을 사용하는 구조체 만들기. - "struct Hack" 이라는 기법. //1980년대 주로 사용 /* sizeof(People) ==> 8 struct People { int no; //학번 int jumsu[1]; // 과목수가 실행시까지 정해 지지 않았다면.! }; */ .. 2009. 7. 19. Error Handling //Assert()의 필요성.. 디버깅을 최대한 편하게.. // # 매크로에 대해서..-- 무슨 의미 일까? j 해당 심볼을 문자열로 풀어 달라. // ## 매크로 - win 32 배울때 사용하게 됩니다.. token paste // ### 없다 #include #define out( x ) printf("%d %d\n", x##1, x##2 ); void main() { int x1 = 10, x2 = 20; out( x ); } /* #define dprint( x ) printf( #x " = %d\n",x); void main() { int n =10; dprint(n/2); //printf("n" " = %d\n",x,n); pritnf("aaa" "bbb" "ccc"); //"aaabbbccc.. 2009. 7. 19. Dos Compilering & Make Asm 도스 컴파일 & 어셈블리 생성 // 결국 모든 컴파일러는 console 프로그램입니다. // 1. VC++의 경우 cl.exe --> 사용법 알아두기 !! // 2. "cl /help" 입력해보기 // 3. "cl a.c /Fa" a.asm 이 생성됩니다 // 결론 cl 컴파일러를 사용해서 C소스를가지고 어셈 코드 만드는법 꼭 기억하기..!! //VC++ compiler 이름 : cl.exe의 console application void foo(int a,int b) { a = 20; b = 20; } void main() { foo(1,2); // 인자의 전달은 마지막 인자 부터 stack을 통해서 전달한다 } 2009. 7. 19. Buffer OverFlow // 1. 함수 호출시 Stack의 모양을 정확히 알아두세요! // 2. 배열의잘못된 index 가 실행시 문제가 될수있다 (컴파일시 확인 안됨) #include #include #include // 아래 함수는 안전한가? void foo2(const char* p) { char buf[10]; strcpy(buf,p); // ?? 안전하지 않은함수 //방법 1 strncpy 사용 strncpy(buf,p,9); //방법 2 char* buf=(char*)malloc(strlen(p)+1); strcpy(buf,p); } void goo() {printf("goo\n"); exit(0);} void foo(int a, int b) { int x=0; int y[2]; y[4] = (int)goo; //어.. 2009. 7. 19. Asm Ex File //정리 // 1. flexible array. // 2. errno, strerror, peror // 3. assert() 는 왜 사용하는가? c가 지원 하지만 그래도 assert()만든 코드 // 4. goto 도 에러처리시에는 가끔 활용된다. // 5. # , ## 매크로 사용법 // 6. typedef를 사용하는 이유 // 7. PE Format(윈도우), flat binary format.. // ELF,COFF( linux/unix) #include char s1[] = "ABCD"; // 초기화된 전역 변수 .data section에 놓인다. char * s2 = "hello"; // s2는 전역 변수지만 " hello"는 상수이다 .rdata section에 있다. void main() .. 2009. 7. 19. 배열에 C언어 연구 #include //배열에 관한 여러가지 이야기들.. //============================================================================================== //1. 배열의 크기에 대해서.. /* void main() { //예전 방식의 C : const int sz =10; // int a[sz]; // sz가 가르키는 메모리에 가서 값을 꺼내게 된다. // 그래서 예전에는 #define sz 10 //99년 표준화 이후(C99) : int a[sz]; //sz가 10이라는 사실을 컴파일러가 // 또는 C++ //기억하고 있다가 사용 const int sz =10; //int sz =10; error int a[ sz ]; //?? .. 2009. 7. 19. 이전 1 ··· 22 23 24 25 26 27 28 ··· 34 다음