'언어/C'에 해당되는 글 35건

  1. 2016.09.26 함수 포인터 컴파일 오류
  2. 2016.05.02 전처리문
  3. 2016.05.02 signed와 unsigned
  4. 2016.05.02 typedef
  5. 2016.03.21 static 변수
  6. 2016.03.20 메모리 관리와 메모리의 동적 할당
  7. 2016.03.18 파일 입출력 -3
  8. 2016.03.13 파일 입출력 -2
  9. 2016.03.10 파일 입출력 -1
  10. 2016.03.10 구조체 기초 (열거형 enum)

오류내용:

a value of type void cannot be assigned to an entity of type void(*)()

함수 작성:

int Serial_CallBack()

{

    printf("Serial CallBack\n");

    return 0;

}


void Serial_CallBack()

{

    printf("Serial CallBack\n");

}

오류가 난 코드 ↓

int (*callback_func)();

callback_func = Serial_CallBack;


void (*callback_func)();

callback_func = Serial_CallBack();

빨간색 괄호 부분이 오류가 난 직접적인 원인이다. 함수 이름만 전달해야 하는데 실수를 했다.


오류가 나지 않은 코드 

void (*callback_func)(); 

callback_func = Serial_CallBack;


void (*callback_func)() = Serial_CallBack;

위의 둘 중에 어떤 코드를 사용해도 오류는 없다.

'언어 > C' 카테고리의 다른 글

배열의 문자열 초기값과 포인터의 문자열 초기값의 차이  (0) 2016.10.13
getc() 함수를 사용했을 때의 오류  (0) 2016.09.28
전처리문  (0) 2016.05.02
signed와 unsigned  (0) 2016.05.02
typedef  (0) 2016.05.02
Posted by 知彼知己百戰不殆
,

전처리문

언어/C 2016. 5. 2. 14:03

전처리문 : 실질적인 컴파일 이전에 미리 처리되는 문장, 컴파일러는 사용자가 작성한 코드를 컴파일하기 전에 전처리문에서 정의해 놓은 작업들을 먼저 수행함

기존의 방대한 소스 코드를 지우지 않고 활성/비활성 하는 데에 가장 많이 이용된다. 기존의 소스 코드를 건드리지 않는 상태에서 부분적인 컴파일!


- 파일 처리 전처리문 : #include

- 형태 정의 전처리문 : #define, #undef

- 조건 처리 전처리문 : #if, #ifdef, #ifndef, #else, #elif, #endif

- 에러 처리 전처리문 : #error

- 디버깅 전처리문 : #line

- 컴파일 옵션 처리 전처리문 : #pragma


조건 처리 전처리문은 어떤 조건에 대한 검사를 하고 그 결과를 참(0이 아닌 값) 또는 거짓(0)으로 돌려준다.

#if : ...이 참이라면

#ifdef : ...이 정의되어 있다면

#else : #if 나 #ifdef에 대응된다

#elif : "else + if"의 의미

#endif : #if, #ifdef, #infdef 이 끝났음을 알림


#include

 #include <stdio.h>        /* 이 위치에 stdio.h라는 파일을 포함시킨다. */

 #include "text.h"           /* 이 위치에 text.h라는 파일을 포함시킨다. */

 

'<...>'를 사용할 때와 '"..."'를 사용할 때의 차이점은 '<...>'는 컴파일러의 표준 포함 파일 디렉토리(또는 사용자가 별도로 지정해 준)에서 파일을 찾는 것을 기본으로 한다.  그리고 "..."'를 사용했을 때는 현재의 디렉토리를 기본으로 파일을 찾게 된다. 아예 디렉토리를 같이 지정할 수도 있다.


  #include <C:\MYDIR\MYHEAD.H>

  #include "C:\MYDIR\MYHEAD.H"


#define

상수값을 지정하기 위한 예약어로 매크로라고 부른다. 구문의 상수로 치환한다. 

또한 #define은 함수 역활과 비슷하게 아래와 같이 쓰일 수 있다. 

#define SUM(x) ((x) = (x) + (x))

동작원리는 함수와 같다. 말 그대로 main소스에서 SUM을 호출하면 옆에 있는 더하기 코드가 치환되는 것이다.

 

#define으로 정의할 수 있는 것은 숫자만이 아니다.

#define MYNAME "Young Hee"

