[an error occurred while processing this directive]
[an error occurred while processing this directive]
.NET
今後のスタンダード。でも普通のC++と混ぜて書こうとすると、GCがらみで怒られたり散々でした。.NET使うなら素直にC#で書くのが正解かも。
VC++ .NETは.NETと普通のC++を混ぜて使える!?
VC++.NETは、従来のC++に.NETという新しいライブラリが乗っかったもの…と僕も考えていました。でも、新しくソフト書くなら、そういう考えは捨てた方が良さそうです。
.NETではGC(garbage Collection)が導入されています。GC下のメモリはmanaged memory (管理されたメモリ)と呼ばれ、普通のmallocや今までのnew()で確保したメモリと互換性がありません。具体的に言うと、char *からconst char *へのキャストが出来なかったり、.NETのGCが行われるクラス内で確保されるオブジェクトはGCに対応していないといけない…などです。
STLとかCの関数をばりばり使ったクラスは.NETのクラスの外部に書いて、外から引数を渡して呼び出すのが良さそうです。
Some tips
-
In the case of C#, "lock" statement is provided, but for c++ you need to use Monitor class explicitely.
-
画面の幅と高さを取得(フルスクリーンのため)
Get screen width/height
(VC++ + Win32)
int sWidth = GetSystemMetrics(SM_CXSCREEN);
int sHeight = GetSystemMetrics(SM_CYSCREEN);
.NETだとこう書くのが勧められてる
In the .NET environment, the following is recommended.
using namespace System::Windows::Forms;
...
int width = SystemInformation::WorkingArea.get_Width();
int height = SystemInformation::WorkingArea.get_Height();
-
How to add interger and String?
using namespace System::Text;
...
StringBuilder *sb = new StringBuilder();
sb->Append("Time : ");
sb->Append(i);
String *s = sb->ToString();
Also S"hello" means an instance of System::String.
Still std::string seems to be more convenient...
-
Linuxのgettimeofdayみたいに使える関数としては、QueryPerformanceCounterがある。これ、現在のクロック数を取得する命令で、これをQuertPerformanceFrequencyで取得できる周波数で割ることで時間が取得できる。
引数はマクロ定義されているunionのLARGE_INTEGER。実体は64bitのint。なんだけど、このマクロが何かと干渉して、.NETのフォームで使おうとしたらこんなエラー。
error C2501: 'wform1::Form1::LARGE_INTEGER' : missing storage-class or type specifiers
error C3861: 'QueryPerformanceCounter': identifier not found, even with argument-dependent lookup
時計関連の関数(LARGE_INTEGERと QueryPerformanceCounter を外に出したら(別のソースに書いたら)、ちゃんと動きました。
-
上と同じような理由だと思うけど、時々MessageBox::show();も何かと干渉して動かない。なんとかしてくれ。
[an error occurred while processing this directive]