블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2799)
Unity3D (855)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

#################
 컨테이너 종류
#################

표준 STL 시퀀스 컨테이너 : vector, string, deque, list
표준 STL 연관 컨테이너 : set, multiset, map, multimap

비표준 시퀀스 컨테이너 : slit, rope
비표준 연관 컨테이너 : hash_set, hash_multiset, hash_map, hash_multimap

string 대한 vector<char>

표준 연관 컨테이너 대신 사용 되는 vector

STL에 속하지 않는 표준 컨테이너 : 배열, bitset, valarray, stack, queue, priority_queue

-------------------------
 연속 메모리 컨테이너
-------------------------
삽입 삭제시 메모리가 밀려 지거나 땡겨 지는 컨테이너(무효화!!! <-- 특히 이넘을 조심 해야 함.)
vector, string, deque.

---------------------
 노드 기반 컨테이너
---------------------
삽입 삭제시 메모리 포인터만 영향을 받음. 밀리는 현상 없음.
list, slist, set, multiset, map, multimap,
hash_set, hash_multiset, hash_map, hash_multimap


#######################################
STL은 복사에서 시작 하고 복사로 끝난다.
#######################################
값을 얻거나 넣거나 할때 모두 복사로 이루어 집니다.

상속된 클래스를 사용할 경우 베이스 클래스로 형 지정 했다면,
복사라는 특징 때문에 상속된 클래스는 잘리게 됩니다.(slicing problem)

이에 대한 해결 책은 클래스 포인터를 사용 하는 것입니다.(추후 설명)


배열
T w[maxT];

사이즈 0
vector<T> vw;

max T 만큼 미리 확보
vector<T> vw;
vw.reserve(maxT);


######################################
size() == 0을 쓰지 말고 empty()를 써라
######################################

size()를 제공 하지 않는 것도 있다. 예 list


######################################
단일 요소 반복 대신 범위 함수를 쓰자
######################################

void container::assign(시작, 끝)

void container::contrainer(시작, 끝)

void container::insert(삽입위치, 삽입 시작, 끝)

iterator container::erase(시작, 끝)     - 시퀀스 컨테이너

void container::erase(시작, 끝) - 연관 컨테이너(반복자의 반환으로 성능 저하 되므로...)


#####################
C++의 어이 없는 동작
#####################

 

#include <iostream>

class T {
public:
        T() { cout << "ok" << endl;}
};

int main() {
        T t1(); // 함수 선언, nothing...

        T t2;   // t 객체 생성, out "ok"
}

같은 원리로...

ifstream dataFile("ints.dat");
list<int> data(istream_iterator<int>(dataFile), istream iterator<int>());       // 단순한 함수 선언에 불과 하다.

list<int> data((istream_iterator<int>(dataFile)), istream iterator<int>());     // 해결, 범용성 떨어짐

<해결>
ifstream dataFile("ints.dat");
istream_iterator<int> dataBegin(dataFile);
istream_iterator<int> dataEnd;
list<int> data(dataBegin, dataEnd);


############################################################################
new로 생성한 포인터 컨테이너는 컨테이너가 소멸 되기 전에 포인터를 delete하자
############################################################################


vector<Widget *> vwp;

for(int i=0; i<NUM; ++i) {
        vwp.push_back(new Widget);      // new로 생성
}

//... 사용

for(vectro<Widget *>::iterator i = vwp.begin(); i!=vwp.end(); ++i)
        delete *i;              // delete로 소멸


<문제>
1. for루프는 for_each보다 명확하지 못하다.
2. 사용 중에 vwp가 예외를 던진 다음 메모리 누수 문제는 여전히 남는다.

<1번 해결>
struct Delete Object {
        template<typename T>
        void operator()(const T*ptr) const {
                delete ptr;
        }
};

for_each(vwp.begin(), vwp.end(), DeleteObject());

<2번 해결>
www.boost.org의 스마트 포인터 라이브러리를 사용 합니다.

void doSomething()
{
        typedef boost::shared_ptr<Widget> SPW;

        vector<SPW> vwp;

        for(int i=0; i<NUM; ++i)
                vwp.push)back(SPW(new Widget));
        ...
}

doSomething()함수가 끝나더라도, 예외가 발생 해도 메모리가 새지 않습니다.


##############################
auto_ptr 은 절대로 쓰지 말아라
##############################
auto_ptr은 스마트 포인터가 아니다. 자세한것은 Effective STL 참조!!!


##################
삭제의 조심 스러움
##################