printf(MYNAME);

라고 한다면 이는 전처리기에 의해 

printf("Young Hee");와 같이 전개되는 것이다.


출처 : http://www.sosori.com/2009/09/전처리문의-종류include-define-ifdef.html

'언어 > C' 카테고리의 다른 글

getc() 함수를 사용했을 때의 오류  (0) 2016.09.28
함수 포인터 컴파일 오류  (0) 2016.09.26
signed와 unsigned  (0) 2016.05.02
typedef  (0) 2016.05.02
static 변수  (0) 2016.03.21
Posted by 知彼知己百戰不殆
,

signed와 unsigned

언어/C 2016. 5. 2. 13:31

signed unsigned는 컴퓨터 프로그램에서 수를 표기하는 자료형의 특성이다.


signed

C/C++ 프로그램 언어에서 정수형 변수 중 부호를 갖는 변수를 선언 한다. 정수형 중 음수는 2의 보수 체계를 사용하므로 이 키워드에 의해 부호를 사용할 수 있도록 변수 선언할 수 있다. 그러나 정수형의 변수에서 unsigned가 없으면 음수를 사용할 수 있는 부호를 갖는 정수형이 된다. 


unsigned

unsigned C/C++ 언어에서 사용되는 지정자로 정수형과 같이 사용되어 부호 비트를 제거해 저장 가능한 양수 범위를 두배로 늘이는 역할을 한다. char int의 signed 정수형 변수에서 MSB가 부호 비트이다. 1이면 음수이고 0이면 양수이다. 그러나 unsigned을 사용하면 음수를 사용하지 않겠다는 의미 이므로 부호 비트가 필요 없다. 따라서 이진수와 같은 십진수가 된다.


unsigned char

8비트 정수형 변수 선언 char와 결합하여 선언하면 부호 비트가 필요 없으므로 0~255 범위를 갖는다.

10진수    2진수

255        1111 1111

254        1111 1110

253        1111 1101


출처 : 위키백과

'언어 > C' 카테고리의 다른 글

함수 포인터 컴파일 오류  (0) 2016.09.26
전처리문  (0) 2016.05.02
typedef  (0) 2016.05.02
static 변수  (0) 2016.03.21
메모리 관리와 메모리의 동적 할당  (0) 2016.03.20
Posted by 知彼知己百戰不殆
,

typedef

언어/C 2016. 5. 2. 07:49

1. 원래의 이름을 못 쓰게 하지 않는다. 즉, 원래의 이름 + 가명을 사용할 수 있는 것

2. 같은 자료형에 대해서 여러가지 새로운 이름을 만들 수 있다.


사용하는 이유??

1. 여러 시스템 환경에서 사용할 수 있는 프로그램을 만들기 위해서(ex. 16bit 컴퓨터에서 뿐만이 아니라 32bit 컴퓨터에서도 사용될 수 있게 만들고 싶을 때) - typedef으로 선언된 문장 하나만 변경하면 typedef alias로 선언된 모든 문장들에 영향을 끼침

2. 자체적으로 문서화된 프로그램을 작성하는데 도움을 주기 위해서. 어느 누구라도 코드를 읽기 쉽게 하기 위해

'언어 > C' 카테고리의 다른 글

전처리문  (0) 2016.05.02
signed와 unsigned  (0) 2016.05.02
static 변수  (0) 2016.03.21
메모리 관리와 메모리의 동적 할당  (0) 2016.03.20
파일 입출력 -3  (0) 2016.03.18
Posted by 知彼知己百戰不殆
,

static 변수

언어/C 2016. 3. 21. 14:16

'언어 > C' 카테고리의 다른 글

signed와 unsigned  (0) 2016.05.02
typedef  (0) 2016.05.02
메모리 관리와 메모리의 동적 할당  (0) 2016.03.20
파일 입출력 -3  (0) 2016.03.18
파일 입출력 -2  (0) 2016.03.13
Posted by 知彼知己百戰不殆
,

힙 영역 : 사용자가 원하는 시점에 변수를 할당/소멸 하도록 지원. '프로그래머가 관리하는 메모리 공간'이라고도 하는데, malloc 함수 호출로 할당된 메모리 공간은 프로그래머가 직접 free 함수 호출을 통해 해제하지 않으면 계속 남아있다.

