C언어 Windows.h Winsock2.h Incude 에러
Windows.h와 Winsock2.h를 활용하면, 가장 하단의 내용과 같이 에러가 발생할 수 있다. 해결방법은 생각보다 간단한데, Inlcude 순서를 변경하면 된다. 변경 전과, 변경 후를 비교해보자. 변경 전 #include #include #include #include #include #include 변겅 후 #include #include #include #include #include #include 에러 심각도코드설명프로젝트파일줄비표시 오류(Suppression) 상태 오류(활성)E0040식별자가 필요합니다."프로젝트명"C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared\ws2def.h437 오류(활성)E0040식별자가 필..
2023.07.20
no image
'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings 에러
에러상황 오류 C4996 'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings ’프로젝트 이름’ ’경로/파일 이름’ 해결방법 위와 같은 에러 발생 시, SDL 검사를 아니오(해제)한다.
2023.07.20
C언어 !! 이중 부정 연산자
이중 부정 연산자란 C언어에서 라이브러리를 활용하다 보면 두 개의 논리 부정 연산자(!)를 쓴 경우를 볼 수 있다. 이중 부정 연산자는 피연산자를 부정한 후 다시 부정하는 셈이다. 언뜻 보면 의미가 없어 보이지만, 이중 부정 연산자는 피연산자를 boolean값으로 변환하는 효과가 있다. 예를 들어, !!(expression)은 expression을 boolean 값으로 변환하여 반환하는 것이다. 이중 부정 연산자 사용 이유 이중 부정 연산자를 사용하는 이유는, 표현식의 결과를 강제로 boolean값으로 변환하기 위해서다. boolean값으로 변환된 표현식은 0 또는 1과 같은 정수로 나타내지 않아도 된다는 이점이 있다. 이 외에도, 코드의 가독성이 높아지거나, 불필요한 형변환이나 오류 발생 가능성을 줄이..
2023.07.20
C언어 가변길이 배열 파라미터로 입력받기
요약 C언어에서 가변길이의 배열을 파라미터로 입력받을 수 있다. 일반적인 형태는 아니지만, C언어에서 자유도를 좀 더 높여주는 역할을 한다. 일반적인 코드와 가장 큰 첫 번째 차이는 파라미터에 , ... 처럼 새로운 형태의 파라미터를 추가흐는 것이다. 두 번째는 아래 함수들을 활용하는 것이다. va_list() va_start() va_arg() 아래 예시 코드를 보면 좀 더 이해를 통해 상세히 이해해보도록 하자. 예시 코드 void copyArr(uint8_t * data, uint8_t num, ...) { uint8_t *p; p = data; va_list ap; va_start(ap, num); for (int i = 0; i < num; i++) { *p = va_arg(ap, uint8_t)..
2023.04.16
.h 파일과 .c 파일
.h 파일과 .c 파일의 관계 컴파일러의 역할에 따라 .h파일만 잘 구성되면 .c파일을 잘 찾아간다.. 예) 컴파일러 혹은 그 밑단의 무언가가 .h파일을 찾으면, 이와 관련되 .c파일(또는 정의된 내용)을 알아서 찾는다. .h 파일과 .c파일의 용도 구분 용도 .h 함수, 변수, 매크로 등의 선언 .c 순수 소스 코드 파일 함수 및 변수의 구현을 포함 컴파일러가 컴파일하여 실행파일을 생성하는데 사용 공통 컴파일러는 일반적으로 헤더파일을 처리하여 컴파일 시간에 함수 및 변수를 선언 헤더는 일반적으로 컴파일 안되고 .C파일만이 컴파일됨
2023.04.16
C언어 배열 복사하기 배열 / memcpy / 포인터
C언어에서 배열을 복사하는 여러 방법이 있습니다. 배열의 값을 직접 대입하거나, memcpy를 사용할 수도 있습니다. 임베디드 환경에서는 간혹 memcpy를 지원하지 않거나, 원하는 동작을 안하는 경우가 있어서 포인터를 이용해서 활용하기도 했습니다. 기호에 맞게 사용하시면 됩니다. 전체코드 Option 1 : 배열값 직접 대인 Option 2 : memcpy 함수 활용 Option 3 : 포인터 활용 #include #include int main(void) { int i; unsigned char myBuf[100]; unsigned char cpyBuf[100]; for(i=0; i
2022.03.11
C언어 구조체 선언 및 포인터 접근 예제
1. 정리 구조체를 선언하고 구조체 문법을 통해 접근하는 방식과 포인터로 1Byte 씩, 접근하는 예제입니다. 먼저, 5Byte의 my_struct 구조체를 선언하겠습니다. 구조체는 안에는 1Byte씩 할당된 변수들인 Rsv0~4까지 존재합니다. typedef struct { uint8_t Rsv0; uint8_t Rsv1; uint8_t Rsv2; uint8_t Rsv3; uint8_t Rsv4; }_my_struct; _my_struct my_struct; 차후에 사용될, 변수 i와 1Byte 포인터를 선언하겠습니다. 그리고 구조체를 구조체 문법형태로 접근하여 값을 넣고, 출력하겠습니다. 각각의 구조체 변수에 0~4값이 저장됩니다. 출력하면 다음과 같은 형태로 출력됩니다. 출력: 0, 1, 2, 3,..
2022.02.20
C언어 상수 선언을 위한 Const 예제
1. 정리 const는 변하지 않는 상수 변수기 때문에 선언과 초기화를 동시에 해줘야 합니다. 먼저, 전역변수로 arr_adc라는 const 배열을 선언하겠습니다. uint8_t const arr_adc[] = { 0, 1, 2, 3, 4 }; main에서 arr_adc const 배열의 크기반큼 반복하면서 출력하겠습니다. 사이즈는 편의상 sizeof를 활용해보겠습니다. 출력은 다음가 같이 되겠죠. 01234 int main(void) { int i = 0; for(i=0; i
2022.02.20
C언어 파일 입출력 예시
코드 #include void main() { FILE *ifp, *ofp; ifp = fopen("a.txt", "r"); if(ifp == NULL) { printf("파일이 개방되지 않았습니다.\n"); return 1; } printf("입력파일이 개방되었습니다\n"); ofp = fopen("b.txt", "w"); if(ofp == NULL) { printf("파일이 개방되지 않았습니다.\n"); return 1; } printf("출력파일이 개방되었습니다.\n"); }
2022.02.20