C, C++

struct Point {

  int x;

  int y;

  int z;

}

 

int main(void){

 

    Point p;

    p.x = 100;

    p.y = 200;

    p.z = 300;

 

    cout << "p = (" << p.x << ", " << p.y << ", " << p.z << ")\n";

}

 

< 결과 >

p = (100, 200, 300)

 

 

위와 같은 구조체를 p[0], p[1], p[2] 처럼 배열처럼 사용하고 싶다면 아래와 같은 오퍼레이터를 추가하면 된다.

struct Point {

    int x;

    int y;

    int z;

 

    // x의 주소를 기준으로 한 인덱스 위치 참조를 반환한다

    int& operator[] (int index) { return *(&x + index); }

};

 

int main(void){

 

    Point p;

    p.x = 100;

    p.y = 200;

    p.z = 300;

 

    cout << "p = (" << p.x << ", " << p.y << ", " << p.z << ")\n";

 

    p[0] = 10;

    p[1] = 20;

    p[2] = 30;

    cout << "p = (" << p[0] << ", " << p[1] << ", " << p[2] << ")\n";

}

 

< 결과 >

p = (100, 200, 300)

p = (10, 20, 30)

 

 

오퍼레이터를 추가하는 것이 귀찮거나 or 외부 라이브러리라서 할 수 없는 경우에는 아래와 같이 할 수도 있다.

int main(void){

 

    Point p;

 

    int* p2 = &p.x;

    p2[0] = 10;

    p2[1] = 20;

    p2[2] = 30;

 

    cout << "p = (" << p.x << ", " << p.y << ", " << p.z << ")\n";

}

 

< 결과 >

p = (10, 20, 30)

 

 

 

출처: http://qiita.com/_meki/items/eb17ecae1a7ba2fd458a

저작자 표시
신고
by 흥배 2015.12.04 08:00

Windows Vista 부터 새로 생긴 API CompareStringEx 라는 것이 있습니다.

함수는 이름을 보면 알듯이 문자열을 비교하는 것인데 일반적인 문자열 비교함수와 조금 다른 점 있습니다.

 

일반적인 문자열 비교에서는 문자열 "10" 문자열 "3" 비교하면 문자열 "3" 것으로 나옵니다.

그러나 보통 문자열을 비교한다면 숫자 비교처럼 결과가 나오기 바라는 경우가 많을 입니다.

이때 CompareStringEx 사용하면 좋습니다.

 

바로 예제 들어갑니다.^^

#include <windows.h>

#include <iostream>

 

int main()

{

    setlocale(LC_ALL, "Korean");

 

    wchar_t strResult[128] = {0,};

    wchar_t CSTR_RET[4][32] = { L"에러", L"작다", L"같다", L"크다" };

    int iCompareResult = 0;

    

    // 숫자 비교

    wchar_t szNumString10[16]    = L"10";

    wchar_t szNumString3[16]    = L"3";

 

    iCompareResult = CompareStringEx(LOCALE_NAME_SYSTEM_DEFAULT, SORT_DIGITSASNUMBERS,

                        szNumString10, -1, szNumString3, -1, NULL, NULL, 0);

    wsprintf(strResult, L"CompareStringEx %s는 %s보다 %s", szNumString10, szNumString3, CSTR_RET[iCompareResult] );

 

    std::wcout << strResult << std::endl << std::endl;

    

 

    iCompareResult = CompareStringEx(LOCALE_NAME_SYSTEM_DEFAULT, 0,

                        szNumString10, -1, szNumString3, -1, NULL, NULL, 0);

    wsprintf(strResult, L"CompareStringEx %s는 %s보다 %s", szNumString10, szNumString3, CSTR_RET[iCompareResult] );

 

    std::wcout << strResult << std::endl;

 

    return 0;

}

 

  < 결과 >

 

결과를 보면 알 수 있듯이 CompareStringEx 사용할 번째 인수로 비교 플래그 값을 설정할 SORT_DIGITSASNUMBERS 을 사용하면 문자열 비교를 숫자의 크기로 비교해 줍니다.^^

 

CompareStringEx

MSDN : http://msdn.microsoft.com/en-us/library/dd317761%28VS.85%29.aspx

신고
by 흥배 2012.10.18 09:00
이제 막 프로그래밍 공부를 하시는 분들 중 C 나 C++ 공부를 하시는 분들이 꽤 있는 것으로 알고 있습니다.
보통 이 분들이 공부를 하기 위해 책을 사서 보면 책에서 사용하는 VC++ 버전이 6이나 8,9 일 것입니다.