무효화된 i에 대하여 ++i를 하고 있다.


AssocContainer<int> c;  // AssocContainer는 연관 컨테이너.
...
for(AssocContainer<int>::iterator i=c.begin(); i!=c.end(); ++i) {
        if(badValue(*i)) c.erase(i);
}

<해결>
AssocContainer<int> c;
...
for(AssocContainer<int>::iterator i=c.begin(); i!=c.end(); ) {
        if(badValue(*i)) c.erase(i++);
        else ++i;
}


연속 컨테이너인 경우 i++시 전체가 무효화 됩니다.

<해결>
for(SeqContainer<int>::iterator i=c.begin(); i!=c.end();) {
        if(badValue(*i)) {
                i = c.erase(i);
        }
        else ++i;
}


######################################################
STL 쓰레드는 쓰레드에 안전하지 않다.(직접 관리 해야함)



출처 : http://blog.naver.com/jinowin/6000269089

반응형
Posted by blueasa
, |

sendmessage in C#

Programming/C# / 2010. 12. 27. 01:42
1         [DllImport("user32.dll", SetLastError = true)]  
2         static extern IntPtr FindWindow(string lpClassName, string lpWindowName);  
3  
4         [DllImport("user32.dll", SetLastError = true)]  
5         static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);  
6  
7         [DllImport("user32.dll")]  
8         private static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);  
9  
10         static void Main(string[] args)  
11         {  
12             // Use this to send key strokes  
13             const int WM_KEYDOWN = 0x100;  
14             IntPtr windowHandle = FindWindow("NOTEPAD"null);  
15             IntPtr editHandle = FindWindowEx(windowHandle, IntPtr.Zero, "EDIT"null);  
16             PostMessage(editHandle, WM_KEYDOWN, 'A', 0);  
17             Console.ReadKey();  
18         }

1         [DllImport("user32.dll")]  
2         public static extern int SendMessage(int hWnd, int msg, int wParam, [MarshalAs(UnmanagedType.LPStr)] string lParam);  
3  
4         [DllImport("user32.dll", SetLastError = true)]  
5         static extern IntPtr FindWindow(string lpClassName, string lpWindowName);  
6  
7         [DllImport("user32.dll", SetLastError = true)]  
8         static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);  
9  
10         static void Main(string[] args)  
11         {  
12             const int WM_SETTEXT = 0x0C;  
13  
14             IntPtr windowHandle = FindWindow("NOTEPAD"null);  
15             IntPtr editHandle = FindWindowEx(windowHandle, IntPtr.Zero, "EDIT"null);  
16             string textToSendToFile = "Input here your text";  
17             SendMessage((int)editHandle, WM_SETTEXT, 0, textToSendToFile);  
18  
19             Console.ReadKey();  
20         }


반응형
Posted by blueasa
, |

C# SendMessage Keypress

Programming/C# / 2010. 12. 26. 23:45
#region Function Imports
 
       
[DllImport("user32.dll")]
       
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
       
[DllImport("user32.dll")]
       
static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
 
       
#endregion
 
       
#region Constants
 
       
// Messages
       
const int WM_KEYDOWN = 0x100;
       
const int WM_KEYUP = 0x101;
       
const int WM_CHAR = 0x105;
       
const int WM_SYSKEYDOWN = 0x104;
       
const int WM_SYSKEYUP = 0x105;
 
       
#endregion
 
       
public static void SendKey(string wName, Keys key)
       
{
           
IntPtr hWnd = FindWindow(null, wName);
 
           
SendMessage(hWnd, WM_KEYDOWN, Convert.ToInt32(key), 0);
           
SendMessage(hWnd, WM_KEYUP, Convert.ToInt32(key), 0);
       
}
 
       
public static void SendSysKey(string wName, Keys key)
       
{
           
IntPtr hWnd = FindWindow(null, wName);
 
           
SendMessage(hWnd, WM_SYSKEYDOWN, Convert.ToInt32(key), 0);
           
SendMessage(hWnd, WM_SYSKEYUP, Convert.ToInt32(key), 0);
       
}
 
       
public static void SendChar(string wName, char c)
       
{
           
IntPtr hWnd = FindWindow(null, wName);
 
           
SendMessage(hWnd, WM_CHAR, (int)c, 0);
       
}


반응형
Posted by blueasa
, |
System.String → char * (marshal_context)






■ System.String → char *

 예전 C++/CLI 에서는 System.String 문자열을 char * 형으로 변환하기 위해선