지역변수와 같이 함수가 호출될 때마다 매번 할당이 이뤄지지만, 할당이 되면 전역변수와 마찬가지로 함수를 빠져나가도 소멸되지 않는 성격의 변수가 필요. 힙에 할당된 메모리 공간은 포인터 변수를 이용해서 접근해야 한다. 주소 값을 반환하기 때문.


힙 영역의 메모리 공간 할당과 해제 : malloc, free 함수

1
2
3
4
#include <stdlib.h>
 
void * malloc (size_t size);
void free (void * ptr);


malloc 함수는 성공 시 할당된 메모리의 주소 값 반환, 실패 시 NULL 반환


malloc 함수의 반환형은 void * 형이므로 반환값에 아무런 가공도 하지 않으면 할당된 메모리 공간에 접근 불가능.

malloc 함수는 원하는 만큼 메모리 공간 할당하고, 그 메모리의 주소 값 반환. 사용하려면 포인터 형의 변환을 통해 결정해야 함.

형변환 연산자를 사용하여 int * ptr1 = (int *)malloc(sizeof(int)); 이런 식으로 형변환을 해줘야 할당된 메모리 공간에 접근 가능.


힙 영역의 메모리 공간 할당 함수 : calloc 함수 (메모리 공간 해제시 free)

1
2
3
#include <stdlib.h>
 
void * calloc (size_t elt_count, size_t elt_size);


성공 시 할당된 메모리의 주소값, 실패 시 NULL 반환

elt_count 인자 : 할당할 블록의 개수 정보

elt_size 인자 : 블록 하나당 바이트 크기의 정보

malloc 함수와 차이점 : malloc는 할당된 메모리 공간을 별도의 값으로 초기화하지 않음(할당된 메모리 공간이 쓰레기 값으로 채워짐), calloc는 할당된 메모리 공간의 모든 비트를 0으로 초기화 시킴.


힙에 할당된 메모리 공간 확장 시 호출하는 realloc 함수

할당된 메모리 공간은 크기를 확장할 수 없지만, 그 영역이 heap이라면 가능하다.

1
2
3
#include <stdio.h>
 
void * realloc (void * ptr, size_t size);


성공 시 새로 할당된 메모리의 주소 값, 실패 시 NULL 반환

ptr : 확장하고자 하는 힙 메모리의 시작 주소 값

size : 확장하고자 하는 메모리의 전체 크기

1. malloc 함수의 반환 값(주소값)과 realloc 함수의 반환 값이 같은 경우

=> 기존에 할당된 메모리 공간의 뒤를 이어서 확장할 영역이 넉넉한 경우

2. malloc 함수의 반환 값과 realloc 함수의 반환 값이 다른 경우

=> 넉넉하지 않은 경우 힙의 다른 위치에 새로 할당(이전 배열에 저장된 값 복사)

'언어 > C' 카테고리의 다른 글

typedef  (0) 2016.05.02
static 변수  (0) 2016.03.21
파일 입출력 -3  (0) 2016.03.18
파일 입출력 -2  (0) 2016.03.13
파일 입출력 -1  (0) 2016.03.10
Posted by 知彼知己百戰不殆
,

파일 입출력 -3

언어/C 2016. 3. 18. 00:45

텍스트와 바이너리 데이터의 집합체인 구조체 변수의 입출력

⇒ 구조체 변수를 하나의 바이너리 데이터로 인식하고 처리

ex)

fp=fopen("friend.bin", "wb");

printf("이름, 성별, 나이 순 입력: ");

scanf("%s %c %d", myfren1.name, &(myfren1.sex), &(myfren1.age));

fwrite((void *)&myfren1, sizeof(myfren1), 1, fp);

fclose(fp);


fp=fopen(~~~);

fread((void*)&myfren2, sizeof(myfren2), 1, fp);

printf("%s %c %d \n", myfren2.name, myfren2.sex, myfren2.age);

fclose(fp);


파일 위치 지시자 : 파일이 처음 개방되면 무조건 파일의 맨 앞부분 가리킴

1
2
3
#include <stdio.h>
 
int fseek(FILE * stream, long offset, int wherefrom);


파일 위치 지시자의 이동 : seek (stream으로 전달된 파일 위치 지시자를 wherefrom에서부터 offset 바이트만큼 이동)ㅁ

