일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 구조체
- 유니티
- 플러터
- c# winform
- c#
- 다트 언어
- docker
- C# delegate
- github
- Algorithm
- Python
- vim
- c언어
- Data Structure
- 깃
- gitlab
- c# 윈폼
- HTML
- Unity
- 도커
- git
- jupyter
- Flutter
- C++
- jupyter lab
- dart 언어
- Houdini
- 포인터
- C언어 포인터
- c# 추상 클래스
- Today
- Total
목록전체 글 (507)
nomad-programmer
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/lR6qA/btqVnY75SVS/snAkmGISsZ5EUAr9qkGUr1/img.png)
가상함수 말고도 virtual 키워드를 붙여줘야 할 대상이 하나 더 있다. 그것은 바로 '소멸자'이다. 즉, virtual 선언은 소멸자에도 올 수 있다. 가상 소멸자(Virtual Destructor) virtual로 선언된 소멸자를 가리켜 '가상 소멸자'라 부른다. 다음의 예를 살펴보자. #include #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class First { private: char* strOne; public: explicit First(const char* str) { cout
함수를 override 했다는 것은, 해당 객체에서 호출되어야 하는 함수를 바꾼다는 의미이다. 하지만 포인터 변수의 자료형에 따라 호출되는 함수 종류가 달라지는 것은 문제가 있다. 다음의 예제를 보자. #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class First { public: void MyFunc() { cout
다음은 List 사용의 main.c 파일의 내용이다. #include #include #include "List.h" /* clinet */ void* AllocData(double data){ double* p = (double*)malloc(sizeof(double)); *p = data; return p; } void FreeData(void* p){ free(p); } void PrintPrevious(LIST* lst){ printf("prev: "); for(ResetTailPos(lst); HasPrevious(lst); Previous(lst)){ printf("%lf ", *(double*)GetItem(lst)); } puts(""); } void PrintNext(LIST* lst){..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/LhMW9/btqUwyuupEO/YjKkBjhBrtjdXPpEy5kVb0/img.png)
비트 필드는 구조체와 흡사하나 구조체는 바이트 단위로 멤버를 사용할 수있지만 비트 필드는 비트 단위로 멤버를 사용할 수 있다. 그래서 많은 상태를 저장하거나 비트별로 제어해야 하는 경우에 비트 필드를 사용한다. 비트 필드의 멤버는 unsigned형(unsigned int형)과 int형의 멤버를 가질 수 있고 비트 필드 변수의 크기는 int형 크기와 같은 4바이트(32비트)이다. signed와 unsigned는 char, short, int, long 등의 자료형 앞에 사용되어 부호가 있는 정수와 부호가 없는 정수를 나타내는 자료형으로 사용되며 signed는 보통 생략하여 사용한다. 비트 필드처럼 unsigned가 단독으로 사용되면 unsigned int형을 간략하게 표현한 형태이다. 다음은 비트 필드를 ..
#include #include #include void Menu(){ puts(""); puts("1. 문자열 입력"); puts("2. 문자열 삭제"); puts("3. 문자열 출력"); puts("4. 문자열 정렬"); puts("5. 종료"); } void ClearBuffer(){ while(getchar() != '\n'); } char* Input(){ char temp[100]; char* str; printf("100자 이하의 문자 입력: "); scanf("%s", temp); ClearBuffer(); str = (char*)malloc(sizeof(char)*strlen(temp)+1); strcpy(str, temp); return str; } void Remove(char* st..
다음은 9 X 9 배열을 포인터 변수 int (*arr)[3][3]에 저장하여 메모리에 사용하는 응용 예제이다. #include #include typedef int (*ARR9)[9]; typedef int (*ARR33)[3][3]; // int (*arr)[9] void PrintArray(ARR9 arr){ for(int i=0; i
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/eci6jp/btqT6IFHq8d/QRVnMAtLo3KW2ktCbELKQ0/img.png)
원하든 그림과 회사 이름 등을 넣으면 자동으로 로고를 만들어주는 사이트를 소개한다. app.logopony.com/en/details/ Logopony app.logopony.com 이렇게 자동으로 만들어주는 로고를 참고하여 더 창의적인 로고를 생성하면 좋을 듯 싶다.
다음은 쉬프트 비트 연산을 이용하여 4바이트를 2바이트로 분할하는 예제이다. #include #define LOWORD(x) ((unsigned short)x) #define HIWORD(x) ((unsigned int)x >> 16 & 0xFFFF) int main(int argc, const char * argv[]) { int n = 0x44434241; printf("%x\n", LOWORD(n)); printf("%x\n", HIWORD(n)); return 0; } */ 결과 4241 4443 */ 다음은 1바이트의 두 정수를 2바이트로 2바이트의 두 정수를 4바이트로 결합하는 예제이다. #include typedef unsigned char BYTE; typedef unsigned short..
XOR를 이용하면 손쉽게 데이터를 교환할 수 있다. 예를 들어, 연산 결과를 F라 하면 F^a 는 b가 되고 F^b는 a가 된다. 다음의 예제를 살펴보자. #include // 매크로를 이용한 데이터 교환 #define SWAP(a, b) { a^=b; b^=a; a^=b; } // 함수를 이용한 데이터 교환 void Swap(int* a, int* b){ *a ^= *b; *b ^= *a; *a ^= *b; } int main(int argc, const char * argv[]) { int a = 10; int b = 20; printf("a: %d, b: %d\n", a, b); Swap(&a, &b); printf("a: %d, b: %d\n", a, b); SWAP(a, b); printf("a..
가변 인자가 특정 자료형이 아닌 여러 자료형이 전달된다면 첫 번째 인자에 인자의 개수와 자료형의 정보까지도 전달해야 한다. 그래서 printf()와 같은 함수는 첫 번째 인자를 문자열로 만들고 '%c, %d, %s' 등을 사용하여 자료형과 인자의 개수를 전달한다. '%c' 이면 문자를 인자로 전달하고, '%d' 이면 정수를 인자로 전달하고, '%s' 이면 문자열의 시작 주소를 인자로 전달한다. #include #include #include void MiniPrintf(char *fmt, ...){ int i = 0; va_list ap; va_start(ap, fmt); while(fmt[i] != '\0'){ if(fmt[i] != '%'){ putchar(fmt[i]); } else{ switch(..
포인터의 선언과 그 포인터의 의미 단순한 포인터 선언 타입 의미 int* np; 1차원 포인터 int형의 주소를 저장 int** npp; 2차원 포인터 int형의 2차원 주소를 저장 단순한 배열 선언 타입 의미 int arr[3]; 1차원 배열 int형 값들을 저장 int arr[2][3]; 2차원 배열 int형 값들을 저장 배열과 포인터 선언 타입 의미 int* arr[3]; 1차원 포인터 배열 int형 주소값 3개를 저장 int (*arr)[3]; 2차원 배열 포인터 포인터 연산시, int형 3개를 건너뛰는 2차원 배열 포인터이며 2차원 배열의 주소를 저장 int (*arr)[2][3]; 3차원 배열 포인터 포인터 연산시, int형 2x3개를 건너뛰는 3차원 배열 포인터이며 3차원 배열의 주소를 저장..
구조체는 멤버 변수들의 크기에 따라 구조체의 크기가 결정되지만 구조체의 크기를 예측하여 동적 메모리를 생성하거나, 파일에 저장하거나, 네트워크에 전송하는 등의 작업을 하면 예상했던 구조체의 크기와 달라 오류가 발생하는 경우가 있다. 이유는 컴파일러가 프로그램 성능을 향상시키기 위하여 일정한 크기 형태로 구조체 변수들을 주소에 매핑시키기 때문이다. 매핑 : 패딩 바이트를 추가한 바이트 정렬 그래서 구조체의 크기는 모든 멤버 변수 크기의 합과 다를 수 있다. 다음은 구조체의 크기를 출력하는 예이다. #include typedef struct { char c; int n; } _data1; typedef struct { short s; int n; } _data2; typedef struct { int n1;..