메모리를 할당하고, 할당된 메모리에 문자열을 복사하기 위해 Marshal::StringToHGlobalAuto 메소드를 호출했다.
그런 후, HGlobal 포인터를 char * 에 캐스팅 해주었다.

const char* unmanagedString = NULL;
try
{
    String^ managedString = gcnew String("managed string");
    // Note the double cast.
    unmanagedString = (char*)(void*)Marshal::StringToHGlobalAnsi(managedString);
}
finally
{
    // Don't forget to release. Note the ugly casts again. 
    Marshal::FreeHGlobal((IntPtr)(void*)unmanagedString);
}

 

 Visual Studio 2008 에서는 새로운 Marshalling Library 를 통하여 문자열을 복사하는 새로운 방법이 추가 되었다.
이 라이브러리는 Managed Code 의 System.String 과 Native Code 에서 문자열을 나타내는데 자주 쓰이는 타입
(char *, wchar_t *, BSTR, CStringT<wchar_t>, ...) 간의 변환을 쉽게 할 수 있게 해준다.

 Marshalling Library 에서는 marshal_context 라고 하는 새로운 클래스를 포함한다. 이 클래스는 문자열 변환 시
기본의 명시적으로 메모리를 해제 시켜 줘야 하는 작업을 대신 해준다. 따라서 문자열 변환 작업 시의 메모리 해제 및 누수에
대한 걱정을 덜어준다. marshal_context 클래스를 사용하는 예제는 다음과 같다.

marshal_context^ context = gcnew marshal_context();
String^ managedString = gcnew String("managed string");
const char* unmanagedString = context->marshal_as( managedString );



 기본 방법에 비해 코드가 상당히 줄어들었다. 또한 형변환을 위한 캐스팅 연산도 직접 작성하지 않아도 된다.
무엇보다도 제일 중요한 점은 char * 의 메모리 해제 시켜주는 작업을 작성하지 않아도 된다.
marshal_context 클래스는 모든 string 에 대한 참조를 유지한다. 유효 범위(scope) 를 벗어 날 때 소멸자가
그것들을 메모리 해제 시켜준다.






■ Native String → System:String




반대로 변환 하는 방법 역시 비슷하다.



System::String^ 타입을 const char *, const wchar_t *, BSTR 으로 변환하기 위해 marshal_as 를 직접 사용할 수는 없다. 왜냐하면 이러한 변환들은 사용 후에 메모리 해제를 위한 비 관리(Unmanaged) resource 를 필요로 한다. 아래와 같이 context 객체를 사용해야 한다. (즉, marshal_context 클래스의 객체 context 를 사용함으로써 marshal_context 의 소멸자가 메모리 해제를 해준다.)



context 객체는 동적 생성된 객체를 유지하다가 소멸자에서 그 메모리를 해제 시킨다. 내부적으로 할당된 객체들은 Linked-List 로 유지된다. 위의 코드에서 Console::WriteLine(context._clean_up_list.Count); 는 3을 출력 한다.




■ Extend the Marshaling Library 사용

String 타입을 변환할 때 다음과 같은 에러 메시지를 발생할 수 도 있다.

오류 1 error C4996: 'msclr::interop::error_reporting_helper<_To_Type,_From_Type>::marshal_as': This conversion is not supported by the library or the header file needed for this conversion is not included.  Please refer to the documentation on 'How to: Extend the Marshaling Library' for adding your own marshaling method.

CString 타입을 사용하려 하니까 나타난 에러 메시지 인데, MFC 사용할 때 CString 이 ATL data type 이라는 것을 얼 추 추측하긴 했지만 위와 같은 에러 메시지로 확신하게 되었다.

에러 메시지 내용대로 MSDN 의 How to:Extend the Marshaling Library 문서를 확인해 보니 ATL data type 을 위해선 marshal_atl.h 헤더 파일을 include 시켜줘야 한다.








■ 참조

1. More Tales from the Unmanaged Side - System.String -> char* : marshal_context 사용 전의 문자열 변환 방법
2. Tales from the Unmanaged Side – System.String –> char* (pt. 2)  : marshal_context 이용한 방법
3. Using marshal_as for mixed-mode string conversions : 여러 string type 의 conversion
4. Overview of Marshaling in C++
5. How to:Extend the Marshaling Library 


반응형
Posted by blueasa
, |
반응형

'Programming > C++/CLI' 카테고리의 다른 글

