【.NET】 C++/CLI について語ろうぜ 【最適】
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん
2005/09/11(日) 23:54:01であろうC++/CLIについて語ろうぜ!
0809デフォルトの名無しさん
2006/03/05(日) 17:44:570810デフォルトの名無しさん
2006/03/05(日) 18:16:1132ビットしか返さない関数使ってるんだから当たり前だな
0811デフォルトの名無しさん
2006/03/05(日) 18:18:02だから、自分の使っている関数の方とかをチェックしてこいといってるだろうに
受け取り側を unsigned long long にしても、変換関数が対応していなけりゃ駄目だろ
おまいさんは文字列を 64 ビット長の整数値に変換したいんだから、それに対応した
変換関数を探してこい
>809 がいいヒントをくれているじゃないか
.net framework で 64ビット長符号なし整数値の型を探してそのメソッドを調べろよ
0812デフォルトの名無しさん
2006/03/05(日) 19:01:42>>806です
ttp://msdn2.microsoft.com/ja-jp/library/system.convert.touint64.aspx
Convert.ToUInt64 (Int32)
これでいいのかな?
0813デフォルトの名無しさん
2006/03/05(日) 19:09:18だったら使うべき変換関数は Convert.ToUInt64(String^) じゃないのかい
これなら、いちいち配列変換しなくてもいいわけだし
UInt64::Parse(String^) だってあるだろうに
もちろん、UInt64.ToString() とすれば、文字列への変換もできるぞ
C++/CLI は (3.14).ToString() ってやって文字列を取得することだってできるんだから
0814デフォルトの名無しさん
2006/03/05(日) 20:42:170815デフォルトの名無しさん
2006/03/05(日) 21:01:33unsigned long long hoge;
にすると
_ultow_s (hoge,foo,16,16);
ここで、
: warning C4244: '引数' : 'unsigned __int64' から 'unsigned long' への変換です。データが失われる可能性があります。
String ^tmp = Convert::ToUInt64(*foo);
とすると
: error C2440: '初期化中' : 'unsigned __int64' から 'System::String ^' に変換できません。
使用可能なユーザー定義された変換演算子がない、または
演算型のボックス化された形式からターゲット型への標準変換は存在しません
なんですよね、全くなにやってんだか・・・・
0816デフォルトの名無しさん
2006/03/05(日) 21:11:47Convert::ToUInt64は文字列をUInt64(unsigned long long)に変換するほうだ。
0817デフォルトの名無しさん
2006/03/05(日) 21:14:03UInt64 hoge = 0LL;
if ( UInt64::TryParse(textBox->Text) )
hoge = UInt64::Parse(textBox1->Text);
String^ tmp = hoge.ToString();
でいいんだって
なんでわざわざ wchar_t の配列に変換するのかな
ちゃんと、キーワードでぐぐるかMSDN見てる?
0818デフォルトの名無しさん
2006/03/05(日) 21:25:28Cのato〜とstrto〜。そしてそれぞれワイド文字版の_wto〜(非標準)とwcsto〜がある。sscanf/swscanf類もある。
C++のistringstream類。
.Net FrameworkのConvert::To〜と〜::Parce。
数値を文字列にするのには次のものがある。
Cの_〜toa、_〜tow(非標準)。sprintf/swprintf。この行のは全てVC8の_s版(全て非標準)もある。
C++のostringstream類。
.Net FrameworkのConvert::ToStringとObject::ToString。
ちなみにそれぞれ対称性がある。
C++のstream以外は全て数値の型により関数名などが異なっている。
だからunsigned longを使うかunsigned long longを使うかで違いが出てくる。
0819デフォルトの名無しさん
2006/03/05(日) 21:28:410820デフォルトの名無しさん
2006/03/05(日) 21:31:17C++にはまだないが、C++/CLIには存在する。
http://signe.japan.webmatrixhosting.net/ecma372/12_type.aspx
0821デフォルトの名無しさん
2006/03/05(日) 21:44:23それは知ってるが、標準関数が対応してないってこと
ってそこ直リンすんなよ
0822デフォルトの名無しさん
2006/03/05(日) 21:46:10だからC/C++のunsigned long longが関係するところは全て非標準だな。
0823デフォルトの名無しさん
2006/03/05(日) 21:49:23変に今までと一緒なもんだから、間違えやすいんじゃないかな
0824デフォルトの名無しさん
2006/03/05(日) 22:01:51答えているほうだって、あれ使え、いやこれ使えって具合だし。
そもそも一旦十六進法の文字列へ変換するまではともかく、その後文字列へ変換する必要性がわからない。
そのままtextBox2->Text = textBox1->Text;でいいと思うのだが。
大文字小文字を揃えたいだけならtextBox1->Text->ToUpper()で十分だし。
0825デフォルトの名無しさん
2006/03/05(日) 22:01:55どうもです
>>なんでわざわざ wchar_t の配列に変換するのかな
>>814さんの書いたとおり
std::wcstoulと_ultow_sの呪縛に囚われていました
こうやって見ましたが
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
UInt64 hoge = 0LL;
if ( UInt64::TryParse(textBox1->Text))
hoge = UInt64::Parse(textBox2->Text);
String^ tmp = hoge.ToString();
}
if ( UInt64::TryParse(textBox1->Text))ここで
: error C2661: 'System::UInt64::TryParse' : 1 個の引数を伴うオーバーロードされた関数はありません。
こうなるのですが・・・
0826デフォルトの名無しさん
2006/03/05(日) 22:04:35MSDN見ろ。
TryParseは2つ目に結果を格納する引数がある。
0827デフォルトの名無しさん
2006/03/05(日) 22:26:47private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
UInt64 hoge = 0LL;
if ( UInt64::Parse(textBox1->Text))
hoge = UInt64::Parse(textBox2->Text);
else
String^ tmp = hoge.ToString();
}
こうしたら、できましたが、実行すると
アプリケーションのコンポーネントで、ハンドルされていない例外が発生しまし。
中略
入力文字列の形式が正しくありません。
ust-In-Time (JIT) デバッグを呼び出すための詳細については、
ダイアログ ボックスではなく、このメッセージの最後を参照してください。
中略
************** JIT デバッグ **************
Just-In-Time (JIT) デバッグを有効にするには、このアプリケーション、
またはコンピュータ (machine.config) の構成ファイルの jitDebugging
値を system.windows.forms セクションで設定しなければなりません。
アプリケーションはまた、デバッグを有効にしてコンパイルされなければ
なりません。
0828デフォルトの名無しさん
2006/03/05(日) 22:28:57勘違いしたんじゃ、ないぞ。MSDNを見るようわざと間違えたんだからな
決して、名前だけで bool 値を返すんだろとか考えて適当に書いた訳じゃ、ないんだからな
0829デフォルトの名無しさん
2006/03/05(日) 22:30:52MSDN見ろ。1つめの引数の文字列の書式が書いてある。UInt64::Parseは十進法しか受け付けない。
Convert::ToUInt64なら基数が指定できるけど、Try版がないから例外を受けるしかないと思う。
0830デフォルトの名無しさん
2006/03/05(日) 22:30:54Try外していました
しかし、TryParseの問題を解決しても
例外エラーは出そうな感じがするんだが
0831デフォルトの名無しさん
2006/03/05(日) 22:39:02だから、MSDN で UInt64 のメソッドぐらいチェックしろと
そろそろ何をしたいのかがわからんのだが。自分が書いているコードの意味がわかってる?
textBox2 に textBox1 の内容をコピーしたいのなら >824 が言ってるとおり
textBox2->Text = textBox1->Text;
だけでいいはずだし、いったん、数字にしてなんかの検証をしたいのなら
なぜ、いきなり textBox2->Text から数値を取ってるんだ?
マジに書くと
if ( !String::IsNullOrEmpty() )
{
try
{
UInt64 hoge = UInt64::Parse(textBox1->Text);
textBox2->Text = hoge.ToString();
}
catch( ... )
{
}
}
まぁ、例外処理は除いたが、いったん数値にして、別のテキスト・ボックッスに文字列として
代入するならこんな感じだろ
0832デフォルトの名無しさん
2006/03/05(日) 22:40:02if ( !String::IsNullOrEmpty() ) →if ( !String::IsNullOrEmpty(textBox1->Text) )
だったorz
0833デフォルトの名無しさん
2006/03/05(日) 23:06:1516進数の入力判定を行い、(条件として、空でないこと、16進数16桁であること)
button2を押したら、openFileDialogを呼び出しファイルを選択してOKを押したら
textBox2に選択したファイルを読み込ませ(ここは既に実装できています)
最後にbutton3を押したらtextBox1とtextBox2を結合し、saveFileDialogで
名前を付けて保存するという、単純なものなのですが16進数変換と入力判定の所で
どつぼにはまってしまいました。
文字入力
↓
16進数変換&入力チェック
↓
外部ファイル読み込み
↓
16進数+外部ファイル結合
↓
名前を付けて保存
0834デフォルトの名無しさん
2006/03/05(日) 23:24:160835デフォルトの名無しさん
2006/03/06(月) 00:26:19//16進数を受け付ける
UInt64 hoge =Convert::ToUInt64(textBox1->Text,16);
//10進数を受け付ける
UInt64 hoge = UInt64::Parse(textBox1->Text);
textBox2->Text = hoge.ToString();
やっと16進数の入力を考えれるようになりましたが
UInt64 hoge =Convert::ToUInt64(textBox1->Text,16);
textBox2->Text = hoge.ToString();
で出力すると、ご丁寧にも16進数から10進数に変換されています
ヮ(゚д゚)ォ!
0836デフォルトの名無しさん
2006/03/06(月) 00:28:58何言ってんだ?
0837デフォルトの名無しさん
2006/03/06(月) 01:07:29アリガタマキン ( ´∀`)ノ⌒ω)Д`)ブニュ
UInt64 hoge =Convert::ToUInt64(textBox1->Text,16);
wchar_t foo[16];
memset(foo, 0, 16*sizeof(wchar_t));
_i64tow_s (hoge,foo,16,16);
String ^tmp = gcnew String(foo);
textBox2->Text = tmp;
しかし、例外処理が超難関だな(;´д`)トホホ…
try {}catch( )の構文前からスマートでかっこいいと思っていたので
覚えたいと思っていたんだがな、ムズそうだな・・・・
今更泥臭くMessageBoxで条件判定するのも、なんだかなぁー
0838デフォルトの名無しさん
2006/03/06(月) 01:19:030839デフォルトの名無しさん
2006/03/06(月) 04:30:32textBox2->Text = Convert::ToUInt64(textBox1->Text, 16).ToString("x");
ちゅうかうざい。
0840デフォルトの名無しさん
2006/03/06(月) 07:57:43だが、Express の配布で C++/CLI を使う初心者がこんな感じに騒いだらこの先恐ろしいな
0841デフォルトの名無しさん
2006/03/06(月) 08:43:29template引数で使うとconst wchar_t*にならない?
(generic,overloadだとStringになった)
void call_overload(String^ s){Console::WriteLine("String");}
void call_overload(const wchar_t* w){Console::WriteLine(L"const wchar_t*");}
template <typename T> void call_template(T t){Console::WriteLine( (T::typeid)->Name );}
generic <typename T> void call_generic(T t){Console::WriteLine( (T::typeid)->Name );}
call_overload(L"123");//String
call_template(L"123");//Char*
call_generic(L"123"); //String
0842デフォルトの名無しさん
2006/03/06(月) 11:11:27template では const char* や const wchar_t* が渡されたら、char や wchar_t の配列として
扱い、ジェネリック関数は型引数で const char* や const wchar_t* が渡された場合には
String として型推論するというルールだって
call_template(gcnew String("123"));
とやると、String としてちゃんと帰ってきた
0843デフォルトの名無しさん
2006/03/06(月) 13:16:33STL.CLIみたく、MFC.CLIが出るんでつか?
0844デフォルトの名無しさん
2006/03/06(月) 13:20:150845デフォルトの名無しさん
2006/03/06(月) 13:27:29http://www.gotdotnet.com/japan/team/windowsforms/windowsformspainting.aspx
これを参考に、C++/CLI からのグラフィックスの基礎を勉強しています。
最後の TextClipping というアプリケーションの例で、
protected override void OnPaintBackground(PaintEventArgs e)
という C# における記述が出てくるのですが、
同様の記述を C++/CLI でやってみたところ、
override 仕様にも基本クラスで OnPaintBackground は
virtual じゃないよ、って言われます。
.NET Framework 2.0 で何か変更になったのでしょうか?
0846デフォルトの名無しさん
2006/03/06(月) 14:19:420847デフォルトの名無しさん
2006/03/06(月) 14:49:300848デフォルトの名無しさん
2006/03/06(月) 15:17:51System::Windows::Forms で virtual で宣言
されている「はず」だったんですが・・・
んじゃ、OnPaint とかを乗っ取る事はできないのかなぁ。
0849デフォルトの名無しさん
2006/03/06(月) 15:28:570850デフォルトの名無しさん
2006/03/06(月) 15:57:19まぁ、漏れあてなんだろうけど、C++/CLI では暗黙のオーバーライドは禁止されている
ちゃんと
virtual void OnPaintBackGround(...) override ←これ
{
...
}
と記述してる? これ書いても上書きできていないの?
0851デフォルトの名無しさん
2006/03/06(月) 17:32:020852デフォルトの名無しさん
2006/03/06(月) 21:01:390853デフォルトの名無しさん
2006/03/07(火) 18:46:38void button1_Click( Object^ /*sender*/, System::EventArgs^ /*e*/ ){
hoge = "";
〜
}
private:
内で定義した変数って、よそのプロシージャーでは当然使えませんよね
グローバル変数で定義すれば、いいのだろうけど
NETで
※どんなアルゴリズムでも、グローバル変数なしで
記述できることが証明されています。
グローバル変数は後述するように、非常に強力な反面、
大きな危険性を秘めています。
とはいえ、絶対に知っておくべき事柄です。
らしい、button1で発生した変数を、button2のイベントが起きたときに
継承させる方法を
、グローバル変数無しで実現できるの?
0854デフォルトの名無しさん
2006/03/07(火) 19:41:37ってのは置いといて、そのフォームのメンバ変数は
button1_Click() からでも button2_Click() からでも
アクセスできるじゃん。
0855デフォルトの名無しさん
2006/03/07(火) 20:40:47private:
void button1_Click( Object^ /*sender*/, System::EventArgs^ /*e*/ ){
hoge = "";
〜
} private:
void button2_Click( Object^ /*sender*/, System::EventArgs^ /*e*/ ){
textBox2->Text=hoge;
〜
}
: error C2065: 'temp' : 定義されていない識別子です。
0856デフォルトの名無しさん
2006/03/07(火) 20:57:37それ別の位置でコンパイルエラー出てるだけじゃないか?
そのコードの中にtempなんて識別子は出てないのだが
0857デフォルトの名無しさん
2006/03/07(火) 21:14:41この人が言ってるの、auto 変数のことじゃない?
メソッド内部で宣言したローカル変数にアクセスしたがってるんだよ
0858デフォルトの名無しさん
2006/03/07(火) 21:20:23プロシージャとかいってるからたぶん
VB使いかな?とか思った。
0859デフォルトの名無しさん
2006/03/07(火) 21:53:500860デフォルトの名無しさん
2006/03/07(火) 21:55:540861デフォルトの名無しさん
2006/03/07(火) 21:56:09何にしても、そんな状態でC++/CLIに手を出すのはやめた方がいいと思う
0862デフォルトの名無しさん
2006/03/07(火) 22:24:460863デフォルトの名無しさん
2006/03/07(火) 22:51:560864デフォルトの名無しさん
2006/03/08(水) 02:13:350865デフォルトの名無しさん
2006/03/08(水) 02:40:33複雑さを避けたいなら、C#だよな。
あ、VB.NET って手もあるか。
0866デフォルトの名無しさん
2006/03/08(水) 02:58:40> まぁ何でもあり(?)なのが C++/CLI だしなぁ。
まさにC++から派生した、って感じだな
0867デフォルトの名無しさん
2006/03/08(水) 07:35:51managed_ptr<Object> obj = managed_new<Object>();
みたいな。
0868デフォルトの名無しさん
2006/03/08(水) 07:39:15結局言語使用の拡張に踏み切ったんだろ。
0869デフォルトの名無しさん
2006/03/08(水) 08:18:59逆に、どこまでが既存の C++ でどこからが CLI 拡張かわかりやすくていいと思うよ
mc++ の混乱ぷりから考えるに、MSが出した仕様にしてはさっぱりしすぎて不思議
時代が変わっても、フレームワークをさくっと切り替えるだけで対応できるし、VES も
簡単に交換可能なところが夢があると思われ
また、C++ 自体の拡張の邪魔にならないところとかもいい
Sun も JNI の仕様をこれにしないかな。そしたら、JVM も使う気になるのに
0870デフォルトの名無しさん
2006/03/08(水) 08:24:21C++/CLI とどっちを使う??
0871デフォルトの名無しさん
2006/03/08(水) 08:38:560872デフォルトの名無しさん
2006/03/08(水) 09:48:43だれだよ、俺のプロジェクトで勝手に /clr:pure にした奴は!
おかげで全部 __clrcall になっててリンクできずに
一晩悩んだじゃないか!
さて、そろそろ帰るか。
0873デフォルトの名無しさん
2006/03/08(水) 19:50:08Javaをネイティブ拡張したもの≒C#
0874デフォルトの名無しさん
2006/03/08(水) 20:04:29C# = Java++ = C++--++
0875デフォルトの名無しさん
2006/03/08(水) 21:20:07ネイティブじゃナインじゃん
0876デフォルトの名無しさん
2006/03/08(水) 21:26:46String^ arg_2 = def;
textBox1->Text = arg_1 + arg_2;
としたら
abcdef
と出力出来ますが
textBox1->Text = arg_1 + endl + arg_2;
: error C2679: 二項演算子 '+' : 型 'overloaded-function' の右オペランドを扱う演算子が見つかりません (または変換できません)。
となり、期待していた
abc
def
が出来ません
誰かrg_1とarg_2の間に改行を入れて
abc
def
となる様にしてください。
オナガイシマス
0877デフォルトの名無しさん
2006/03/08(水) 21:33:420878デフォルトの名無しさん
2006/03/08(水) 21:34:09じゃなくて
textBox1->Text = arg_1 + "\n" + arg_2;
でいいじゃん。
std::endl はマニピュレータで、、
マネージド型である String に対して
+ 演算子がオーバーロードされているなんてことはまずない。
0879デフォルトの名無しさん
2006/03/08(水) 21:36:400880デフォルトの名無しさん
2006/03/08(水) 21:45:08textBox1->Text = arg_1 + "\n" + arg_2;
としたら
コンパイルも通ったんだけど
textBox1に表れた文字が
abc・def
全角文字の・に似た記号が出ます(多分全角の・とは違う気がするが、定かではない)
秀丸に貼り付けると
abc
def
と改行されてるんだが、なぜ?
0881デフォルトの名無しさん
2006/03/08(水) 21:47:30サンクスできましたが、解説もオナガイシマス
なんで
"\n"では駄目で"\r\n"なの?
0882デフォルトの名無しさん
2006/03/08(水) 21:54:42UNIXとかのコンソールプログラムでは\nで
Macは"\r"
0883デフォルトの名無しさん
2006/03/08(水) 21:56:390884デフォルトの名無しさん
2006/03/08(水) 21:57:50Unix : 円 n
Windows : 円 r 円 n
旧 mac : 円 r
コンソールアプリは透過的に 円 n ⇔ 円 r 円 n やってくれるが
テキストボックスとかはやってくれない。
秀丸じゃなくってノートパッドならやっぱりナカテンが出ると思う。
0885デフォルトの名無しさん
2006/03/08(水) 21:58:49OS X は ¥n になったよ ... 関係ないですが。
0886デフォルトの名無しさん
2006/03/08(水) 22:01:40>>881です
ご丁寧にありがとうございました、よく理解できました
しかし皆さん本当に良く知ってますね
0887デフォルトの名無しさん
2006/03/08(水) 22:01:47どっちかと言うと円記号よりもバックスラッシュ。
0888デフォルトの名無しさん
2006/03/08(水) 22:16:410889デフォルトの名無しさん
2006/03/08(水) 22:31:06ありがとう
スマソ、やっぱりC++/CLIならこうですよね
(゚д゚)(。_。)(゚д゚)(。_。) ウンウン
msdnでよく調べます
0890デフォルトの名無しさん
2006/03/09(木) 18:13:54下記のコードでコンパイルも通りるのですがアプリケーションのコンポーネントで、
ハンドルされていない例外が発生しました〜後略
別のプロセスで使用されているため、プロセスはファイル'C*\hoge.txt'に
アクセスできません。
となってしまいます、どこがおかしいのでしょうか?
protected:
void button3_Click(Object^ /*sender*/, System::EventArgs^ /*e*/){
using ::System::Windows::Forms::DialogResult;
Stream^ myStream ;
SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog();
saveFileDialog1->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" ; saveFileDialog1->FilterIndex = 2 ;
saveFileDialog1->RestoreDirectory = true ;
if(saveFileDialog1->ShowDialog() == DialogResult::OK)
{
if((myStream = saveFileDialog1->OpenFile()) != nullptr)
{
// Code to write the stream goes here.
System::IO::StreamWriter^ sw = gcnew
System::IO::StreamWriter(saveFileDialog1->FileName);
sw->Write(arg_1);
sw->Close();
myStream->Close();
}
}
}
0891デフォルトの名無しさん
2006/03/09(木) 18:29:48すでに開いているストリームに対してStreamWriterを使うのならStream^を渡す。
0892デフォルトの名無しさん
2006/03/09(木) 18:50:37なんか、聞けばいいと思っている輩が増えてきた気がするんだが
0893デフォルトの名無しさん
2006/03/09(木) 18:53:25SaveFileDialog->OpenFileに書き込むには
どうしたらいいですか?
0894デフォルトの名無しさん
2006/03/09(木) 19:15:18初心者はC#かVBからはじめるのがいいよ。MSDNの見方くらい覚えような。
0895デフォルトの名無しさん
2006/03/09(木) 20:52:02ありが�d
0896デフォルトの名無しさん
2006/03/10(金) 01:26:35なぜこんなところで教えてくんしてるのか判らん。
(マニア、というのは、それでないと書けないほどのアプリを
書かないといけないはめになっていないと使わないだろう、
ぐらいの意味。)
MSDN 読めるぐらいでないと C++/CLI 手を出さないと思うんだが、
どうなってんだろう?
0897デフォルトの名無しさん
2006/03/10(金) 03:18:050898デフォルトの名無しさん
2006/03/10(金) 08:44:22少しはC++をやっていて、新しい言語に手を付けずに.Netが使えるぞと思っているんだよ、きっと。
実際はC++とC++/CLIとは別物だということを知らず。
0899デフォルトの名無しさん
2006/03/10(金) 09:08:02一般的にC++が普及してた。
ライブラリはMFCやらWin32APIやらATLを使ってたであろう。
そして、MSの次期スタンダードなライブラリが、.NETになった。
じゃあ、C++から.NETを使おうか。
こんな感じでしょ。
間違いだとも思わない。
0900デフォルトの名無しさん
2006/03/10(金) 09:11:06ライブラリ間の違いのほうが余程大きいと思うんですが...
0901デフォルトの名無しさん
2006/03/10(金) 09:18:01PC以外で死滅気味だった言語が台頭。サーバーサイドJavaや組み込みC++。
サーバーサイドや組み込みに足を踏み入れるドトネトとC丼を強制。
ブビ厨氏滅&ドトネト氏産。
オネガイC++からドトネト使ってトンでも言語mc++ → C++/STL.CLI
0902デフォルトの名無しさん
2006/03/10(金) 09:22:57日本語でおk
0903デフォルトの名無しさん
2006/03/10(金) 09:44:39C++の文法複雑+マネージドの理解+旧COMの理解を要するなんてサイアクじゃん。
で、C++のBoostなんかは使えないという利点が無いオマケ月。
0904デフォルトの名無しさん
2006/03/10(金) 09:51:19たとえば Boost.Serialization で既存のデータを読み込んで、
Windows Forms で表示したり ADO.NET で DB に投入したりできる。
0905デフォルトの名無しさん
2006/03/10(金) 09:54:30書いてて自分の文章の複雑さに気付かない?
0906デフォルトの名無しさん
2006/03/10(金) 09:56:50こういうこともあるみたいだけど。
0907デフォルトの名無しさん
2006/03/10(金) 10:01:59なんだ、丸々大ウソか。
さすが線能されてるだけある。
M$もCOMでC++を汚しきったが、mc++で文法破壊、CLIでライブラリ破壊だね。
レス数が900を超えています。1000を超えると表示できなくなるよ。