일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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# 윈폼
- docker
- c#
- Houdini
- github
- Flutter
- 깃
- jupyter
- 도커
- Python
- Algorithm
- Data Structure
- Unity
- 유니티
- dart 언어
- c언어
- git
- vim
- C++
- jupyter lab
- 다트 언어
- 구조체
- HTML
- C# delegate
- 포인터
- C언어 포인터
- c# 추상 클래스
- c# winform
- gitlab
- 플러터
- Today
- Total
목록Programming (313)
nomad-programmer
구조체 문법으로 비트 단위를 분리할 수 있다. #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)위한 목적으로 파일을 연다. 만약 파일이 지정한 경로에 없다면 그..
과거에는 컴퓨터 시스템의 메모리 용량이 작아 프로그래머들은 메모리를 최대한 적게 사용하도록 프로그램을 개발했다. 허나 최근 메모리 용량이 점차 늘면서 메모리를 더 사용하더라도 프로그램의 실행 속도가 향상되도록 프로그램을 개발하고 있다. 구조체의 경우 다양한 크기의 메모리를 하나의 그룹으로 묶어 사용하다 보니 구조체 요소를 접근할 때 실행 속도가 떨어지는 문제가 발생한다. 그래서 구조체의 요소를 일정한 크기로 정렬하여 실행 속도를 더 빠르게 하는 개념이 C언어 컴파일러에 추가되었다. 컴파일러마다 용어의 차이는 있지만 마이크로소프트에서 제공하는 C컴파일러의 경우에는 "구조체 멤버 정렬" 기능을 제공하며 1, 2, 4, 8바이트로 정렬 기준을 설정할 수 있다. #pragma warning(disable: 49..
visual studio에서 scanf 혹은 printf, getchar 등 함수를 쓰게되면 안전하지 않다는 오류가 발생한다. 이 오류는 쓰고 있는 함수들이 버퍼 오버플로우라는 위험을 가지고 있는 함수라 강력하게 제제하는 오류이다. 그래서 scanf함수는 scanf_s함수로, printf함수는 printf_s함수로 변경하여 사용하라는 메시지이다. 이 메시지를 비활성화하려면 아래와 같은 명령을 파일 최상단에 쓰면 된다. // 4996은 오류 메시지의 번호다. #pragma warning(disable: 4996)
typedef 는 타입을 정의한다는 의미의 "type define"의 줄임 표현이다. 기존의 자료형 중에 자료형 이름의 길이가 긴 경우 프로그래머가 짧고 간결하게 자료형을 재정의하는 문법이다. #define과 비슷해 보이지만 #define은 치환 작업을 수행하는 전처리기이고 typedef는 기존 자료형을 다른 이름으로 새롭게 정의하는 기능이다. 기존 자료형을 단순한 형태의 새 자료형으로 typedef 문법이 가장 흔하게 사용되는 경우는 기존 자료형의 이름이 너무 길어서 새로운 자료형으로 재정의해야 할 때이다. typedef unsigned short int US; // unsigned short int temp; 라고 선언한 것과 같다. US temp; 새롭게 정의했다는 의미를 전달하게 위해 새로 정의한..
https://nomad-programmer.tistory.com/87 [C] 2차원 배열 같은 2차원 포인터의 동적 할당 열의 개수가 행 별로 각기 다르다면 2차원 배열로 생성할 시 메모리 낭비가 불가피하다. 허나, 2차원 포인터로 동적 할당하여 2차원적으로 구조를 생성하면 메모리를 낭비하지 않는 타이트한 메� nomad-programmer.tistory.com 위의 2차원 포인터 동적 할당 포스터중의 예제에서 확장한 것이다. #include #include int main(void) { unsigned int*** arr3d; unsigned int cnt3d; unsigned int cnt2d; unsigned int cnt1d; unsigned int temp; fputs("x축 개수: ", st..
열의 개수가 행 별로 각기 다르다면 2차원 배열로 생성할 시 메모리 낭비가 불가피하다. 허나, 2차원 포인터로 동적 할당하여 2차원적으로 구조를 생성하면 메모리를 낭비하지 않는 타이트한 메모리 구조를 생성할 수 있다. #include #include int main(void) { unsigned int** arr2d; unsigned int cnt2d; unsigned int cnt1d; unsigned int temp; fputs("x축 개수: ", stdout); scanf_s("%d", &temp); arr2d = (int**)malloc(temp * sizeof(int*)); //cnt2d = temp; 아래의 연산과 같음. heap영역에 동적 할당하여 _msize함수 사용 cnt2d = (_ms..
#include #include #include #include void SetData(unsigned short** dst, unsigned short** src, const short size) { for (int i = 0; i < size; i++) { *(*(dst)+i) = *(*(src)+i); } } void Push(unsigned short** ptr, short* curt, const short value) { (*curt)++; unsigned short* new_data = (unsigned short*)malloc(((*curt) + 1) * sizeof(short)); SetData(&new_data, ptr, *curt); *(new_data + (*curt)) = value..
#include #include int main(void) { // depth가 2, 행이 3, 열이 4인 배열을 동적 할당으로 heap 영역에 할당. char (*data)[3][4] = (char***)malloc(sizeof(char) * 2 * 3 * 4); for (int i = 0; i < (2 * 3 * 4); i++) { *(*(*(data + (i / (3 * 4))) + ((i / 4)) % 3) + (i % 4)) = i; } for (int i = 0; i < (2 * 3 * 4); i++) { printf("%-2d ", *(*(*(data + (i / (3 * 4))) + ((i / 4)) % 3) + (i % 4))); if ((i % 4) == 3) { puts(""); } ..
#include int main(void) { char data[3][5] = { {0,}, {0,}, {0,} }; // 2차원 배열의 주소를 저장할 수 있는 포인터 char (*ptr)[5] = data; /* char형 주소값 2개를 저장할 수 있는 배열 */ // char* ptr2[2] = { &data[0][0], &data[1][2] }; // 위의 코드와 같은 초기화 선언이다. char* ptr2[2] = { &(*(*(data+0)+0)), &(*(*(data+1)+2)) }; // data[1][1]에 5저장 (*(ptr+1))[1] = 5; // data[2][0]에 77저장 ptr[2][0] = 77; // data[2][1]에 99저장 *(*(ptr + 2) + 1) = 99; /..
#include int main(void) { int arr[2] = { 0x12345678, 0x12345678 }; printf("%-20s: %p, %p\n", "original", arr[0], arr[1]); // 이렇게 인덱스로만 값을 대입시키면 4바이트 전체가 변경된다. arr[1] = 0x01; printf("%-20s: %p, %p\n", "arr[1]", arr[0], arr[1]); // 1바이트만 변경할 것이라 char 포인터형으로 변경 (char*)arr[1] = 0x01; printf("%-20s: %p, %p\n", "(char*)arr[1]", arr[0], arr[1]); // 1바이트만 변경할 것이라 char 포인터형으로 변경. (char*)arr[1] 과 같은 뜻. *(..
#include #include #include // 최대 길이 설정하여 arr에 문자열 저장 int GetString(char* arr, int limit) { for (int i = 0; i < limit; i++) { arr[i] = getchar(); if (arr[i] == '\n') { arr[i] = '\0'; return 1; } } // 표준 입력 버퍼를 비운다. rewind(stdin); arr[0] = '\0'; return 0; } // atoi 함수의 기능을 새롭게 정의하였다. int Str2Num(char* arr) { int res = 0; int cnt = 0; while (arr[cnt] != '\0') { res = (res * 10) + (arr[cnt] - '0'); ..
대상의 크기가 정해져 있지 않은 void *형 포인터 대상의 크기를 모른다면? 이때 사용하는 것이 바로 void 키워드이다. void 키워드는 '정해져 있지 않다'는 의미를 가지고 있다. void* ptr; 이렇게 선언하면 ptr에 주소 값을 저장할 수는 있지만 해당 주소에서 값을 읽거나 저장할 때 사용하는 크기는 정해져 있지 않다. 즉 사용할 메모리의 시작 주소만 알고 끝 주소를 모를 때 사용하는 포인터 형식이다. void 포인터는 가리킬 대상의 크기를 정한 것이 아니라서 어떤 크기의 메모리가 오든지 상관 없다. 그렇다면 void * 로 선언한 포인터 변수를 주소 값만 저장하는 용도로 사용하는 것은 아니다. 적절한 형 변환을 거쳐 '사용할 크기'를 표기해 주면 일반 포인터처럼 사용할 수 있다. int ..
// 총 4바이트 0x12345678 빅 엔디안 - 리눅스, 유닉스 등은 빅 엔디안 방식이다. 큰 수의 비트부터 읽어 들이고 메모리에 저장할 때도 마찬가지로 큰 비트를 먼저 메모리에 올린다. 즉, 위의 16진수 같은 값이 있다면 0xAAA1 주소에 0x12가 올라가고 그 다음 0xAAA2 주소에 0x34 값이 올라가고 그 다음 0XAAA3 주소에 0x56 값이 올라가고 마지막 0x78은 0xAAA4 주소에 올라간다. 0xAAA4 0x78 0xAAA3 0x56 0xAAA2 0x34 0xAAA1 0x12 위의 표 처럼 메모리에 올라간다. 리틀 엔디안 - 윈도우즈는 리틀 엔디안 방식이다. 작은 수의 비트부터 읽어 들이고 메모리에 저장할 때도 마찬가지로 작은 비트를 먼저 메모리에 올린다. 0xAAA4 0x12 ..
// 일반 변수 상수화: tmp변수는 10이라는 값을 가지고 다른 값을 가질 수 없도록 상수화한다. const int tmp = 10; // 포인터 상수화 // 대상을 상수화: ptr 포인터가 tmp로 접근하여 tmp의 값을 변경하지 못하도록 상수화. 즉, // *ptr 연산으로 tmp 값을 변경하지 못한다. const int * ptr = &tmp; // 자신을 상수화: ptr 포인터는 오직 tmp의 주소 값을 가리킨다. 다른 주소를 가리키지 못하도록 상수화한다. int * const ptr = &tmp; // tmp의 주소만 가리킬 수 있고 tmp의 값을 변경하지 못한다. const int * const ptr = &tmp;
https://stackoverflow.com/questions/54793354/qsortfilterproxymodel-with-dates-and-sqlite QSortFilterProxyModel with dates and sqlite I have reimplemented this example on PyQt5 almost verbatim. The problem in this example is: it assumes you are entering a QDate in the model, but in my case the model is taken from an sqlite DB the... stackoverflow.com