레이블이 C++인 게시물을 표시합니다. 모든 게시물 표시
레이블이 C++인 게시물을 표시합니다. 모든 게시물 표시

12월 07, 2016

\b의 용도


 \b

 \b 는 back space를 의미하는 escape sequence로,  \n 과 같이 다음 출력의 위치를 바꿔주는 역할을 한다.  \n 는 다음 출력의 위치를 다음 줄로 바꿔주는데,  \b 는 다음 출력의 위치를 이전으로 한칸 이동(back space) 한다. 아래 예를 참고하자.

cout << "asdf";    // (1) asdf
cout << "1234";   // (2) asdf1234

(1)이 실행되면 콘솔에서 asdf가 출력된다. 출력을 계속하면 다음에 출력할 문자는 f 뒤부터 출력이 되는데, 이는 콘솔 상에서 마지막 출력의 다음 위치를 cursor가 가르키고 있다가 출력이 재개되면 cursor의 위치부터 출력을 계속하기 때문이다. 만약 되돌려진 커서의 위치에 기존 출력의 내용이 있다면 기존의 출력을 새로운 출력으로 덮어쓰게 된다.

// _ (underline)은 커서의 위치
cout << "asdf";    // (3) asdf_
cout << '\b';        // (4) asdf
cout << "1234";   // (5) asd1234_

이를 응용해 이미 출력된 내용을 지울 수도 있다.

// \b로 커서를 하나 되돌린 후 ' '(공백)을 출력해서 기존 출력을 지운 후, 다시 커서를 되돌림
cout << "asdf";    // (6) asdf_
cout << "\b \b";    // (7) asd_

reference

8월 08, 2016

char * 타입으로 가르키는 string

char * str = "Hello!"
소스 코드 상에 위와 같이 표현된 string은 string의 내용(character)을 바꿀 수 없음.

위와 같이 표현된 string은 complile time 때 이에 대해 미리 알고 있어야하기 때문에, string이 executable 안에 직접 쓰여짐. Executable 안에 기록된 data는 읽기 전용이기 때문에 수정/변경될 수가 없으며, 수정하고 싶은 data는 executable이 아닌 stack memory나 heap memory에 기록해야 함. 따라서 char str[] = "string" 과 같이 local varialble로 char array를 선언해서 여기에 string을 기록하거나, malloc으로 heap memory 에 공간을 할당하고 여기에 string을 복사해서 사용해야 함.



Reference

6월 29, 2016

external linkage VS internal linkage

title: external linkage VS internal linkage
tag:

컴파일러는 컴파일 시 translation unit을 생성함.

translation unit
implementation file(*.cpp, *.cxx)에서 생성된 object 파일과 이 파일에서 include 된 모든 헤더 파일을 합친 것.
Internal linkage란 이 translation unit 안의 범위에 있는 것을 의미. 반대로 External linkage란 특정 translation unit의 외부에서도 존재하는 것(즉, 프로그램 어디서든(선언된 파일이 아닌 다른 파일에서도) 접근이 가능한 변수)을 의미.

예를 들어, static은 internal linkage를 가지며 선언된 파일 안에서만 접근이 가능함. 반면에 global variable은 external linkage를 가지며 선언된 파일 바깥에서도 extern 선언만 하면 프로그램 어디서든 접근이 가능함.


Reference

5월 30, 2016

ODBC API


연결 과정

  1. ODBC Data Source 설정 참고)windows 10에서 ODBC data source 설정 방법
  2. DB에 연결
    1. Header 파일 include: sql.h , sqltypes.h , sqlext.h
    2. SQLAllocHandle(..): Environment handle (object) 할당
    3. SQLSetEnvAttr(..): Environment handle 설정
    4. SQLAllocHandle(..): Connection handle (object) 할당
    5. SQLSetConnectAttr(..): Connection handle 설정
    6. SQLConnect(..) (또는 SQLDriverConnect(..)): DB와 연결
    7. SQLDriverConnect(..)는 GetDesktopWindow() 사용해 windows.h 사용.

    8. SQLAllocHandle(..): Statement handle (object) 할당
    9. (SQLSetStmtAttr(..): Statmenet handle 설정)

    ODBC API에 param.로 char string을 전달 시 반드시 wchar 형으로 전달해야 함. 참고) wide character type (wchar_t) 란?

  3. statement 실행
  4. Query 결과 확인
  5. DB와의 연결 해제
    1. SQLFreeHandle(..): Statement handle 해제
    2. SQLDisconnect(..): DB 연결 해제
    3. SQLFreeHandle(..): Connection handle 해제
    4. SQLFreeHandle(..): Environment handle 해제

statement 실행

query 직접 입력

  • SQLExecDirect(..): SQL 문 실행

querying의 반복 실행이 없는 경우 가장 적합한 방식.


