1 名前:デフォルトの名無しさん mailto:sage [2006/03/12(日) 16:08:39 ] おそらく、.NET開発でデファクトスタンダードに最も近い であろうC++/CLIについて語ろうぜ! このスレはC++および.NET Frameworkについて一定以上の知識を持っている人が対象となります。 .NETのクラスライブラリの使い方といった質問は姉妹スレ「くだすれC++/CLI(初心者用)」に お願いします。 前スレッドはこちら (p)pc8.2ch.net/test/read.cgi/tech/1126450441/l50 姉妹スレ くだすれC++/CLI(初心者用) (p)pc8.2ch.net/test/read.cgi/tech/1142144110/l50 managed C++ やろうぜ!! 002 (p)pc8.2ch.net/test/read.cgi/tech/1139043535/l50
321 名前:319 [2007/07/06(金) 06:41:49 ] それで、肝心のことなんですが、アンマネージドな C++ のクラスを .NET 環境で使うためには C++/CLI でラッパークラスを書けば いいのでしょうか?そうするとマーシャリングなども自動で やってくれるということなのでしょうか? DLL は C++ にやさしくない、かといって COM コンポーネント として書いてしまうとプラットフォームに強く依存しすぎるので 一般的な用途のクラスライブラリには向かない、 でもアンマネージドな C++ のクラスを .NET と仲良くさせたい、 という課題をどう解決すればいいのかを教えてください。
322 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:19:58 ] > そうするとマーシャリングなども自動で > やってくれるということなのでしょうか? そういうことになるが、ある意味自分で マーシャリングコードを書く補助をしていると言ってもいいかもしれない。 アンマネージクラスをC#(やその他.NET言語)から呼び出したければ、 C++/CLIでそのクラスをラップしたマネージクラスを含むマネージドDLLを作って、 他の言語から参照設定して使うのが一番率直な手段。 そもそもC#でアンマネージDLLのC++クラスを操作するなんて不可能だぞ。 (COMインタフェース経由を除く)
323 名前:319 [2007/07/06(金) 10:57:16 ] >C++/CLIでそのクラスをラップしたマネージクラスを含むマネージドDLLを作って、 >他の言語から参照設定して使うのが一番率直な手段。 やっぱそうですか、ある意味安心しました。 System.Runtime.Interop 以下にいろいろあるのを眺めてて、 もしかしてマネージドからなんかうまい具合にごにょごにょ できる方法が用意されてるのかなぁ、などと疑心暗鬼になってました。
324 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 13:26:04 ] VC2005でデフォルトのフォームアプリを作成して、 CLRサポートを/clrにして以下のインクルードを追加すると 実行時ヒープエラーみたいなのが出ます。 #include <comdef.h> #pragma comment(lib, "oleaut32.lib") どうやって直したらいいのでしょうか?
325 名前:デフォルトの名無しさん [2007/07/24(火) 03:07:41 ] なんで Void って大文字になったの?
326 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 03:13:36 ] ヘミvoidが権利を主張するのを避けるため
327 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 23:16:42 ] System::Void のこと?
328 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 23:50:23 ] 当たり前のことなんだろうけどvoid代わりに使えるのが少し不思議に感じる。 #include <cstdlib> int main() { System::Void* pv = std::malloc(256); std::free(pv); }
329 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 02:28:58 ] 自分自身の起動パスを得るにはどうしたらいいの?
330 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 13:29:14 ] CRTの__argv[0]やWin32のGetModuleFileName(0,とか .NETのSystem::Windows::Forms::Application::ExecutablePathなど。
331 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 22:11:43 ] Applicationにあったのか! ありがとう。 ずっとProcessとかを探してたよ Win32APIのときGetModuleDirectoryとかなんとかだったから
332 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 22:51:56 ] >>331 その線も惜しい。 Win32はGetModuleFileNameだったでしょ。 .NETだとモジュール (EXE/DLL)に対応するものはアセンブリだから、 その方向でやるならAssemblyクラスが正解だった。 www.atmarkit.co.jp/fdotnet/dotnettips/016exepath/exepath.html
333 名前:デフォルトの名無しさん [2007/07/27(金) 12:14:00 ] Visual Studio 2005 で C++/CLI を使おうとしています。 std::vector<System::String^> のように標準のSTLのコンテナには ハンドルを格納することはできないのでしょうか? C++/CLI にはマネージドな世界独自のコンテナクラスライブラリが 用意されているのでしょうか?今の自分は array<String^> しか使えずさみしい毎日を過ごしています。 std::vector<System::String^>^ lines; try{ for(;;) lines->push_back(stream_reader->ReadLine()); } catch 以下略 のようにぶん回してファイルを行単位で全行 読み込みたいだけなのですが・・・
334 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:19:12 ] >>333 >C++/CLI にはマネージドな世界独自のコンテナクラスライブラリが つSystem::Collections::Generic STL.NET構想はどっかいっちゃったけどな
335 名前:デフォルトの名無しさん [2007/07/27(金) 12:26:29 ] >>334 おお、「コレクション」というのですか。 どうりで C++ CLI コンテナ で検索していても 昔の managed C++ の資料や gcroot でがんばる という方法しか見つからず難儀していました。 しかも cliext::vector なんかも見つかってしまい、 余計に混乱していました。cliext 名前空間以下の 識別子ってのが STL.NET なんですかね?
336 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:42:30 ] >335 STL.NET は STL/CLR という名前で VS2008 に同梱 ただ、.net fx 2.0 では動かない こういう後方互換性がないものを C++/CLI で出してほしくなかった
337 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:47:04 ] >後方互換性 上位互換が無いってことか?
338 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:49:22 ] >>336 それで困るやつはどれだけいるんだ
339 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:51:29 ] STLってのはC++では最重要なんだが...
340 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:55:13 ] >>336 それ本当? .NET Framework 3.0も3.5もCLRのバージョンは2.0のままだろ。
341 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 13:07:08 ] .net fx 2.0 で作ってた既存アプリに STL/CLR を使って修正すると、アプリの実行に 3.5 が必要になるのは嫌じゃね? 前のCTPの頃はライブラリだけ持って行けばよかったんだが
342 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 13:22:05 ] >340 Beta1 で Microsoft.VisualC.Stlclr.Dll +ヘッダ抜き出しで駄目だったという報告があった とりあえず、Beta2 が来てるんで、入れて試してみる 一応、「Microsoft.VisualC.Stlclr.Dll は .net fx 3.5 の一部ではない」はずなんだが
343 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 13:47:59 ] >>341 >.net fx 2.0 で作ってた既存アプリに STL/CLR を使って修正すると、アプリの実行に >3.5 が必要になるのは嫌じゃね? >前のCTPの頃はライブラリだけ持って行けばよかったんだが コンパイルし直すんだろ? どうせmsvcp90.dllとか増えてるんじゃないの? VC++のランタイムライブラリに同梱ってのが幸せになる道かねぇ。 まあ3.5のサイズにもよるな。
344 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 14:43:50 ] >343 客先に説明するのが面倒なんだよね。でも、STL/CLR は使いたい できれば、CTP同様に VS2005 + ヘッダ + Microsoft.VisualC.Stlclr.Dll で STL/CLR を 使った開発ができる方がうれしい。SP2 で来ないものかな
345 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 17:14:22 ] std::vector<int> v; : for each(int i in v) {} for eachでbegin(), end()が呼ばれているようですが ECMA-372にはこの振る舞いの記述が見あたりません。 MSの独自拡張なのでしょうか?
346 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:28:26 ] >345 これでも行けますね int vec[] = { 1, 2, 3, 4, 5 }; for each ( int num in vec ) { std::cout << num <<std::endl; } 配列アクセスが可能なものは Array のラップを掛けて渡されているのでは ないでしょうか。Array は IEnumerable ですし
347 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:34:44 ] >346 ごめん。これはできて当たり前だわ array<int>^ vec = { 1, 2, 3, 4, 5 }; と同等だもんな
348 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 07:12:42 ] >>346 Cタイプ配列とarray<T>は同等じゃないから346は通らないのでは?
349 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 07:20:17 ] std::vectorに対するfor each inはネイティブでコンパイルしても使えてるな。 /Zeで拡張構文を抑制するとeachが構文エラーになった。 // cl /EHsc hoge.cpp #include <iostream> #include <vector> int main() { std::vector<int> v; v.push_back(1); v.push_back(5); for each (int i in v) std::cout << i << std::endl; return 0; }
350 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 18:16:58 ] >348 Cタイプ配列は C++/CLI では array<Type> でラップされるよ。だから、346 は動く >347 がそれを言ってる ヘッダ見たけど、特に ecma-372 で必要とされている IEnumerable の定義も 見あたらないから、CLR・・・で定義されている所に、拡張構文で潜んでるっぽい
351 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 18:24:10 ] VS2008 Beta2 試してみた。コンパイル対象となる .net fx が選べるようになったんだが 2.0, 3.0 を選んだとき、STLCLR.dll は使えなかった STL/CLR を使いたかったら、3.5 を普及させろと言うことらしい ( ゚д゚) Feedback マンドクサ _(__つ/ ̄ ̄ ̄/_ \/ /  ̄ ̄ ̄ ( ゚д゚ ) _(__つ/ ̄ ̄ ̄/_ \/ /  ̄ ̄ ̄
352 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 19:47:41 ] >>350 C#のCタイプ配列はCLR配列だが、C++/CLI のCタイプ配列はCLR配列じゃないぞ。 >>346 を実際にコンパイルしてみろ、C3285でしっかりコンパイルエラーが出る。
353 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 23:12:16 ] VC8 SP1で試したけど/clrの有無に関わらずC3285になるね。 当たり前だけど、boost::arrayはOK。 どうせならレンジに使えればいいのに、 ってそれなんてBOOST_FOREACHなんだけどね。
354 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 14:40:44 ] >352-353 悪禁食らっていたので返答が遅れた ごめん。漏れが試したのは、VS2008 Beta2 だった。こちらは >346 でコンパイルできるし 動く。また、ecma-372 でも、仕様上 346 で正しいから、VC8 で取りこぼしてた仕様が いくつかあったやつを VC9 で準拠したんだと思う /clr の有無に関わらずって、/clr なくて for each が使えるの?
355 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 19:24:33 ] >>354 349でネイティブでも使えるという報告があるよ。
356 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 14:40:51 ] ファイル名をキーとするstd::mapのようなものを作りたく、Generic::Dictionaryのキー型にString^ 比較にStringComparer:::CurrentCultureIgnoreCaseを指定してるのですが 全角アルファベットの大文字・小文字も同一視されてしまいます。 要するにNTFSやFATと同じようなファイル名の比較をしたいのですが、どうすればいいんでしょうか?
357 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 15:16:49 ] つ ネイティブC++
358 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 15:50:00 ] >>356 WindowsのNTFSファイルシステムドライバは"A"と"a"は同じ文字とみなしてるよ?
359 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 16:11:47 ] >>358 あ、ほんとだ。区別されるものと思ってた。
360 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 10:22:34 ] >>356 カーネルの中には比較する関数あるんだけどね・・・ なんでユーザーモードに無いのかは謎 まじめにやると日本語やアルファベット以外の文字(ヨーロッパ圏など)でも 全角半角を問わず大文字小文字を区別しないので 割と面倒だった気がする。
361 名前:デフォルトの名無しさん [2007/08/01(水) 04:25:12 ] Visual Studio 2005 で C++/CLI を使っています。 フォームデザイナの機能で C++/CLI と C# の間に 違いはあるのでしょうか? つまり C# でのフォームデザイナと、C++/CLi での フォームデザイナの間に、利用できるコントロールの 種類などで違いがあるのでしょうか? .NET Framework で用意されている機能なら言語によらず 利用可能だとおもうので差はないと思っているのですが。
362 名前:デフォルトの名無しさん [2007/08/01(水) 04:54:48 ] マネージドなプログラム組むならC++なんか使わねっつの!w
363 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 08:38:47 ] >マネージドなプログラム これってメリットある? いや、一般論じゃなくて実際のところ。
364 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 09:07:42 ] プラットフォームにVistaが使えるじゃねーか。
365 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 09:14:12 ] いや、Vi$taにあうのはネイティブアプリ。
366 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:44:46 ] >>363 自分専用ツールにはクラスライブラリが充実しているので便利。
367 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 12:01:52 ] >>366 それにしては、Win32で出来るものが出来なかったり、中途半端。 だったらVCLみたくネイティブクラスライブラリ充実させろよ。
368 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 12:05:21 ] >クラスライブラリが充実しているので これって、ネイティブ版クラスライブラリを作成すれば完璧だおね。 M$のドトネト囲い込み戦略に嵌められてるだけじゃないの? ドトネトは終焉したわけだし、無視した方が良いよ。
369 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 12:37:37 ] ドトネト君っていろんなスレにいるな。 飽きないの?
370 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 13:00:03 ] >プラットフォームにVista つ ttp://gigazine.net/index.php?/news/comments/20070801_will_not_move_to_vista/ 企業ユーザーの大多数はVistaへの移行を考えていない
371 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 16:47:45 ] そりゃ、CreateFile系のAPI自体がバグでロックしちゃうんだもの。 企業ユーザが使おうとするわけがない。 >> VISTA
372 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:10:29 ] >CreateFile系のAPI自体がバグでロックしちゃうんだもの。 kwsk
373 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:12:17 ] これか ttp://d.hatena.ne.jp/NyaRuRu/20070731/p2
374 名前:デフォルトの名無しさん [2007/08/01(水) 22:23:38 ] Form.hに実装を書かせられるの嫌なんだけど、どうにかならない? てか、なんでForm.hに実装させるような仕組みにしたんだろう?
375 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 23:02:47 ] Form.cppに実装を移せば?
376 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 23:59:06 ] 実装を書かせるといっても、イベント用に開発環境が自動生成したものですよね。 これをcppにということになると、たとえば、フォームデザインの変更を ちょこちょこやる場合、Formのデザイナとヘッダとcppを行ったり来たりでは やっぱり大変だよね。
377 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 00:59:04 ] ぶっちゃけVC++8の.NETサポートは「諦めろ」としか言えないよ・・・
378 名前:デフォルトの名無しさん [2007/08/02(木) 04:03:15 ] VC++9 では何か変わってるの?
379 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 09:44:37 ] そりゃ変わってますよw
380 名前:デフォルトの名無しさん [2007/08/02(木) 18:35:26 ] VC2008先行して使っている人、 デサイナが生成するコードに何か大きな変化は有りましたか?
381 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:36:34 ] 試してみたけど変わってないみたいだね。残念だ…
382 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:27:36 ] C++/CLI に関してはろくに対応されていないね。STL/CLR なんか作ってる場合じゃないと 思うんだが。結局、ネイティブ・アプリの ClickOnce 対応もしていないし
383 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:53:42 ] いや、STL/CLRは「ろくな対応」なんじゃないか?
384 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:11:20 ] ネイティブの STL にマネージド・オブジェクトが格納できればいらない対応でしょ むしろ、2種類のライブラリに混乱しかねない
385 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:41:52 ] マネージドなSTLはそれになりに便利だと思う。 標準C++ & boost萌えな俺には、C++/CLIやC#はきついんだが…
386 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 08:17:10 ] >>384 確かに。少なくともクラス定義だけでも、 ネイティブクラスと値クラスに違いがなければいける。 前にも書いた気がするけど、ハンドル用のアロケータ書いてみたが、 ネイティブクラスはハンドルを持てないのでだめだった。
387 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 08:27:31 ] C++0x の concept map が C++/CLI に実装されたら、それつかって managed class を STL コンテナにいれられるのでは...
388 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 10:16:37 ] だとしたら、ほんとに STL/CLR は C++0x が確定するまでの繋ぎでしかなくなるな
389 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:18:52 ] いや、一応STL/CLRは一度覚えればC#でも使えるんだろ?
390 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:21:41 ] STL/CLR は C++/CLI せんよーだってさ テンプレートで実装してるしね
391 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:22:36 ] じゃあ、意味ねーなw
392 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:33:20 ] なんかグダグダ
393 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 16:46:48 ] でもまだSTL/CLRのコンテナは、System::CollectionsやSystem::Collections::Genericの インタフェースを実装しているのが強みと言えるかもしれない。
394 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 16:51:41 ] STLがあればGenerics要らんやん。
395 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 17:49:38 ] C# にも展開してくれれば良かったんだけどなぁ
396 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:58:40 ] まぁどっちかっつーと.NET言語の態勢を保ちつつ コンパイル時のコード生成であるC++テンプレートをサポートするってのが 端から無茶やってるとは思うけどねぇ。
397 名前:デフォルトの名無しさん [2007/08/04(土) 13:00:12 ] C++/CLIでは stringstream に相当するものは用意されているのでしょうか?
398 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:03:09 ] .NETのクラスライブラリにはMemoryStreamが似ている存在。 でもstringstreamだって使いたければ使えばいいし。
399 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 15:31:51 ] StringBuilder や StringReader, StringWriter を使ってもいいな
400 名前:デフォルトの名無しさん [2007/08/04(土) 23:23:24 ] C++/CLIでも派生させるクラスのデストラクタはvirtualにすべき? 勝手になる?
401 名前:397 [2007/08/04(土) 23:41:29 ] 長さの単位がString,StringBuilderはInt32でStreamはInt64くさいけど System::IO::Streamとしても使いたかったんで MemoryStreamから派生することにした。 順序つきで使える operator >> は面倒だからやめた・・・。 generic <typename T> MyStringStream% operator << (T x) { cli::array<unsigned char>^ buffer = System::Text::Encoding::Unicode->GetBytes(x->ToString()); this->Write(buffer,0,buffer->Length); return *this; }
402 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 00:21:56 ] >>400 ポインタを使った場合だと、virtual 付けないとダメね ハンドル型だと、virtualなしでもいける
403 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 00:23:24 ] >>402 へえ、boost::shared_ptrみたいだな
404 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 00:26:44 ] 「リソース管理できてデストラクタに罠がない賢い手段」 目指してるものが同じだからな。
405 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 00:54:52 ] >>402 トンクス!
406 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 01:28:41 ] ハンドル型っていまいち概念がわからん。 マネージドヒープにある実体を指すポインタなんだろうか?
407 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 01:35:03 ] ガベコレの都合から考えたほうが早いかも
408 名前:デフォルトの名無しさん [2007/08/05(日) 02:07:15 ] ref class だと デストラクタってDisposeじゃなかった? だからvirtualにならないとつじつまが合わない気が・・・
409 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 05:28:45 ] >>408 ref classのデストラクタはDispose()ナマじゃなからvirtualかどうかは意味がない。 デストラクタを宣言すると暗黙でDispose(bool)とDispose()とFinalize()が定義されて、 デストラクタはDispose(bool)から間接的に呼ばれるので、 結果、継承ツリーの下位のほうから順にデストラクタが呼ばれる形になる。
410 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 08:36:27 ] >>406 ようするにそういうこと。ただしポインタ演算禁止で、演算子多重定義が使える。 ポインタ演算がやりたければinterior_ptr<>。
411 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 13:26:15 ] >>406 > マネージドヒープにある実体を指すポインタ が含まれてます。ハンドルには。 そのポインタ(あるいはID)を直接操作するのは危険なので、 (たとえばGCで、場所を移動されるかも知れないので) ハンドルを介して、その対象を操作するのです。 用語としては、車を運転する時に、直接タイヤを動かすのではなくて、 ハンドルを回して、タイヤを動かすあのハンドルと同じです。 CでFILE型がファイルハンドルと呼ばれるのと同じ。
412 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 17:38:01 ] >>410 ,411 thx 引数にint^で受け取ると勝手にSystem::Int32^になってるんだな。 int main(){ int x=10; plusA(x);//値は変わらない plusB(x);//値が変わる } void plusA(int^ x){ ((int)x)++; //int型へのキャストが必要 } void plusB(int% x){ x++; //いまいち理解できない } ところでConsole::WriteLineっていうのがあったと思うけど、 どうなったのでしょうか?VS2005のどこにも出力されないんですけど。
413 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:48:52 ] >>412 %は参照&のマネージド版。 ハンドルは、一応ポインタになぞらえられることを示すとするとこんな感じ。 値型をボックス化したハンドル絡みではこういうことになる。 void plusA(int^ x) { (*x)++; } int x = 10; int ^h = x; plusA(h); std::cout << x << ' ' << *h << '\n';
414 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 00:13:39 ] void plusA(int^ x) { (*x)++; } int ^x=10; plusA(x); //書き換わる plusA(*x); //そのまま ようするに参照ということかな?VBのByrefみたいな。 std::coutもprintfもWriteLineもどこにも出力されないんだが、 どうやって出力結果を見てるの?
415 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 00:48:01 ] >>414 Console::ReadLine();などででプログラム止めてる? plusA(*x); って、*xがplusA関数に渡されるときに、 *xのコピーオブジェクトが作成され、そのハンドルがplusA関数の仮引数に 格納されるから、値が変わらないってことでいいのかな? そうそう、 (10).Equals(11); みたいに定数もオブジェクトとして扱われるんだね。
416 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 01:21:27 ] >>414 コンソールプログラムのプロジェクトにしている? そうしないと、cout, printf, WriteLineの出力先は現れないよ。 コンソールプログラムのプロジェクトでなかったのなら、 プロジェクトのプロパティのリンカのシステムか何かのとこにサブシステムの設定があるから、 その中のコンソールを選べばいい。 msdn2.microsoft.com/ja-jp/library/fcc1zstk (VS.80).aspx >>415 plusA(*x);でコピーが作成されるのはそのとおり。ボクシングとは、 結局マネージドヒープに新しくオブジェクトを作って、そこへコピーすること。 値型のハンドルを引数に受け渡しすること自体はVBのByRefや Cのポインタ渡しそっくりでいいんだが、ボクシングという 暗黙のオブジェクトのコピーが働くから話が少々厄介になっている。
417 名前:デフォルトの名無しさん [2007/08/06(月) 21:48:15 ] boostみたいにprivateもシリアライズできる 非侵入型のシリアライズはないのでしょうか?
418 名前:デフォルトの名無しさん [2007/08/07(火) 19:32:08 ] 最初2003のManaged C++で作ってたんだが 都合により2005のC++/CLIに移ることにした。 プロジェクトを変換してコンパイルエラーを片付け、 いったんは動くようになったんだが しばらくしてリビルドしようとすると リンクエラーLNK2020「メタデータの操作に失敗しました」 が発生する。 今環境がないんで詳しいエラー内容は書けないんだが 「プロパティの数が違う」みたいなことを言われていた。 LNK2020にはいろいろ種類があるらしく、 「重複する型に、適合しないフィールド宣言があります」なら リビルドすればいいらしいんだが、リビルドしてみても直らなかった。 プロジェクトを新規作成してファイルを全部入れても同じエラー。 ググっても英語のページすら出てこなかった。 誰か対処方法知ってたらplz
419 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 19:38:50 ] 最低限のコードを入れてリビルドして、どうなる?
420 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 19:42:36 ] >>419 stdafx.h stdafx.cpp main.cpp resource.h だけの状態?
421 名前:デフォルトの名無しさん [2007/08/07(火) 20:48:11 ] すまんLNK2022だった