성공시 0, 실패시 0이 아닌 값 반환

 매개변수 wherefrom 이...

파일 위치 지시자는... 

SEEK_SET(0) 이라면

파일 맨 앞에서부터 이동을 시작 

SEEK_CUR(1) 이라면

현재 위치에서부터 이동을 시작

SEEK_END(2) 이라면

파일 맨 끝에서부터 이동을 시작

파일의 맨 끝은 마지막 데이터가 아니라 EOF를 의미

매개변수 offset에 양의 정수 전달 : 파일의 마지막을 향해서 파일 위치 지시자 이동

음의 정수 전달 : 파일의 시작 위치를 향해서 파일 위치 지시자 이동


현재 파일 위치 지시자의 위치 : ftell

1
2
3
#include <stdio.h>
 
long ftell(FILE * stream);


가장 앞 부분의 바이트 위치를 0으로 간주


'언어 > C' 카테고리의 다른 글

static 변수  (0) 2016.03.21
메모리 관리와 메모리의 동적 할당  (0) 2016.03.20
파일 입출력 -2  (0) 2016.03.13
파일 입출력 -1  (0) 2016.03.10
구조체 기초 (열거형 enum)  (0) 2016.03.10
Posted by 知彼知己百戰不殆
,

파일 입출력 -2

언어/C 2016. 3. 13. 23:53

파일의 개방 모드 (웬만하면 r,w,a 중에서 선택)

모드 

 스트림의 성격

일이 없을 경우 

 r

 읽기 가능

Error 

 w

 쓰기 가능

생성 

 a

 파일 끝에 덧붙여 쓰기 가능

 r+

 읽기/쓰기 가능

Error 

 w+

 읽기/쓰기 가능

생성 

 a+

 읽기/덧붙여 쓰기 가능

생성

1. 모드의 +는 읽기, 쓰기가 모두 가능한 스트림의 형성을 의미

2. 모드의 a는 쓰기(덧붙이기)가 가능한 스트림 형성


윈도우(\r\n), UNIX(\n), Mac(\r) 계열마다 파일 내 개행이 다르므로 형태 변환을 시켜줘야 한다.

형태 변환은 파일을 텍스트 모드(fopen사용시)로 개방하면 자동으로 됨.

C프로그램에서 \n을 파일에 저장하면 윈도우에서는 \r\n으로 변환되어 저장됨.


텍스트 모드의 파일 개방을 위해서는 fopen 함수의 두 번째 인자로 다음 중 하나 전달

rt, wt, at, r+t(rt+), w+t(wt+), a+t(at+)

바이너리 데이터를 저장하고 있는 파일의 경우 형태의 변환이 일어나면 안되므로 바이너리 모드로 파일 개방.

rb, wb, ab, r+b(rb+), w+b(wb+), a+b(ab+)

개방 모드에 아무것도 붙이지 않으면 디폴트 값은 텍스트 모드


feof함수 : 파일의 끝 확인할 때 사용

1
2
3
#include <stdio.h>
 
int feof(FILE * stream);


파일의 끝에 도달한 경우 0이 아닌 값 반환

한 파일에서 다른 파일로 복사를 할 때 완전하게 파일 끝까지 복사가 다 됐는지 확인할 때 사용

fgetc나 fgets함수가 EOF를 반환했다고 해서 무조건 파일의 끝에 도달했다고 판단할 수 없다. 오류가 발생하는 경우에도 EOF가 반환


바이너리 데이터의 입출력 fread, fwrite

1
2
3
#include <stdio.h>
 
size_t fread(void * buffer, size_t size, size_t count, FILE * stream);


 성공시 전달인자 count, 실패 또는 파일의 끝 도달 시 count보다 작은 값 반환


1
2
3
#include <stdio.h>
 
size_t fwrite(void * buffer, size_t size, size_t count, FILE * stream);


성공시 전달인자 count, 실패 시 count보다 작은 값 반환

만약 fwrite((void*)but, sizeof(int), 12, fp) 이렇게 함수가 정의돼 있다면 한 번 호출할 때마다 12만큼씩 데이터를 써라..라는 뜻.. 최소 12만큼 쓰는게 아니라 그냥 무조건 12만큼 써라 라는 뜻


서식에 따른 데이터 입출력 : fprintf, fscanf

printf와 scanf 함수와 비슷, 입출력 대상이 콘솔이 아닌 파일