prepared procedure

  1. SQLBindParameter(..): SQL statement의 param. marker에 버퍼를 bind.
  2. SQLPrepare(..): query 실행을 위한 SQL string을 준비.
  3. SQLExecute(..): prepared statement를 실행. 만약 param. marker가 statement 에 존재한다면 param. marker 변수의 현재 값을 사용.

query 결과 확인

query 결과로부터 데이터 추출

  1. SQLBindCol(..): 어플리케이션 데이터 버퍼를 result set의 column에 bind
  2. SQLFetch(..): result set의 다음 rowset의 데이터를 가져와서 bound된 모든 column에 대한 데이터를 리턴.
  • SQLFetchScroll(..): result set의 다음 rowset의 데이터를 가져와서 bound된 모든 column에 대한 데이터를 리턴. rowset은 절대/상대/북마크 위치로 설정가능.

column-wise, row-wise 등 다양한 데이터 추출 방법이 존재. 참고) Retrieving Results (Advanced) |MSDN


result set 관련 정보 확인

  • SQLDescribeCol(..): result set metadata를 알아내는데 사용
  • SQLColAttribute(..): result set metadata를 알아내는데 사용
  • SQLDecscribeCol VS SQLColAttribute SQLDecscribeCol 은 항상 정해진 5개의 정보를 리턴. SQLColAttribute 는 사용자가 지정한 정보 하나만을 리턴하는 대신에 더욱 다양한 정보에 대해 알아볼 수 있음. SQLDescribeCol and SQLColAttribute |MSDN

  • SQLNumResultCols(..): result set의 column 개수를 반환
  • SQLRowCount(..): UPDATE, INSERT, DELETE로 영향 받는 row의 개수를 반환.

오류 처리

  • SQLError(..): 오류나 스테이터스 정보를 반환

기타 함수

  • SQLGetInfo(..): connection과 관련된 드라이버와 data source에 관한 전반적인 정보를 반환

code example



reference

5월 27, 2016

ODBC Fundamentals: Descriptor Handles

descriptor란 어플리케이션이나 드라이버에게 보여지는 SQL statment의 param. 나 result set의 칼럼과 같은 메타데이터의 collection을 의미한다. descriptor는 다음 네가지 중 어떠한 역할도 맡을 수 있다.

  • Application Parameter Descriptor (APD).
  • SQL statement의 param.에 bound된 어플리케이션 버퍼에 대한 정보(그 버퍼의 주소, 크기, C data types 등)을 가짐.
  • Implementation Parameter Descriptor (IPD).
  • SQL statement의 파라미터에 관한 정보(SQL data type이나 크기, nullability)를 가짐.
  • Application Row Descriptor (ARD). result set의 칼럼에 bound된 어플리케이션 버퍼데 대한 정보(그 버퍼의 주소나 크기, C data type 등)를 가짐.
  • Implementation Row Descriptor (IRD). result set의 칼럼에 대한 정보(SQL data type이나 크기, nullability 등)를 가짐.

statement가 할당될 때 위 네개의 descriptors도 자동으로 할당되지만, 어플리케이션에서 SQLAllocHandle(..) 을 통해서 직접 할당할 수도 있으며 이를 explicityly allocated descriptors라 한다. 이런 descriptors는 connection에 할당이 되어 마찬가지로 그 connection에 할당된 하나 이상의 statements와 연관되어 APD 나 ARD의 역할을 맡는다.
ODBC에서 수행되는 대부분의 operation은 explicityly allocated descriptors 없이 수행 가능하지만, 때로 이런 descriptors가 몇몇 operation의 편리한 shortcut으로 사용할 수도 있다. (reference 참조)


reference

5월 26, 2016

wide character type (wchar_t) 란?

wide charater란 전통적인 8-bit character보다 더 큰 사이즈를 가지는 character datatype을 말함. datatype 사이즈가 커져 더 큰 character sets을 표현할 수 있다. UTF-16 little endian이 마이크로소프트의 wchar_t 표준이지만, wchar_t는 플랫폼 별, 컴파일러 별로 8 bit 에서 32 bit 까지 다양한 wide character implementation을 가지고 있어 wchar_t의 크기는 통일이 되지 않았다. 이런 이유로 프로그램이 multi platform에서 사용이 될 예정이라면 유니코드 저장 용도로 wchar_t을 사용해서는 안된다.

C/C++ 소스 코드는 보통 US-ASCII나 ISO-2022를 따르는 MBCS로 작성된다. 따라서 소스 코드에선 원칙적으로 wchar_t 문자열 사용이 불가능하다(ASCII와 호환되는 MBCS나 UTF-8만 가능). 이와 같이 소스 코드에서 wide character를 받지 않기 때문에, 소스 코드 상에서 L 문자를 문자열 앞에 붙여 wide character를 표현한다.

wchar_t * wchar = L"wide character string"

그러나 옛날 버전의 gcc 컴파일러에서는 이런 표현을 지원하지 않는 경우가 있기 때문에 확인이 필요하다.




reference