cli::array<t>^<t>  (0) 2011.03.24
System.String → char * (marshal_context)  (2) 2010.12.20
Arrays in C++/CLI  (0) 2010.11.26
Native C++에서 Managed C++에 접근이 필요할 때  (0) 2010.11.09
C++/CLI Singleton  (0) 2010.10.22
Posted by blueasa
, |

 

한빛네트워크에는 양질의 칼럼들이 많이 있습니다.

다음은 한동훈님의 칼럼 중에 Advanced C#을 주제로 작성된 칼럼들의 링크입니다.

 

Advanced C# 1. UML
http://network.hanbitbook.co.kr/view.php?bi_id=589

 

Advanced C# 2. 인터페이스
http://network.hanbitbook.co.kr/view.php?bi_id=590

 

Advanced C# 3. 디자인 패턴(DP)과 Simple Factory Pattern
http://network.hanbitbook.co.kr/view.php?bi_id=593

 

Advanced C# 4. DP - Monostate, Utility, Singleton Pattern
http://network.hanbitbook.co.kr/view.php?bi_id=595

 

Advanced C# 5. DP - Factory Method
http://network.hanbitbook.co.kr/view.php?bi_id=596

 

Advanced C# 6. DP - Abstract Factory
http://network.hanbitbook.co.kr/view.php?bi_id=594

 

Advanced C# 7. DP - Builder
http://network.hanbitbook.co.kr/view.php?bi_id=600

 

Advanced C# 8. DP - Prototype 패턴
http://network.hanbitbook.co.kr/view.php?bi_id=601

 

Advanced C# 9. 알고리즘 분석(Algorithm Analysis)
http://network.hanbitbook.co.kr/view.php?bi_id=602

 

Advanced C# 10. 분할의 아름다움 - 재귀와 비재귀
http://network.hanbitbook.co.kr/view.php?bi_id=603

 

Advanced C# 11. 방정식, 미적분법 그리고 delegate
http://network.hanbitbook.co.kr/view.php?bi_id=614

반응형
Posted by blueasa
, |
[Korean]

1) CheckBox 생성

2) CheckBox - 속성 - Appearance 값을 Normal -> Button으로 변경

3) 사이즈 조절 하려면 CheckBox - 속성 - AutoSize = false 로 변경



[English]

1) Create CheckBox

2) CheckBox - Attribute(or Preference?) - Appearance Value : Normal -> Button

3) Adjust Size : CheckBox - Attribute(or Preference?) - AutoSize Value : false

반응형

'Programming > C#' 카테고리의 다른 글

sendmessage in C#  (1) 2010.12.27
C# SendMessage Keypress  (1) 2010.12.26
Microsoft Win32 to Microsoft .NET Framework API Map  (0) 2010.12.10
경로명,확장자 분리 함수 등등  (0) 2010.12.09
C# 디폴트 파라미터 따라하기  (0) 2010.12.03
Posted by blueasa
, |
반응형
Posted by blueasa
, |

