일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- c# winform
- 다트 언어
- C++
- c# 추상 클래스
- 도커
- c# 윈폼
- gitlab
- Houdini
- Flutter
- git
- 깃
- c#
- vim
- jupyter
- 유니티
- c언어
- HTML
- 포인터
- jupyter lab
- dart 언어
- github
- Data Structure
- 플러터
- C언어 포인터
- docker
- Python
- Algorithm
- 구조체
- Unity
- C# delegate
- Today
- Total
목록전체 글 (507)
nomad-programmer

xrandr --listmonitors 위의 명령으로 현재 연결되어있는 모니터들의 id를 볼 수 있다. 본인은 위와 같은 모니터로 셋팅하여 사용중이다. 즉, 왼쪽의 모니터는 세로로 돌려 사용중이다. 허나 현재 우분투 20.04 LTS 를 사용중인데 재부팅만하면 아래와 같은 그림의 배열로 리셋이 되어버린다. 그렇다고 매번 nvidia-setting을 열어 다시 재배열하기는 너무 귀찮은 일이다. 그래서 xrandr 명령을 이용하기로 하였다. 모니터 재배열을 위한 Shell Script 만들기 /* start_xrandr.sh */ #!/bin/bash xrandr --auto --output DP-4 --rotate left --mode 1920x1200 --left-of DP-0 모니터 1번 (세로 모니터..
가변 개수의 인자를 받는 함수를 가변 인자 함수(Variadic Function)라고 한다. C 표준 라이브러리에는 직접 가변 인자 함수를 만들 수 있게 도와주는 여러 매크로(Macro)를 포함하고 있다. #include // 가변 인자 함수를 정의하려면 stdarg.h 파일을 인클루드해야 한다. #include // 가변 인자 함수 int print_ints(int args, ...){ int tmp; int sum = 0; va_list ap; // 어디에서부터 가변 인자가 시작되는지 알려준다. va_start(ap, args); // 모든 가변 인자 출력 for(int i=0; i
열거형을 구조체의 멤버로 등록하고 사용하는 예제이다. #include // 열거형 정의 enum play_type { RUN, STOP, ATTACK }; // response 구조체안에 열거형을 멤버로 넣었다. typedef struct { char *name; enum play_type type; } response; void run(response r) { printf("%s\n", r.name); puts("run!"); } void stop(response r) { printf("%s\n", r.name); puts("stop!"); } void attack(response r) { printf("%s\n", r.name); puts("attack!"); } int main(void) { res..

대규모의 복잡한 프로그램에서 버그를 찾으려면 정말 오랜 시간이 걸릴 수도 있다. 그래서 다양한 도구들을 이용하여 찾아내 수정해야 한다. 그 도구 중 valgrind를 소개한다. 리눅스 운영체제에서 사용하는 도구 중 "valgrind" 라는 것이 있다. 한마디로 메모리 누수를 검사하는 프로그램이다. valgrind 는 heap 영역에 할당된 데이터를 감시할 수 있다. 이 프로그램은 가짜 malloc() 함수를 구현해 작동한다. 여러분의 프로그램이 heap 메모리에 할당할 때 valgrind는 malloc()과 free() 함수에 대한 호출을 가로채 자신이 만든 버전을 실행한다. valgrind가 구현한 가짜 malloc()은 어느 코드가 호출하는지 어느 메모리가 할당되었는지 기록한다. 프로그램이 실행을 마..
#include int main(){ char word[10]; int i = 0; // format을 %9s로 지정하면 최대 9개 문자를 word에 저장한다 // 마지막 문자는 널 문자가 들어간다. while(scanf("%9s", word) == 1){ i++; if(i % 2){ fprintf(stdout, "%s\n", word); } else{ fprintf(stderr, "%s\n", word); } } return 0; } /* string.txt 내용 redirection 예제를 만들어 보았다. 이 예제는 리눅스 혹은 맥에서 실행해야 한다. C언어 소스파일에서 표준출력, 표준에러를 발생하고 그것을 활용하는 예제이다. */ // 컴파일 & 실행 /* gcc redirection_exam.c ..
#include #include void Reverse(char* str) { int len = strlen(str) - 1; char* ptr = str + len; while (ptr >= str) { printf("%c", *ptr); ptr--; } } int main(void) { char* str = "Hello World!!"; Reverse(str); return 0; } // 결과 /* !!dlroW olleH */ ptr 포인터 변수를 널 문자 바로 앞으로 이동시킨 후 포인터 연산을 통하여 처음의 메모리 주소 값으로 점차 다가가도록 하였다. 즉, ptr 포인터 변수는 문자열 끝을 가리키다가 맨 처음으로 돌아오고 반복이 종료된다.
구조체 문법으로 비트 단위를 분리할 수 있다. #pragma warning(disable: 4996) #include // 비트 단위 정보를 다룰 수 있도록 구조체를 선언 (총 1바이트) // 구조체 멤버 하나하나가 1비트 struct BitType { unsigned char bit_0 : 1; unsigned char bit_1 : 1; unsigned char bit_2 : 1; unsigned char bit_3 : 1; unsigned char bit_4 : 1; unsigned char bit_5 : 1; unsigned char bit_6 : 1; unsigned char bit_7 : 1; // 최상위 비트 (MSB) }; int main(void) { struct BitType data;..
공용체를 적재적소에 활용하면 메모리를 절약할 수 있다. 사용자 정의 자료형을 만드는 구조체와 문법 구조가 비슷한 공용체 문법이 있다. 공용체의 요소들은 할당된 메모리를 공유한다. union SharedData { char c_data; short int s_data; int i_data; }; 공용체를 구성하는 각 요소들은 서로 같은 메모리를 공유하는 형태로 된다. SharedData 공용체는 총 4바이트를 사용한다. // 리틀 엔디안 방식이라고 가정 union SharedData tmp; tmp.i_data = 0x12345678; 위와 같이 값을 대입하면 c_data는 0x78, s_data는 0x78 0x56, i_data는 0x78 0x56 0x34 0x12 가 들어간다. #pragma warni..

