반응형 컴퓨터/C63 C 반올림 함수 C에서 반올림 함수 round는 에 정의되어 있다. 반올림 함수들은 다음과 같다. float roundf( float arg ) double round( double arg ) long double roundl( long double arg ) long lroundf( float arg ) long lround( double arg ) long lroundl( long double arg ) long long llroundf( float arg ) long long llround( double arg ) long long llroundl( long double arg ) lroundf는 float 변수를 반올림하여 long 변수를 반환한다. 2023. 5. 26. [C] sin과 sinf과 sinl의 차이 수학함수는 math.h에 정의되어 있다. sin의 정의 double sin(double arg) sinf의 정의 float sinf(float arg) sinl의 정의 long double sinf(long double arg) sinf와 sinl은 C99 버전부터 추가되었다. math.h에 정의된 수학함수는 다음과 같은 것들이 있다. exp / expf / expl log / logf/ logl pow / powf / powl sqrt / sqrtf / sqrtl sin / sinf / sinl cos / cosf / cosl tan / tanf / tanl tan / tanf / tanl asin / asinf / asinl acos / acosf / acosl atan / atanf / atnanl.. 2023. 4. 10. [C] struct 내부에 함수 사용하기 C에서 struct 내부에 함수 포인터를 정의하여 C++의 class 멤버 함수 비슷하게 사용할 수 있다. C struct에 함수를 정의하는 방법은 다음과 같다. #include void Box_Add(int x); struct { int Value; void (*Add)(int x); } Box; int main() { Box.Add = Box_Add; Box.Value = 1; printf("Value=%d\n", Box.Value); Box.Add(5); printf("Value=%d\n", Box.Value); return 0; } void Box_Add(int x) { Box.Value += x; } 2023. 4. 7. [C] 범위 제한 매크로 타입 #1 #define ConstrainVal(val,min,max) ( (val > max) ? (max) : ( (val max) ? (val=max) : ( (val 2023. 4. 7. #define 문 사용법 C에서 #define문을 사용하는 방법은 다음과 같다. #define PI 3.1415 #define MAX(a,b) ((a < b) ? (b) : (a)) #define PORT(x) (*((volatile char*)0x00001000) = (x) #define multiply(f1,f2) (f1*f2) 2022. 12. 9. 구조체(struct) 포인터 연산 구조체의 포인터는 다음과 같이 사용할 수 있다. struct pos p1; struct pos *pp; *pp = &p1 (*pp).x = 10; (*pp).y = 20; 또는 화살표 연산자(Arrow Operator)를 이용하여 다음과 같이 사용할 수도 있다. pp->x = 10; pp->y = 20; 위의 2가지 방법은 동일한 동작을 한다. 2022. 9. 19. C 언어 - 3개 이상 입력 min,max 함수 C에서 min, max 함수는 다음과 같이 매크로 함수를 선언하여 사용해야 한다. #ifndef max #define max(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef min #define min(a,b) (((a) 2022. 9. 17. 인라인(inline) 함수 사용하기 inline 함수는 다음과 같이 사용한다. static inline void fun() { } void main() { fun(); } 2022. 6. 29. 프로그램 인수 main( int argc, char * argv [] ) C에서 프로그램의 인수는 다음과 같이 구한다. int main( int argc, char * argv [] ) { printf( "argc = %d\n", argc ); for( int i = 0; i test c file1 file2 위와 같이 프로그램을 실행할 때 저장되는 변수는 다음과 같다. argc = 4 argv[0] = "test" argv[1] = "c" argv[2] = "file1" argv[3] = "file2" 2022. 5. 15. C 언어 goto 문 일반적으로 goto 문을 사용하지 않는 것이 좋지만 일부 예외적인 경우에는 goto 문을 사용하는 것이 좋을 때도 있다. [1] 다중 루프에서 중간에서 빠져 나올 때 goto 문을 사용하면 코드가 더 간단하고 가독성도 높다. for (i=0; i 2022. 5. 2. C 문자열 포맷 printf 또는 sprintf 등에 사용되는 문자열 포맷은 다음과 같다. 변수의 형식을 나타내는 지정자(Specifier)는 다음과 같다. d or i signed decimal integer u unsigned decimal integer x / X unsigned hex integer / 대문자 f floating point e / E mantissa-exponent / 대문자 c char s string 변수의 길이 지정자는 다음과 같고 형식을 나타내는 지정 앞에 붙여서 사용한다. hh signed char h short int l long int ll long long int z size_t 사용예 결과 printf("%d", i=-10) "-10" 부호 있는 십진수 정수 printf("%ld".. 2022. 5. 2. memcmp와 strcmp와 strncmp의 차이 strcmp와 strncmp는 데이터의 문자열 부분만 비교한다. 즉, 문자열의 끝을 나타내는 0 까지만 비교한다. 이에 비해, memcmp는 문자열이던 바이너리든 상관없이 지정된 개수만큼 비교한다. memcpy와 strcpy와 strncpy도 동일한 규칙이 적용된다. 문자열이 아닌 바이너리 데이터에 strncmp이나 strncpy를 사용하는 실수를 하는 경우가 많다. void * memcpy ( void * destination, const void * source, size_t num ) char * strcpy ( char * destination, const char * source ) char * strncpy ( char * destination, const char * source, size_.. 2022. 5. 2. C 구조체 struct는 사용하는 기본 문법은 다음과 같다. 선언 (Declaration)을 한 후 정의 (Definition)를 한다. struct STNAME { int i; int j; }; struct STNAME name1; struct STNAME name2; 다음과 같이 선언과 정의를 동시에 할 수도 있다. struct STNAME { int i; int j; }name1; 다음과 같이 정의을 바로 할수도 있다. struct { int i; int j; }name1; typedef 문을 사용하여 정의할 때 struct를 뺄수 있다. typedef struct STNAME { int i; int j; }; STNAME name1; STNAME name2; typedef 문을 사용하여 선언과 정의를 동시에.. 2022. 5. 2. C 변수 선언명 변경하기 char, short, int 등의 변수 선언명을 typedef을 사용하여 다음과 같이 변경할 수 있다. typedef signed char s08; typedef unsigned char u08; typedef signed short s16; typedef unsigned short u16; typedef signed int s32; typedef unsigned int u32; typedef signed long s64; typedef unsigned long u64; typedef float f32; typedef double f64; 임베디드 시스템에서 MCU 마다 변수의 크기가 다를 때 변수 선언명을 위와 같이 정의하여 사용하면 다른 MCU로 쉽게 포팅할 수 있다. 또한, 변수 선언명의 글자가 .. 2022. 5. 2. Visual C++ 시리얼 통신 프로그래밍 Visual C++에서 시리얼 통신 소스는 다음과 같다. BOOL PortOpen(CString sPortName, DWORD dwBaud, BYTE Data, BYTE Parity, BYTE Stop, BYTE Flow) { COMMTIMEOUTS timeouts; DCB dcb; DWORD dwThreadID; m_bConnected = FALSE; // Overlapped structure m_osRead.Offset = 0; m_osRead.OffsetHigh = 0; if (!(m_osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL))) return FALSE; m_osWrite.Offset = 0; m_osWrite.OffsetHigh = 0; if (.. 2022. 4. 2. 널 포인터(NULL pointer) C 표준에서 널 포인터(NULL pointer)는 void*(pointer to void)로 정의하고 있다. 대부분의 C 컴파일러에서는 NULL 포인터를 ((void*)0)로 매크로 정의하고 있다. NULL 포인터는 다음과 같이 사용할 수 있다. int *p = NULL; 2021. 8. 1. C의 괄호 스타일 C에서 괄호를 사용하는 방식은 다음과 같다. (1) Allman 방식 for(i=0; i 2021. 7. 10. [C] __weak 명령어 함수나 변수 앞에 __weak을 사용하면 weak으로 선언하다는 의미이다. 아무 것도 없는 상태는 strong 상태이다. 같은 이름의 함수 또는 변수가 하나는 weak으로 하나는 아무 것도 없는 strong으로 선언 되었다면 weak은 무시되고 strong만 사용된다. 같은 이름의 함수 또는 변수가 모두 weak이거나 모두 strong이면 에러를 표시한다. 2021. 6. 22. C 언어 실수 나머지 연산 C에서 정수의 나머지는 % 연산자로 구할 수 있다. 실수의 나머지는 math.h에 있는 다음의 함수를 사용해야 한다.double fmod(double _X, double _Y)float fmodf(float _X, float _Y)long double fmodl(long double _X, long double _Y) Donald Knuth가 정의한 나머지를 구하는 식은 다음과 같다.mod(a, n) = a - n * floor(a / n) 실수에서 나머지를 구한 예는 다음과 같다.fmod(36.5 , 5.0) = 1.5fmod(-36.5 , 5.0) = -1.5 2021. 2. 20. [C] ?: 연산자 C에서 물음표 ? : 를 삼항 연산자(Ternary operator)라고 한다. 아래 명령어에서 a>b 조건이 참이면 x에 a가 대입되고 거짓이면 x에 b가 대입된다.x = a>b ? a : b 2021. 2. 8. C printf float 변수 포맷 C의 printf 함수에서 float 변수의 포맷은 다음과 같다. e=2.718281828일 때 표시되는 값은 다음과 같다. 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 32 33 34 35 36 37 38 39 40 41 42 43 printf("%.0f",e) 3 printf("%.0f.",e) 3. printf("%.1f",e) 2.7 printf("%.2f",e) 2.72 printf("%.6f",e) 2.718282 printf("%f",e) 2.718282 printf("%.7f",e) 2.7182818 printf("%5.0f",e) □□□□3 printf("%5.0f.",e) □□□□3.. 2021. 2. 8. C 복소수 연산 C99 표준부터 복소수 연산 라이브러리가 추가되었다. 복소수를 사용하기 위해서는 다음과 같이 complex.h를 사용한다. 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 #include #include int main() { double complex z1 = 1.0 + 2.0*I; double complex z2 = 3.0 + 4.0*I; double complex z3; z3 = z1 + z2; printf("%f %f\n", creal(z3), cimag(z3)); z3 = z1 - z2; printf("%f %f\n", creal(z3), cimag(z3)); z3 = z1 * z2; printf(".. 2021. 1. 23. 다른 형의 변수 변환 데이터가 큰 바이트에서 작은 바이트로 변환할 때는 단순히 상위 바이트를 삭제하여 저장한다. 데이터가 작은 바이트에서 큰 바이트로 변활할 때는 작은 바이트의 숫자를 유지한다. 즉, 작은 데이터가 -1 이면 큰 데이터도 -1이 된다. 즉, char에서 0xFF은 short에서 0xFFFF로 저장된다. 하지만, 큰 데이터가 unsigned 타입일 때 작은 데이터가 마이너스라면 마이너스 형태의 큰 데이터를 저장하고 표시는 플러스로 한다. 즉, -1을 unsigned short에 저장하면 0xFFFF이 저장된다. 0xFFFF는 signed short에서 -1이다. unsigned short에서는 65535가 된다. char → short 변환다음과 같은 코드에서 s에는 1이 저장된다.char c=1;short s.. 2021. 1. 16. [C] ln log 함수 C에서 log(double x) 함수는 자연 로그 ln를 구하는 함수이다. 밑이 10인 로그를 구하는 함수는 log10(double x) 이다. 2020. 12. 29. C 언어 float 오차 다음과 같은 코드를 실행하면 f에 0 이 저장되어야 하지만 실제는 -1.49012e-09 이 저장된다. float f; f = -0.1; f = f + 0.1; printf("%g", f); 이것은 float 숫자를 저장할 때 오차가 발생하기 때문이다. ☞ 부동소숫점 변수 포맷 2020. 12. 25. 온라인 C 컴파일러 온라인으로 C 프로그램을 코딩하고 실행 결과를 볼수 있다. https://www.onlinegdb.com/online_c_compiler 2020. 12. 25. [C] 공용체 union C 에서 공용체는 다음과 같이 사용한다.union Data {int i;char s[4];}; union Data data; data.i = 0x12345678; 위와 같은 코드를 실행하면 big endian일 때 다음과 같이 저장된다.data.s[0]에 0x12이 저장됨data.s[1]에 0x34이 저장됨data.s[2]에 0x56이 저장됨data.s[3]에 0x78이 저장됨 2020. 12. 23. 가장 큰 숫자 구하는 매크로 함수 BIGGEST는 숫자 3개 중 가장 큰 수 구하는 매크로 함수이다. #define MAX(a,b) ((a < b) ? (b) : (a)) #define BIGGEST(a,b,c) ((MAX(a,b) < c) ? (c) : (MAX(a,b))) ☞ 삼항 연산자 2020. 12. 22. volatile 선언 사용법 volatile은 휘발성이라 뜻이다. 변수를 volatile로 선언하면 그 변수가 휘발성이라는 뜻이다. 다음과 같이 i에 1을 3번 대입하는 코드가 있을 때 int i; i = 1; i = 1; i = 1; 컴파일러의 최적화에 따라 다음과 같이 변환하여 컴파일 한다. int i; i = 1; 하지만 다음과 같이 volatile을 사용하면 최적화하지 않고 다음과 같이 있는 그대로 컴파일한다. volatile int i; i = 1; i = 1; i = 1; volatile은 임베디드 시스템에서 많이 사용한다. 주변장치 접근이나 인터럽터가 사용될 때 volatile을 사용한다. 2020. 11. 20. [C] static 선언 함수 내의 지역 변수는 함수를 빠져 나오면 변수값이 지워지고 다시 함수가 실행될 때는 이전 변수값이 저장되지 않는다. 하지만, 지역 변수에 static을 사용하면 변수값이 지원지지 않고 기억된다. 아래 코드에서 i는 1이고, j는 2이고, k는 3이 된다. 만약 변수 c가 static이 아니라면 i, j, k 모두 1이 된다. int fun() { static int c = 0; c++; return c; } void main() { int i = fun(); int j = fun(); int k = fun(); } 전역 변수에 static이 사용될 때는 위와는 전혀 다른 용도로 사용된다. 코드가 여러 파일에 나누어져 컴파일 될 때 static으로 선언된 전역 변수는 변수가 있는 파일에서만 사용할 수 있.. 2020. 11. 14. 이전 1 2 3 다음 반응형