책과 똑 같은 버전의 VC++을 설치하면 책을 따라하는데 문제는 없겠지만 최신 버전이 나왔는데 그걸 사용하지
않는다는 것은 큰 낭비라고 생각합니다.^^
특히 C/C++을 공부할 때는 IDE의 기능을 거의 사용하지 않기 때문에 프로젝트를 새로 생성하고 실행만 해보면
됩니다.
그래서 VC++10에서는 어떻게 프로젝트를 생성하고 실행하는지 그림으로 보여드리겠습니다.


- 새로운 프로젝트 생성하기


VC++10을 실행한 후 위 그림과 같이 메뉴에서 선택합니다.




그림과 같이 'Visual C++'을 선택한 후 '빈 프로젝트'를 선택합니다. 그리고 아래의 이름에는 적당한 이름을 입력합니다.




위에서 프로젝트 생성이 끝나면 코딩을 하기 위해서 파일을 하나 추가합니다.
'소스 파일'을 마우스 오른쪽 클릭을 하면 나오는 메뉴에서 위와 같이 선택합니다.




보통 공부할 때는 파일 하나만 만들어서 생성하니 그림과 같이 'cpp' 파일을 선택 후 이름은 적당한 아무 이름을 입력합니다.




전 위에서 'main.cpp'을 만들었습니다. 위에 간단한 프로그램을 만들기 위해 코딩을 했습니다.



만들어진 프로그램을 실행해봅니다. IDE에서 바로 실행해보고 싶을 때는 위와 같은 메뉴를 선택합니다.




코딩할 때 잘못한 부분이 없다면 위 그림같이 프로그램이 실행됩니다.



아주 아주 쉽죠? ^^
C/C++ 입문 공부도 VC++ 10에서 하세요 ~ ^^

저작자 표시
신고
by 흥배 2010.06.16 08:30
이제 막 프로그래밍 공부를 하시는 분들 중 C 나 C++ 공부를 하시는 분들이 꽤 있는 것으로 알고 있습니다.
보통 이 분들이 공부를 하기 위해 책을 사서 보면 책에서 사용하는 VC++ 버전이 6이나 8,9 일 것입니다.

책과 똑 같은 버전의 VC++을 설치하면 책을 따라하는데 문제는 없겠지만 최신 버전이 나왔는데 그걸 사용하지
않는다는 것은 큰 낭비라고 생각합니다.^^
특히 C/C++을 공부할 때는 IDE의 기능을 거의 사용하지 않기 때문에 프로젝트를 새로 생성하고 실행만 해보면
됩니다.
그래서 VC++10에서는 어떻게 프로젝트를 생성하고 실행하는지 그림으로 보여드리겠습니다.


- 새로운 프로젝트 생성하기


VC++10을 실행한 후 위 그림과 같이 메뉴에서 선택합니다.




그림과 같이 'Visual C++'을 선택한 후 '빈 프로젝트'를 선택합니다. 그리고 아래의 이름에는 적당한 이름을 입력합니다.




위에서 프로젝트 생성이 끝나면 코딩을 하기 위해서 파일을 하나 추가합니다.
'소스 파일'을 마우스 오른쪽 클릭을 하면 나오는 메뉴에서 위와 같이 선택합니다.




보통 공부할 때는 파일 하나만 만들어서 생성하니 그림과 같이 'cpp' 파일을 선택 후 이름은 적당한 아무 이름을 입력합니다.




전 위에서 'main.cpp'을 만들었습니다. 위에 간단한 프로그램을 만들기 위해 코딩을 했습니다.



만들어진 프로그램을 실행해봅니다. IDE에서 바로 실행해보고 싶을 때는 위와 같은 메뉴를 선택합니다.




코딩할 때 잘못한 부분이 없다면 위 그림같이 프로그램이 실행됩니다.



아주 아주 쉽죠? ^^
C/C++ 입문 공부도 VC++ 10에서 하세요 ~ ^^

저작자 표시
신고
by 흥배 2010.06.16 08:30
혹시 책 내용이 이해가 안가는 분들을 위해서 주소 공간 관리식 동적 배열이 왜 일반적인 방식보다 좋은지 간단하게 풀어 보았습니다. GPG4의 설명은 선 지식이 없으면 이해하기가 쉽지 않은 것 같아요^^;






저작자 표시
신고
by 흥배 2010.02.17 08:30



위와 같이 디버깅 할 때 포인터 배열 p을 내용을 보고 싶을 때 Watch window Quickwatch window를 통해서 p를 보면 배열의 첫 번째 값만 보입니다.

 


1. p의 모든 값을 보고 싶을 때는 ‘변수, 배열 크기’Watch window에 입력합니다.

 

 

 

 

2. 특정 위치의 값만 보고 싶다면 '(변수 + 인덱스)'

 

 


 

Visual C++ 6 ~ 10까지 다 가능합니다.


출처 : http://support.microsoft.com/?scid=kb%3Ben-us%3B198953&x=8&y=16

 

저작자 표시
신고
by 흥배 2010.02.11 08:30