모든 프로그래머가 완제품 형식의 프로그램을 만들지는 않는다. 프로그래머는 자신의 코드가 노출되면 안되기 때문에 해당 코드를 컴파일해서 라이브러리(*.lib) 형식의 파일로 제공한다. 그리고 라이브러리 안에 있는 함수들이 어떤 형태로 선언된 함수인지 알아야 코드를 자세히 볼 수 없는 사용자들도 사용할 수 있기 때문에 함수의 원형들을 헤더(*.h) 파일에 적어서 함께 제공한다. 예를 들어 두 개의 정수 값을 넘겨 받아서 합산하는 Sum 함수를 라이브러리 형태로 제공한다고 가정하면, 라이브러리 사용자에게는 파일 내부를 볼 수 없는 라이브러리 파일 sum.lib와 라이브러리 파일을 설명하는 헤더 파일 sum.h를 모두 제공해야 한다. // 헤더 파일 sum.h // sum 함수의 원형 int sum(int a,..
함수 포인터(Function Pointer)란 특정 함수를 구성하는 시작 명령의 위치를 가리키는 포인터이다. 함수 포인터를 사용하면 해당하는 함수를 호출하여 실행할 수 있다. 데이터를 가리키는 포인터가 자신이 가리킬 대상의 크기를 명시하듯 함수 포인터는 함수 원형(Function Prototype)을 사용하여 포인터를 선언한다. 더보기 함수 포인터가 함수 원형을 사용하는 이유는 함수 원형을 알아야 함수를 호출할 때 스택 프레임을 구성할 수 있기 때문이다. * 스택 프레임: 스택을 함수 단위로 구역을 나눠 사용할 수 있도록 C언어에서 제공하는 스택 관리 방식. 원형이 같은 함수들 묶기 함수 포인터를 사용하는 가장 큰 이유는 같은 형식의 함수를 그룹으로 묶을 수 있기 때문이다. #pragma warning(..
파일 내부의 작업 위치 탐색 및 확인: fseek, ftell 함수 fseek 함수 파일에 저장된 데이터를 꼭 순차적으로 읽을 필요는 없다. 필요에 따라 fseek함수를 사용하여 원하는 위치로 건너뛰거나, 읽은 위치로 돌아가서 읽었던 데이터를 다시 읽을 수도 있다. // fseek 함수 원형 int fseek(FILE* stream, long offset, int origin); // 함수 사용 형식 fseek(파일 포인터, 이동 거리, 기준 위치); 이 함수는 파일의 데이터를 읽을 기준 위치로 다음과 같은 명령이 존재한다. * SEEK_SET: 파일의 시작 * SEEK_END: 파일의 끝 * SEEK_CUR: 현재 위치 이것들을 이용하여 지정한 기준 위치로부터 사용자가 지정한 "이동 거리" 만큼 이동한..
형식 설명 t 텍스트 속성으로 파일을 사용하겠다는 뜻. 이것으로 바이너리 파일을 열면 오류 발생. 이유는 텍스트 파일은 EOF라는 아스키 값을 사용하여 파일의 끝을 구별하는데 바이러니 파일에서는 찾을 수 없다. b 바이너리 속성의 파일을 사용한다는 뜻. 이 형식이 기본값. 그러므로 형식 지정에 t 또는 b가 없다면 기본적으로 바이너리 형식을 사용한다고 보면 된다. 파일 내용 읽기 모드 "r" 파일의 내용을 읽기(Read)위한 목적으로 파일을 연다. FILE* file = fopen("tmp.bin", "rb"); FILE* file = fopen("tmp.txt", "rt"); 파일 데이터 쓰기 모드 "w" 파일에 데이터를 쓰기(Write)위한 목적으로 파일을 연다. 만약 파일이 지정한 경로에 없다면 그..