string str = @"E:\JAVA\Sample\X509Test\minMain.java.bak";

            System.Diagnostics.Debug.WriteLine("경로명:" + System.IO.Path.GetDirectoryName(str));
            System.Diagnostics.Debug.WriteLine("확장자:" + System.IO.Path.GetExtension(str));
            System.Diagnostics.Debug.WriteLine("파일명:" + System.IO.Path.GetFileName(str));

            System.Diagnostics.Debug.WriteLine("분리자:" + System.IO.Path.AltDirectorySeparatorChar);
            System.Diagnostics.Debug.WriteLine("확장자유무:" + System.IO.Path.HasExtension(str).ToString());
            System.Diagnostics.Debug.WriteLine("순파일명:" + System.IO.Path.GetFileNameWithoutExtension(str));
            System.Diagnostics.Debug.WriteLine("root:" + System.IO.Path.GetPathRoot(str));
            System.Diagnostics.Debug.WriteLine("랜덤파일명:" + System.IO.Path.GetRandomFileName());
            System.Diagnostics.Debug.WriteLine("임시파일:" + System.IO.Path.GetTempFileName());
            System.Diagnostics.Debug.WriteLine("임시경로:" + System.IO.Path.GetTempPath());

 

            //---------------------------------------------------------------------------
            int n= str.LastIndexOf(@"\");
            System.Diagnostics.Debug.WriteLine("파일명:" + str.Substring(0, n));
            System.Diagnostics.Debug.WriteLine("경로명:" + str.Substring(n + 1, str.Length - n - 1));

반응형
Posted by blueasa
, |
예제 XML 파일 
1.<!--?xml version="1.0" ?-->     <myapp>        <welcome>Welcome to MyApp</welcome>        <farewell>Thank you for using MyApp</farewell>              <windows>         <windowname="MainFrame" w="400" h="250"y="15" x="5">       </window></windows>       <connectiontimeout="123.456000"ip="192.168.0.1">       </connection></myapp>

파일에서 읽을때
1.TiXmlDocument document;        document.LoadFile(_File_Name_);

문자열로 읽을때
1.TiXmlDocument document;        document.Parse(szXML);

Node와 Element를 가져올때
1.TiXmlElement* pRoot = document.FirstChildElement("MyApp");        if( NULL == pRoot ) return FALSE;        char* szRootName = pRoot->Value(); //Value()를 사용하면 Node의 이름을 알수있다

각 태그의 속성값 읽어올때 
여기에선 위예제의 windows 태그의 속성을 읽어본다.
1.TiXmlElement* pElement = pRoot->FirstChildElement("Windows");        char* szName = pElement->Attribute("name");         char* szX = pElement->->Attribute("x");         char* szY = pElement->->Attribute("y");         char* szW = pElement->->Attribute("w");         char* szH = pElement->->Attribute("h");

정수형으로 읽고 싶으면~
1.int x;pElement->Attribute("x", &x);

모든 속성값을 한번에 읽어올때
1.TiXmlElement* pElement = pRoot->FirstChildElement("Windows");          TiXmlAttribute* attrib = pElement ->FirstAttribute(); //pElement의 속성을 받아온다.     while(attrib)   {           const char* szAttribute = attrib->Value();             attrib = attrib->Next();         }

Child Node를 순회 할때
1.TiXmlElement* pRoot = doc.RootElement();        TiXmlElement* pChild;        for(pChild = pRoot ->FirstChildElement() ; pChild != 0 ; pChild = pChild->NextSiblingElement())        { //Node를 돌면서..        }

Save XML 
Xml 형식선언할때
1.TiXmlDocument doc;   TiXmlElement* msg; TiXmlDeclaration* decl = newTiXmlDeclaration( "1.0""""" );   doc.LinkEndChild( decl );      //결과값 : <!--?xml version="1.0" ?-->

서브 노드를 추가할때
1.TiXmlElement * root = new TiXmlElement( "MyApp" );   doc.LinkEndChild( root );

주석문장을 추가할때
1.TiXmlComment * comment = new TiXmlComment();comment->SetValue(" Settings for MyApp " );  root->LinkEndChild( comment );

Message 서브노드와 하위 노드및 데이터를 추가할때
1.TiXmlElement * msgs = new TiXmlElement( "Messages" );       root->LinkEndChild( msgs );       msg = new TiXmlElement( "Welcome");       msg->LinkEndChild( new TiXmlText( "Welcome to MyApp"));       msgs->LinkEndChild( msg );       msg = new TiXmlElement("Farewell" );       msg->LinkEndChild( new TiXmlText( "Thank you for using MyApp" ));       msgs->LinkEndChild( msg );

노드를 추가하고 Attribute를 설정할때 레벨을 맞추기 위해서 root의 하위로 추가 한것을 주의 깊게 봐야 한다.
1.TiXmlElement * windows = new TiXmlElement( "Windows" );       root->LinkEndChild( windows );       TiXmlElement * window;     window =new TiXmlElement( "Window" );       windows->LinkEndChild( window );       window->SetAttribute("name""MainFrame");     window->SetAttribute("x", 5);     window->SetAttribute("y", 15);     window->SetAttribute("w", 400);     window->SetAttribute("h", 250);

Double 값 (소수점 값) 을 설정할때
1.TiXmlElement * cxn = new TiXmlElement( "Connection" );       root->LinkEndChild( cxn );       cxn->SetAttribute("ip","192.168.0.1");     cxn->SetDoubleAttribute("timeout", 123.456); // floating point attrib

Xml파일로 저장할때
1.// 파일로 저장      doc.SaveFile("text.xml");     //문자열로..     TiXmlPrinter printer;     printer.SetStreamPrinting();     Doc.Accept( &printer );      char* pAA = printer.CStr();                    // char* 를 반환한다.     std::string str = printer.Str();                  // std::string으로 반환한다.

반응형

'Programming > TinyXML' 카테고리의 다른 글

TinyXML Read  (2) 2010.12.08
TinyXML Write  (0) 2010.12.08
XML introduce(XML 문법 설명)  (0) 2010.04.27
Tiny XML 링크  (0) 2010.04.27
Posted by blueasa
, |