본문 바로가기

Programming/C Programming

STL sort example (c++) with class, struct #include #include #include #include using namespace std; class t_A{public:int a;int b;}; #defineMAX30 t_Ag_AA[3][MAX]; bool comp_A(const t_A& a, const t_A& b) {return a.b < b.b;} void test_A_sort(){t_A* g_A = g_AA[0]; //initfor (int i = 0; i < MAX; i++) {g_A[i].a = i;g_A[i].b = i%7;} sort(g_A, g_A + MAX, comp_A); for (int i = 0; i < MAX; i++) {printf("%d %d\n", g_A[i].a, g_A[i].b);}} ///////////.. 더보기
cpp 의 sort 사용하기 예제 #include #include #include #include using namespace std; bool cmp(int a, int b) { return a 더보기
strcmp 함수의 모호한 return value strcmp 함수는 스트링간 포함여부를 찾는데는 사용하기 어렵다. strstr 이나 strchar 를 사용해야 한다.두 string 이 완전히 동일한지만 판단이 용이하다. #include //#include #include #include #include #include #include #include // O_WRONLY#include // strlen() #define BUFF_SIZE 1024 int main(){ const char* standard = "12345"; const char* standard2 = "0123456"; const char* wrong = "a12"; const char* part = "234"; int rst=0; rst = strcmp(standard, standar.. 더보기
이차원 배열(포인터) 활용 int arr[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };int (*bbb)[3] = arr+1;printf("%d\n", bbb[0][0]); 출력 4 이중 배열의 주소를 1중 배열로 받아서 쓰기 #define MAX128int g_arr[MAX * 2][MAX];int(*g_arr_128)[MAX] = g_arr;int(*g_arr_64)[MAX] = g_arr + 128;int(*g_arr_32)[MAX] = g_arr + 128 + 64;int(*g_arr_16)[MAX] = g_arr + 128 + 64 + 32;int(*g_arr_8)[MAX] = g_arr + 128 + 64 + 32 + 16;int(*g_arr_4)[MAX] = g_arr + .. 더보기
화면 출력을 버퍼로 변경하기 원문 : http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=243592745&qb=c2V0YnVmKHN0ZG91dCwgTlVMTCk7&enc=utf8§ion=kin&rank=1&search_sort=0&spq=0 setbuf는 http://www.cplusplus.com/reference/cstdio/setbuf/에 잘나와있네요파일 스트림을 버퍼로 리다이렉션하는 함수입니다.다음 예제에서setbuf(stdout,but);히면 그이후부터 printf의 결과는 화면으로 가지않고 버퍼(buf)에 가게 됩니다.setbuf(stdout,NULL);하면 설정한 버퍼를 해제하는 것으로 이후의 printf의 결과는 화면으로 출력되게 됩니다. 더보기
stdout 출력을 file 로 돌리기 static const char *TEMPORARY_LOG_FILE = "/tmp/recovery.log"; intmain(int argc, char **argv) { time_t start = time(NULL); redirect_stdio(TEMPORARY_LOG_FILE); 더보기
printf / printk 에서 %p 사용방법 %p : 주로 변수가 가지고 있는 주소값을 출력하는데 사용함. - 변수가 저장된 주소값을 출력해주는 것이 아니라, 변수가 저장하고 있는 주소값을 출력해줌- 16진수 address 로 출력해줌.- 앞에 0x 를 붙이지 않아도 알아서 출력해줌.- 주소값을 가지고 있는 void* , char* 등은 그대로 출력unsigned char* data;printf("data(%p)\n" data);- 배열은 앞에 '&'를 붙여야 함.printf("%s() psrc[d]=%p, psrc[t]=%p\n", __func__, &psrc[d], &psrc[t]); 추가하고 싶은 내용%x 와 %p 의 출력 차이점. 더보기
#if 로 define 을 하면 좋은점. define 을 선언할때 #define __CONFIG_A__ 1 로 선언해 놓고 #ifdef __CONFING_A__ 가 아닌 #if __CONFIG_A__ 로 하면 나중에 개발이 완료된후 define 문들을 삭제할때 간편하다. source insight 같은 tool 에서 찾아 바꾸기 기능을 이용해서 "__CONFIG_A__" -> "0 /*__CONFIG_A__*/" 로 변환하면#if 들이 자동으로 disable 되면서 구별이 된다. 더보기
volatile keyword "비휘발성" 이라는 의미로,컴파일러에게 임의의 최적화를 금지할때 쓰는 키워드 이다. #define LCD_RAM (*((volatile unsigned short *) 0x60020000)) /* RS = 1 */ 이런식으로 address 에 직접 access 할때,저장공간을 컴파일러가 최적화 하여, r3 나 r5 로 변경해 버리면 곤란할 것이다. 또한, HW 에 의해서 지속적으로 변경되는 데이터를 담고 있다면,이또한 read 할때마다, 값이 update 되어야 하는데컴파일러 최적화는 이를 방해하는 요소가 된다. 이러한 것들을 피할때 volatile keyword 를 사용한다. 단, 추가 첨언을 하자면..The rule of thumb in Linux kernel programming is that if.. 더보기
The cost of inline functions The cost of inline functions [Posted April 28, 2004 by corbet] The kernel makes heavy use of inline functions. In many cases, inline expansion of functions is necessary; some of these functions employ various sorts of assembly language trickery that must be part of the calling function. In many other cases, though, inline functions are used as a way of improving performance. The thinking is that.. 더보기
배열 초기화 선언 int aaaa[10] = {2,}; 로 선언하면 어떻게 저장될까요? ... 정답은 {2, 0, 0, 0, 0, 0, 0, 0, 0, 0} 나는 2로 다 채워주는 줄 알았을 뿐이고..;;; 더보기
c 와 c++ 의 const 내용정리 학생때 쓴 강좌인데 필요로 하시는 분들이 계시내요. 참고 하세요. 아래 static부분이 어서 const 정리 내용입니다. 순서는 다음과 같습니다. 1. const 2. 배열과 const 3. const와 Intenal Linkage 4. 포인터의 const 5. const 함수 6. const 멤버변수 7. const 멤버함수 8. 함수의 파라미터를 (const &)로 쓰자! 빼먹은 부분없이 정리해 볼려고 했는데.. 잘 되었는지는 모르겠내요. 읽어보시고 틀린곳이나 추가할 부분은 지적해 주세요. 많은 도움되길 바랍니다. ^^ =============================================================================== 과거에 상수를 정의할때는 메크로를 썻다.. 더보기
c 와 c++ 의 static 내용정리 학생때 적어놓았던 강좌인데 필요로 하시는 분들이 계시내요. 참고하세요. static와 const를 생각나는데로 죽~ 정리해 봤습니다. static부분 순서는 다음과 같습니다. 1. static 지역변수 - 1 2. static 지역변수 - 2 : 배열/포인터를 리턴하는 함수 3. static 전역변수 4. static 함수 5. static 멤버변수 6. static 멤버함수 빼먹은것 없이 정리할려고 했는데, 잘 되었는지 모르겠군요. 혹시 보시고 틀리거나 잘못된 사항 있으면 지적해 주시구요.. 많은 도움 되었으면 합니다.^^ ================================================================ #include using namespace std; void f.. 더보기
해킹방지를 위한 코딩법 네이버에 이런기사가 뜨다니.. 하핫 x86 에만 적용되는 내용도 있지만.. (예를 들면 break point 에 대한 내용, ARM에서는 bp를 위한 Asm 이 존재하지 않는다) 상당히 잼있는 내용들이다. - 해킹방지를 위한 코딩법 - http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=35757 더보기
__read_mostly keyword linux kernel source 를 분석중 생소한 keyword 가 눈에 띄어서 posting 해 본다. 원문 : http://pyun9998.springnote.com/pages/1318976?print=1 리눅스 커널 소스에서 전역변수 뒤에 __read_mostly 라고 선언한 코드를 볼 수 있습니다. 예를 들면 이런 식이죠. static struct list_head ptype_all __read_mostly; __read_mostly 로 선언한 변수들은 말 그대로 주로 읽히기만 하는 변수들로서 __read_mostly 를 사용한 전역변수들은 실행이미지에서 인접한 주소 영역에 그룹으로 위치하게 됩니다. 이렇게 되는 이유는 SMP 시스템에서 성능을 높이기 위해서입니다. CPU 는 캐쉬라인 사이즈 .. 더보기
전처리기 사용 : define ## 오랫만에 C에 대한 내용으로 포스팅을 하는군요. 개발을 하다 포트 번호에 따라 다른 레지스터를 사용해야 하는 일이 있었는데요. 레지스터를 보니 포트 번호에 따라 숫자만 다르고 같은 문자열을 가지더군요. S3C2410_TCON_T1MANUALUPD S3C2410_TCON_T2MANUALUPD S3C2410_TCON_T3MANUALUPD 이런식의 레지스터가 여러게가 있어서 레지스터가 하나 변경될때마다 여기저기 찾아다니며 수작업을 해주어야 합니다. 포트를 진행하는 모델에 따라 변경해야 하는데 이걸 하드코딩으로 하자니 왠지 폼이 안나구요.. 실수라도 하는 날엔 디버깅으로 날려먹을 시간을 생각하니 먼가 "다이나믹"하게 적용하고 싶더군요. 그래서 아래와 같이 작업을 해 보았습니다. #define PWM_PORT_N.. 더보기
struct 변수 사용 bit 한계 설정하기 다음과 같이 사용이 가능하다. struct i2c_gpio_platform_data { unsigned int sda_pin; unsigned int scl_pin; int udelay; int timeout; unsigned int sda_is_open_drain:1; unsigned int scl_is_open_drain:1; unsigned int scl_is_output_only:1; }; 이것의 의미는 해당 변수에서 오로지 N bit 만 사용하겠다는 의미 이다. 즉, 변수 사용상의 명확성을 준 것이다. 그리고 선언시에만 가능하다. 간단히 Test code 를 보자. // 각각 1, 2 ,3 bit 만 사용하도록 set struct AAA{ unsigned int a:1; unsigned int .. 더보기
[TIP] easy mistake casting buffer 사이즈가 다른 배열을 케스팅 하면 어떨게 될까? unsigned short (size 2 byte) 0x1234 0xabcd 0x00ff 0xff00 ==> casting char (size 1 byte) ? ? ? ? ? ? ? ? 쉽게 다음을 생각할 수 있을것입니다. 0x12 0x34 0xab 0xcd 0x00 0xff 0xff 0x00 하지만, 결과는 다르다는것.. byte ordering 의 차이가 있기 때문이지요. int i=0; unsigned short temp_data[4]={0x1234, 0xabcd, 0x00ff, 0xff00}; unsigned char* pConData = (unsigned char*)temp_data; unsigned char buf[2]; printk("[CAM].. 더보기
AtoH function 리눅스 커널에는 기본적인 함수들이 없다보니 구현해서 쓰게 된다 ;; static int ishex (char ch) { if (((ch>='0') && (ch ='a') && (ch ='A') && (ch = '0') && (ch = 'a') && (ch = 'A') && (ch 더보기
해더파일을 통한 배열 입력 Linux 바닐라 커널에 다음과 같은 코드가 있다. struct sysent { int nargs; int sys_flags; int (*sys_func)(); const char *sys_name; long native_scno; /* Match against SYS_* constants. */ }; const struct sysent *sysent; static const struct sysent sysent0[] = { #include "syscallent.h" }; // "syscallent.h" { 0, 0, sys_restart_syscall, "restart_syscall"}, /* 0 */ { 1, TP, sys_exit, "exit" }, /* 1 */ { 0, TP, sys_fork, .. 더보기