初めてのC++/CLIその2
基本からということで文字列と配列について実験です。
#include "stdafx.h" using namespace System; using namespace System::Runtime::InteropServices; using namespace std; // arrayやpin_ptrを使うのに必要 using namespace stdcli::language; void test_string() { // ネイティブな文字列 char* native = "Hello"; printf("native %s.\n", native); // マネージドな文字列に変換 String^ managed = Marshal::PtrToStringAnsi(static_cast<IntPtr>(native)); Console::WriteLine("managed {0}.", managed); // ネイティブな文字列に変換 IntPtr h = Marshal::StringToHGlobalAnsi(managed); printf("nateive %s again.\n", h.ToPointer()); // 領域を開放 Marshal::FreeHGlobal(h); } void print_array(array<int>^ iarr) { for (int i = 0; i < iarr->Length; ++i) Console::Write(iarr[i].ToString()->PadLeft(4)); Console::WriteLine(); } void test_array() { Random^ r = gcnew Random; array<int>^ iarr = gcnew array<int>(10); for (int i = 0; i < iarr->Length; ++i) iarr[i] = r->Next(999); // ソート前 print_array(iarr); // 配列のポインタを取得し、固定 pin_ptr<int> pp = &iarr[0]; int* p = pp; // STLのsortを呼び出す sort(p, p + iarr->Length); // ソート後 print_array(iarr); } int _tmain() { test_string(); test_array(); Console::ReadLine(); } /* 結果 native Hello. managed Hello. nateive Hello again. 661 283 997 659 370 329 712 990 195 477 195 283 329 370 477 659 661 712 990 997*/
C++/CLI仕様書のドラフト見ながら弄っていたのですが、for eachが無かったり微妙に表記が変わったりしてます。Managed C++よりはずっと良くなっていますがC#2.0を弄った後だとIteratorやAnonymous Methodが無いのが不満に感じますね。