2015년 1월 27일 화요일

MFC 에서의 클래스위자드에서는 ON_MESSAGE는 자동화 해주지 않는다..

Note
ClassWizard does not support entering ON_MESSAGE handler routines from the ClassWizard user interface: you must manually enter them from the Visual C++ editor. Once entered, ClassWizard will parse these entries and allow you to browse them just like any other message-map entries.

MSDN 발췌: POSEMESSAGE SENDMESSAGE 를 처리하는 루틴은 
클래스 위자드에서 지원하지 않는다.
따라서 수동으로 추가하여야 한다

c++ 디폴트 생성자와 함수 선언


class MyClass
{
   //...
   //...
};


main()
{
    MyClass my();//문제가 될 소지가 있다 c++ 컴파일러 파서에서는 함수의 선언인지 
                 //디폴트 생성자인지 처리해야하는 모호함의 문제가 있다 
                 //컴파일러에 따라 경고,혹은 error 처리 된다
}

2015년 1월 6일 화요일

윈도우 8.1 IDE 로 설치후 AHCI 로 바꾸는 방법

출처:
http://pricklytech.wordpress.com/2014/02/04/windows-8-1-enabling-ahci-after-installing-windows/

1. 시작 버튼에 마우스 오른쪽 클릭후 메뉴에 관리자 권한으로 명령 프롬프트를 실행한다

2. bcdedit /set {current} safeboot minimal 라고 입력 한다

3. 후에 재부팅 하고 부팅 전 바이오스에 들어가(일반적으로 DEL,F9,F8 버튼을 누르면 들어간다) IDE 모드를 AHCI로 변경한다

4. 윈도가 안전모드로 부팅되면 마찬가지로 관리자 권한 명령 프롬프트를 실행한다

5. bcdedit /deletevalue {current} safeboot 를 입력후 재부팅 한다


2014년 12월 23일 화요일

매개변수에서 const 위치

1. const 가 * 의 왼쪽에 위치 시 포인터가 가르키는 대상이 상수.. char  const * a
  a[0]='a' 불가
2. const 가 * 의 오른쪽에 위치 시 포인터 변수가 상수 char * const  a
    a = "abcd " 불가

타입명과 const 위치는 바뀌어도 뜻은  똑같다.
void fun (const char *a)
void fun (char const *a)

2014년 12월 18일 목요일

포인터

포인터는 변수의 타입이며 무엇이든 그 컴퓨터의 주소를 담을수 있다.

포인터 형을 일반 지역변수에서 선언하던, 전역에서 선언하던 함수의 인자에서 선언하던 해당 컴퓨터/컴파일러의 주소범위 내의 사이즈 타입의 변수에 그 포인터 원형의 주소가 담기게 된다.

애초에 int a char b 처럼 변수의 이름은 컴파일시 심볼테이블에 의해 실 주소로 치환이 된다.
이것을 이해하면 포인터의 주소개념을 더 명확히 할수 있다.

거기서 오프셋 연산이나 역참조를 통한 직접접근이 가능하게 되는것이다. 포인터가 담기게되는 스택형 변수와 힙 포인터를 착각하게 되는것을 주의하자.

char * pc  -> char 타입이 담겨있는 주소. 즉 pc의 실제 메모리 주소를 가르킨다.

char ** ppc -> char * 타입이 담겨있는 주소. 역시 ppc 주소를 가르키며 그 안에는 당연히 char* 타입의 데이터가 담겨있어야 한다.



2014년 12월 9일 화요일

C 에서의 extern

사용되고 있는 변수가 다른 파일에서 정의(기억장소가 할당되도록 함) 되었다면
그 외부변수를 사용하기 위해 extern 으로 '선언' 하고 사용하여야 한다
보통 한 파일에서  아래와 같은 방식으로 사용한다

file1.c
int gInt = 1; //정의와 선언

file1.h
extern int gInt;

file2.c
#include "file1.h"
gInt = 2;
단 배열의 extern 은 그 크기를 명사하여야 하나
extern 에서는 생략이 가능하다
즉 아래의 표현은 동일하다