ex) char name[10]="홍길동";

char sex='M';

int age = 24;

fprintf(fp, "%s %c %d", name, sex, age); fp는 파일 구조체 포인터


fscanf : 첫 번째 인자로 전달된 포인터가 지칭하는 파일로부터 데이터를 읽어들임   

ex) char name[10];

char sex ;

int age;

fscanf(fp, "%s %c %d", name, &sex, &age);

'언어 > C' 카테고리의 다른 글

메모리 관리와 메모리의 동적 할당  (0) 2016.03.20
파일 입출력 -3  (0) 2016.03.18
파일 입출력 -1  (0) 2016.03.10
구조체 기초 (열거형 enum)  (0) 2016.03.10
구조체 기초 (union, struct의 차이)  (0) 2016.03.07
Posted by 知彼知己百戰不殆
,

파일 입출력 -1

언어/C 2016. 3. 10. 11:18

스트림(stream) : 데이터 이동의 경로가 되는 다리, program과 파일 사이에 스트림을 형성해야 데이터를 주고 받을 수 있다.

파일 : 운영체제에 의해서 그 구조가 결정되고 관리되는 대상, 파일 뿐만 아니라 스트림의 형성도 운영체제의 몫임을 기억해야 한다.


fopen 함수 호출을 통한 파일과의 스트림 형성과 FILE 구조체

1
2
#include <stdio.h>
FILE * fopen(const char * filename, const char * mode);


fopen 함수의 반환형은 FILE인데 구조체의 포인터이다. 파일을 가리키기 위한 용도로 사용됨.

이 포인터를 이용해서 파일에 데이터를 저장하거나 파일에 저장된 데이터를 읽게 된다.


fputc('A',fp); fp(파일포인터)가 가리키는 곳에 문자 'A' 저장 


fclose : 스트림의 소멸(해제)을 요청하는 함수

1
2
3
#include <stdio.h>
 
int fclose(FILE * stream);


fclose 함수가 호출이 되면 데이터는 안정적으로 저장이 됨.

개방되었던 파일을 닫아주어야 하는 이유 : 운영체제가 할당한 자원의 반환,  버퍼링 되었던 데이터의 출력


fflush : 스트림을 종료하지 않고 버퍼만 비우고 싶을 때

1
2
3
#include <stdio.h>
 
int fflush(FILE * stream);


출력 버퍼를 비움 : 출력 버퍼에 저장된 데이터를 목적지로 전송한다는 의미

입력 버퍼를 비움 : 입력 버퍼에 저장된 데이터를 소멸 시킨다는 의미

fflush 함수는 출력 버퍼를 비우는 함수, 입력 버퍼를 대상으로 호출할 수 없음


저장한 파일을 읽어들일 때에는 fopen함수의 mode부분을 "rt"로 바꿔주고 fgetc로 읽어들이면 됨


'언어 > C' 카테고리의 다른 글

파일 입출력 -3  (0) 2016.03.18
파일 입출력 -2  (0) 2016.03.13
구조체 기초 (열거형 enum)  (0) 2016.03.10
구조체 기초 (union, struct의 차이)  (0) 2016.03.07
escape sequence  (0) 2016.02.26
Posted by 知彼知己百戰不殆
,

열거형(Enumerated Type)

저장이 가능한 값 자체를 정수의 형태로 결정한다. 사용형태는 구조체랑 비슷하다.


사용 형태 : 

enum (name)

{

~~~~

};


열거형 상수의 값이 결정되는 방식

enum color { A, B, C, D };

A=1, B=2, C=3 ... 0에서부터 시작하여 1씩 증가하는 형태

enum color { A=1, B, C=4,D};

B=2, D=5... 선언되어 있지 않은 값은 앞서 선언된 상수보다 1이 증가된 값이 할당


열거형의 유용함은 둘 이상의 연관이 있는 이름을 상수로 선언, 자료형의 이름을 생략한 형태로 열거형을 정의할 수도 있다.


'언어 > C' 카테고리의 다른 글

파일 입출력 -2  (0) 2016.03.13
파일 입출력 -1  (0) 2016.03.10
구조체 기초 (union, struct의 차이)  (0) 2016.03.07
escape sequence  (0) 2016.02.26
counting program  (0) 2016.02.18
Posted by 知彼知己百戰不殆
,