C89 : 1989 ANSI에서 의해서 처음으로 표준화 되었던 규격. ANSI X3.159 – 1989

C90 : 1990 ISO에 의해서 표준화 된 것. 기볹거으로 C89와 같으므로 ISO C라고 불린다.

C95 : 1995 C89에 국제화 된 와일드 문자 관련 라이브러리를 추가한 규격

C99 : 1999 ISO에 의해서 종래의 C 언어에 기능을 확장하는 형태로 책정된 규격

 

출처 : 도서 지금부터 시작하는 Visual C++ 2008”

저작자 표시
신고
by 흥배 2010.01.14 08:30

간혹 컴파일 하다보면 이런 경고가 튀어 나올때가 있다. (주로 warning level이 높게 지정된 경우 - 4정도? - 에 튀어나온다)

 

warning C4100: 'argc' : unreferenced formal parameter
warning C4100: 'argc' : 참조되지 않은 형식 매개 변수입니다.

 

한마디로, 선언은 해놨지만 쓰이지 않고 있다는 소리다.

Console 프로그램의 argc, argv같은 경우나, 프로토타이핑할 때 함수나 클래스의 껍데기만 만들다 보면 주로 발생한다.
사실 별로 상관은 없으니까 무시하면 된다...

그러나!! 계속 눈에 거슬리니까 신경 쓰인다. (당신도 변태? -_-+)

이럴땐 UNREFERENCED_PARAMETER(...) 매크로를 사용하자.

 

void SomeFunction(int arg1)
{
    UNREFERENCED_PARAMETER(arg1);
}

실제 구현은 다음과 같다. (winnt.h에 선언되어 있다. windows.h를 include하면 알아서 따라온다.)

 

#define UNREFERENCED_PARAMETER(P)          (P)



출처 : http://blog.daum.net/studiocoma/5960320


저작자 표시
신고
by 흥배 2010.01.02 20:00
랜 카드가 1개 있다는 가정하에서….

#include <ws2tcpip.h>

bool ServerInfoMgr::GetLocalIP( string& strIP )
{
    char host_name[256];
    if (gethostname(host_name, 256) == SOCKET_ERROR)
         return false;

   struct addrinfo hints, *res = NULL;
   char *szRemoteAddress=NULL, *szRemotePort=NULL;
   int rc; memset( &hints, 0, sizeof(hints) );
   hints.ai_family = AF_INET;
   hints.ai_socktype = SOCK_STREAM;
   hints.ai_protocol = IPPROTO_TCP;

   rc = getaddrinfo( host_name, szRemotePort, &hints, &res );
   if( rc == WSANO_DATA ) { return false; }

   char szIP[MAX_IP_STRING_LENGTH] = {0, };
   sprintf_s( szIP, MAX_IP_STRING_LENGTH, "%d.%d.%d.%d",
               (unsigned char)res->ai_addr->sa_data[2],
              (unsigned char)res->ai_addr->sa_data[3],
              (unsigned char)res->ai_addr->sa_data[4],
              (unsigned char)res->ai_addr->sa_data[5] );
             
   strIP = szIP;
   return true;
}

저작자 표시
신고
by 흥배 2009.12.07 08:30
mktime 함수를 사용합니다.


예제 코드
struct tm timeinfo;

memset( &timeinfo, 0, sizeof(timeinfo) );
timeinfo.tm_year = atoi( szYear ) - 1900;
timeinfo.tm_mon = atoi( szMonth ) - 1;
timeinfo.tm_mday = atoi( szDay );

DWORD nSecondTime = static_cast<DWORD>(mktime( &timeinfo ));

저작자 표시
신고
by 흥배 2009.12.04 08:30
Description of using C Run-Time (CRT) functions and CreateThread ()

http://support.microsoft.com/?scid=kb%3Ben-us%3B104641&x=6&y=13

C 런타임 라이브러리는 스레드 세이프 하다는 글이 있습니다.

 

fwrite
http://msdn.microsoft.com/ja-jp/library/h9t88zwz%28VS.80%29.aspx

파일 쓰기를 할 때는 내부적으로 lock을 건다고 합니다. 그래서 lock을 걸지 않으려면 다른 이름의 fwrite(_fwrite_nolock)를 사용해야 한다고 합니다.

 

fclose
http://msdn.microsoft.com/ja-jp/library/fxfsw25t%28VS.80%29.aspx


fprintf
http://msdn.microsoft.com/ja-jp/library/xkh07fe2%28VS.80%29.aspx

 

C 런타임 함수와 Win32 API 함수
http://www.biwa.ne.jp/~chu2/laboratory/win32api.html

C 런타임 함수와 그것과 맵핑되는 Win32 API 함수 리스트를 볼 수 있습니다.

 


저작자 표시
신고
by 흥배 2009.11.20 08:30
| 1 2 |

티스토리 툴바