extern int array[10];
extern int array[]; 

2014년 12월 7일 일요일

콜렉션 FIND predicate 함수를 사용하는 3가지 방법

콜렉션 개체

public class person
{
    public int Anni { get; set; }
    public string Nome { get; set; }
    public person(int anni, string nome)
    {
        this.Anni = anni;
        this.Nome = nome;
    }
}
무명 메소드 (델리게이트 사용)

//I assume I have a non-empty list List agenda = new List();
/* .. load objects from DataBase .. */

//I create a simple search criteria string personToBeSearched = "mario";
person mario = agenda.Find(delegate(person p) { return p.Nome == personToBeSearched; });
람다 식 사용

//I assume I have a non-empty list List agenda = new List();
/* .. load objects from DataBase .. */

//I create a simple search criteria string personToBeSearched = "mario";
person mario = agenda.Find(p => p.Nome == personToBeSearched;);
델리게이트 사용

private static bool findTeen(person p)
{
    if (p.Anni < 18)
        return true;
    return false;
}

List BlockBuster_GameOnly = agenda.findAll(findTeen);

C# 에서 (C,C++ dll) 로드시 hresult 0x8007007e Exception from HRESULT: 0x8007000B

개발한 PC에있는 dll이 실행하는 PC에 없는 경우이다..
http://www.dependencywalker.com/  를 통해 내가 만든 dll 의존성 검사를 한후
존재하지 않는 dll을 추가시켜주면 된다.

그러나 의존하는 dll이 많은 경우?
해당 DLL 컴파일시 옵션을 아래와 같이 수정해도 된다

 /MT switch instead of /MD—(it's found in the UI under "Configuration Properties" -> "C/C++" -> "Code Generation" -> "Runtime Library").

설정 -> c/++ 코드 생성 -> 런타임 라이브러리에서 /md로 되어있는것을 /mt로 변경한다

2014년 11월 14일 금요일

c++ >> << 연산자 재정의를 이용한 스택 .


#include 
using namespace std;

template 
class stack {
private:
 int top;
 Data* dataArray;

public:
 //top -1로 초기화
 stack() : top(-1) {
  dataArray = new Data[3];
 };
 //push &참조자를 리턴하는 이유는 중복 호출시 다시 부르는 객체가 자기자신이기 때문.
 stack& operator<<(Data data) {
  this->dataArray[++top] = data;

  return *this;
 }
 //pop 역시 참조자 리턴 이유는 같음
 //참조자를 리턴하지 않을경우 복사 생성자가 불리며(디폴트) 복사 된 객체가 다시 오퍼레이터를 부른다 연속 연산 할때.
 stack operator >> (Data &data) {
  data = this->dataArray[top--];
  return *this;
 }
 int operator!() {
  if (top == -1) {
   return true;
  }
  else {
   return false;

  }
 }

};

//<< push
//>> pop
int main() {
 stack stack;
 int x = 0, y = 0, z = 0;
 ((stack << 3) << 5) << 10;

 //참조자 리턴의 이유 (리턴된 참조자가 다시 연산자 오퍼레이터를 부른다)
 (stack.operator >> (x)) >> y >> z;
 cout << x << ' ' << y << ' ' << z << ' ';


 cout << endl;
}
결과는 10 5 3

2014년 9월 15일 월요일

C++ : 콜론 연산자 정리

1. (:) 콜론 연산자
초기화 리스트 initialize list 라 부른다.
객체를 초기화 할때 사용 대입이 아닌 초기화.
상수를 초기화 할때나, 상속시 부모객체의 생성자를 호출하고 싶을 때 사용한다

class Myclass
{
   const int n;
   public:
           Myclass(int pn) : n(pn){
//do something
} 
 
}
2 (::)더블콜론 연산자 (Scope Resolution Operator)
중괄호를 벗어난 범위 밖에서 참조 하고 싶을 때 사용한다 


class b
{
 public:
          static const int gn = 0;
          void fun(int);
 }
void b::fun(int n)
{
}
void main()
{
   int n =   b::gn;
}