1 名前:デフォルトの名無しさん [2005/09/11(日) 23:54:01 ] おそらく、.NET開発でデファクトスタンダードに最も近い であろうC++/CLIについて語ろうぜ!
683 名前:デフォルトの名無しさん mailto:sage [2006/02/24(金) 17:24:15 ] >>678 blogs.msdn.com/hiroyask/archive/2006/02/13/530769.aspx ケツの穴が広がるぐらい、ハードに読めや。
684 名前:デフォルトの名無しさん mailto:sage [2006/02/24(金) 21:07:35 ] >>683 良く読んだよ >表の顔の日記 > 裏の顔の日記 > さっさと消えてくんないかな。 うざいんだけど、 まじで。
685 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 04:29:20 ] という電波でも飛んでるのか?
686 名前:648 [2006/02/25(土) 11:39:03 ] また教えてください。 C++での構造体の以下の宣言 typedef struct tagHOGE{ int x; long y[4]; }HOGE; これをマネージ環境にしようとした場合 typedef struct tagHOGE{ int x; long y[4]; ← ここが混合型らしい }HOGE; .\MainForm.cpp(26) : error C4368: 'y' をマネージ 'HOGE' のメンバとして定義できません。混合型はサポートされていません というエラーが出ます。 単に4つのlong型の配列の定義がしたいのですが、マネージ環境では、どのようなやり方があるでしょうか?
687 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 11:43:26 ] typedef struct → typedef value struct では?
688 名前:648 [2006/02/25(土) 12:05:23 ] >>687 そうです。コピペ間違いました。 value struct HOGE{ int x; int y[4]; }; と記述してます。
689 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 12:17:18 ] ・・・value型使わず、ネイティブ型で定義すれば?
690 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 12:20:37 ] あとは ref にして array<long>^ y で宣言して、コンストラクタで初期化するか
691 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 12:23:04 ] value struct HOGE { int x; array<long>^ y; }; はコンパイルが通るが、仕様上これでいいのか?
692 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 12:38:17 ] ok ハンドルは nullptr で初期化される
693 名前:648 [2006/02/25(土) 12:58:50 ] 皆さん、早速のレス、ありがとうございます。 >>689 ネイティブで定義すればできることは確認してます。 ただそうすると少し複雑なソフトを組んだ場合、きちんとメモリの後処理をしないと メモリリークが発生するので、マネージにすればメモリガベージの効用であまり複雑に 考えなくともよいかな、と思っているのです。 >>691 そのやり方もわかります。 各関数で、 void func1(void) { HOGE wk1; wk2.y[2] = 123; } void func2(void) { HOGE wk2; wk2.y[2] = 456; } というようなことをしたいのです。 2〜3日あがいてみて自分ではできなそうだったら、ネイティブで定義してやっていきます。 マネージ環境に慣れていけば、そのうち、何か気づきがあると信じて進むしかありません。
694 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 13:05:44 ] 2〜3日あがくなら2〜3日かけてマニュアル読んだほうがいいような気がする
695 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 13:45:46 ] >>693 値型にGCを求める必要がある?
696 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 14:23:50 ] C++/CLIのスレ見てると無意味にvalueを使いたがる人が多い気がするな。 valueは動作に癖があるから基本refで作ったほうがいいと思う。
697 名前:デフォルトの名無しさん [2006/02/25(土) 16:22:08 ] value使ったほうが処理速度が速いとでも思い込んでいるんじゃ? クセがあるには同意。
698 名前:648 [2006/02/25(土) 17:38:04 ] いろいろとサイトをまわりまして、以下のようにしたところ動いているように見えます。 public ref struct HOGE { int x; array<long>^ y; HOGE() { y = gcnew array<long>(4); } }; void func(void) { HOGE^ abc = gcnew HOGE; abc->x = 10; abc->y[2] = 20; for(int i=0; i<4; i++){ Debug::WriteLine(abc->y[i]); } } 検討違いのコードでなければよいですが。 みなさん、いろいろとレスありがとう。
699 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 20:55:45 ] >>698 これでも平気。 void func() { HOGE abc; abc.x = 10; abc.y[2] = 20; for (int i = 0; i < 4; i++) { Debug::WriteLine(abc->y[i]); } }
700 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 22:33:45 ] C++は真のローカル変数を使える言語なんだから、(ユーザー定義オブジェクト がスタック上に配置できる)GCが必要な場合ってのはそんなに多くはならない ってビョーン先生が言ってた。
701 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 23:11:17 ] >>700 それはわかるけれど、C++/CLIはCLIの世界にあわせないといけないからさ。
702 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 23:42:48 ] C++/CLIは二つの言語が同居しているようなものだからな。 C++の拡張というより建て増し。
703 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 23:49:05 ] >699 それだと、配列のサイズが3で固定されちゃわない?
704 名前:デフォルトの名無しさん mailto:sage [2006/02/26(日) 00:22:20 ] >>702 二世帯住宅
705 名前:デフォルトの名無しさん [2006/02/26(日) 00:49:18 ] ビョーン先生が取り扱っている案件はそうかもしれんけどな。 動的にオブジェクトが増えたり減ったりする案件のほうが多い。
706 名前:デフォルトの名無しさん mailto:sage [2006/02/26(日) 00:56:47 ] >>700 しかしビョーン先生はGCをそんなに否定していない。 既存のC/C++のコードと互換性を保ったまま導入できるのなら、 C++に入れてもいいというようなことをD&Eで書いている。
707 名前:デフォルトの名無しさん mailto:sage [2006/02/26(日) 20:57:17 ] >>705 vector使えばええやん。メンバかローカルにしておけばdeleteいらん。
708 名前:デフォルトの名無しさん mailto:sage [2006/02/26(日) 21:08:56 ] >>707 グローバルでもdeleteいらんぞ
709 名前:デフォルトの名無しさん mailto:sage [2006/02/26(日) 21:14:38 ] 別に GC なんて C++/CLI の利点じゃないだろ 単に .net framework を既存の C++ と混同することなく使えるってとこが一番重要さ C++/Smalltalk とか C++/Squeak とか出てこないかな
710 名前:デフォルトの名無しさん [2006/02/27(月) 01:56:21 ] 【初心者歓迎】C/C++室 Ver.25【環境依存OK】から誘導されてきました( `・ω・´)ノヨロシクー VC8でopenFileDialogを使いたくて MSDNのソースを試してみようと ttp://msdn2.microsoft.com/ja-jp/library/system.windows.forms.openfiledialog.aspx 説明を読み フォームに Button を配置して using namespace System;を宣言して、 下記のコードを試したのですがエラーが出ます、何か読み込んでいないファイルがあるか設定のミスだと思うのですが、原因が分かりませんよろしくお願いします。 private: voidbutton1_Click(Object^/*sender*/,System::EventArgs^/*e*/) { Stream^myStream; OpenFileDialog^openFileDialog1=gcnewOpenFileDialog; openFileDialog1->InitialDirectory="c:\\"; openFileDialog1->Filter="txtfiles(*.txt)|*.txt|Allfiles(*.*)|*.*"; openFileDialog1->FilterIndex=2; openFileDialog1->RestoreDirectory=true; if(openFileDialog1->ShowDialog()==::DialogResult::OK) { if((myStream=openFileDialog1->OpenFile())!=nullptr) { //Insertcodetoreadthestreamhere. myStream->Close(); } } } error C3083: 'DialogResult': '::' の左側のシンボルには、型を指定しなければなりません error C2039: 'OK' : '`global namespace'' のメンバではありません。 error C2065: 'OK' : 定義されていない識別子です。
711 名前:デフォルトの名無しさん mailto:sage [2006/02/27(月) 07:06:19 ] >>710 System::Windows::Forms::DialogResult::OK とフルで書く。
712 名前:デフォルトの名無しさん mailto:sage [2006/02/27(月) 07:26:28 ] >>711 最後まで仕様が揺れた所かも知れないね。
713 名前:デフォルトの名無しさん mailto:sage [2006/02/27(月) 10:47:00 ] この状況って System::Windows::Forms まで using で指定しているから、単純にグローバル スコープ指定していることが問題なんじゃね? 12行目の ::DialogResult を意味なく、:: で始めるな、と
714 名前:デフォルトの名無しさん mailto:sage [2006/02/27(月) 11:06:47 ] >>713 ところがどっこい DialogResult::OK と書くと今度は System::Windows::Forms::Form::DialogResultが無いというエラーになる。 using namespace は探しに行ってくれないらしい。
715 名前:デフォルトの名無しさん mailto:sage [2006/02/27(月) 11:38:26 ] ん、サンプルだと :: で始めてるな っていうか、>710 って名前空間 System しか宣言してないって言ってるが using namespace System::Windows::Forms が宣言されている環境では ::DialogResult::OK でエラーなくコンパイルできるな 先頭 :: の名前検索ルールって、グローバル指定じゃないんだ・・・
716 名前:デフォルトの名無しさん mailto:sage [2006/02/27(月) 13:38:23 ] >>714 using namespace System::Windows::Forms; してあるということ? その"Form"は何よ? >>715 namespace N { int x; }; using namespace N; int x; int f(void) { return x; } ←このxはambiguousになる。それで正しい。
717 名前:715 mailto:sage [2006/02/27(月) 13:45:08 ] まず、 >710 の問題は、単に System::Windows::Forms が using 指定していないから using namespace System::Windows::Form; を付ければおっけー >716 ::DialogResult ってなっているから、先頭に :: を付ける場合ってグローバル名前空間の 名前空間指定だと思ってた。カレント解決してくれるんだ
718 名前:716 mailto:sage [2006/02/27(月) 13:55:54 ] >>717 いや、「正しい」はグローバル参照の方。 > using namespace System::Windows::Form; > を付ければおっけー Forms
719 名前:715 mailto:sage [2006/02/27(月) 18:46:14 ] ということは、MSの実装はバグかMS独自仕様か、微妙なとこだな
720 名前:710 [2006/02/27(月) 19:46:54 ] 皆さんどうもありがとう、遅くなってすみません 今帰宅しました ヘッダー部分ですが #pragma once #include <fstream> #include <vcclr.h> #include <stdlib.h> namespace hoge { using namespace System; using namespace System::IO; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace std; と宣言しているのですが 皆さんの、ご指導通りやってみましたが、 error C3083: 'DialogResult': '::' の左側のシンボルには、型を指定しなければなりません error C2039: 'OK' : '`global namespace'' のメンバではありません。 error C2065: 'OK' : 定義されていない識別子です。 .\hoge(8) : error C2337: 'STAThreadAttribute' : 属性が見つかりません。 とこんな感じで、 ワケ 川・∀・川 ワカメです
721 名前:デフォルトの名無しさん mailto:sage [2006/02/27(月) 20:17:53 ] >>720 その一 using namespace ... using namespace ... namespace hoge { と順番を変えたら ::DialogResult::OK でコンパイルが通る。 その二 hoge::DialogResult::OK でコンパイルが通る。 恐らく下のも通るはず。 [hoge::STAThreadAttribute] その三 namespace hoge { を使わずすべてGlobalに書く これが仕様なのかバグなのかは俺にもわかんね〜
722 名前:デフォルトの名無しさん mailto:sage [2006/02/27(月) 20:17:53 ] 気になって少々試してみたが、関数内でusingすればDialogResult::OKと書いてもエラーにならなかった。 void button1_Click(System::Object^ sender, System::EventArgs^ e) { using ::System::Windows::Forms::DialogResult; OpenFileDialog ofd; ofd.InitialDirectory = "c:\\"; ofd.Filter = "txtfiles(*.txt)|*.txt|Allfiles(*.*)|*.*"; ofd.FilterIndex = 2; ofd.RestoreDirectory = true; if (ofd.ShowDialog() == DialogResult::OK)
723 名前:デフォルトの名無しさん mailto:sage [2006/02/27(月) 20:39:09 ] ほとんど素のC++の話題になってるけど、まあいいか。 なんでDialogResultが重なってんだろ? using ::System::Windows::Forms::DialogResult; if (ofd.ShowDialog() == OK) か using ::System::Windows::Forms; if (ofd.ShowDialog() == DialogResult::OK) ならわかるけど。
724 名前:デフォルトの名無しさん mailto:sage [2006/02/27(月) 20:45:59 ] >>723 C++/CLIの列挙子は列挙型の中のスコープにある。
725 名前:デフォルトの名無しさん mailto:sage [2006/02/27(月) 23:10:50 ] >>721 *.h でこれをやると using が include 先に伝播してしまうので思わぬ名前の重複が起きてしまう。 >using namespace ... >using namespace ... >namespace hoge { 妥協案としては、メンバー関数の実態を *.c に分離してから::DialogResult::OKと指定する。 using namespace hoge; namespace hoge { void hoge::button1_Click(System::Object^ sender, System::EventArgs^ e) { if (ofd.ShowDialog() == ::DialogResult::OK)
726 名前:デフォルトの名無しさん mailto:sage [2006/02/28(火) 00:29:25 ] ISO C++だとusingディレクティブは名前を可視にするだけで、 usingディレクティブが書かれた名前空間へ名前を持ってくるものではなかったはず。 namespace foo {int x;} namespace bar {int y;} using namespace foo; using bar::y; ::x = 10; //NG. x = 0;或いはfoo::x = 0;としなければならない。 ::y = 20; //OK. もちろんy = 0;或いはfoo::y = 0;も問題ない。
727 名前:デフォルトの名無しさん mailto:sage [2006/02/28(火) 00:59:11 ] namespace N { namespace M { enum E { zero = 0 }; }; }; using namespace N; int f(void) { return M::zero; } あるいは、 namespace N { namespace M { enum E { zero = 0 }; }; }; using namespace N::M; int f(void) { return zero; } なんじゃないのか? // Eのenum名指定なしでanonymous enumにしても同じ。
728 名前:デフォルトの名無しさん mailto:sage [2006/02/28(火) 01:38:12 ] >>727 CLRタイプのenum class と Cタイプのenumの2種類あって、 後者の話ならそのとおり。
729 名前:710 mailto:sage [2006/02/28(火) 21:38:39 ] 皆さんのおかげで、openFileDialogを動かす事ができたのですが 肝心な事を忘れていました、ファイルを選択してボタンを押しても 実際にファイルが開かないんですよね(;^ω^) // Insert code to read the stream here. ってコメントアウトしてある部分が気になるけど、ここに何か 書かないといけないのかな?
730 名前:デフォルトの名無しさん mailto:sage [2006/02/28(火) 21:43:05 ] 教えてクンマンセー!
731 名前:デフォルトの名無しさん mailto:sage [2006/02/28(火) 21:53:32 ] コメントが何のために有るのかわかってるのか? っていうか読めよ。
732 名前:710 mailto:sage [2006/02/28(火) 21:54:54 ] >>731 英語読めません(´・ω・`)
733 名前:デフォルトの名無しさん mailto:sage [2006/02/28(火) 21:57:00 ] >>732 んじゃ、英語の勉強から。英語書けないならともかく、読めないんじゃ プログラミングなんてやってられない。
734 名前:デフォルトの名無しさん mailto:sage [2006/02/28(火) 22:35:55 ] 翻訳サイトも使えないようなヤツはプログラミングやめれ
735 名前:デフォルトの名無しさん mailto:sage [2006/02/28(火) 22:40:27 ] ていうか、732は710の偽なんですが
736 名前:732 mailto:sage [2006/03/01(水) 00:45:52 ] 俺は嘘つきだから俺の言うことは嘘ばっかりさ。さてこの嘘はホントかわかるかねwww
737 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 01:08:24 ] そんなおもしろくないよ?
738 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 01:32:16 ] >>733 ひまわりが専門なので関係ないでしょ
739 名前:710 mailto:sage [2006/03/01(水) 02:21:51 ] ゚・*:.。..。.:*・゜ヽ( ´∀`)人(´∀` )ノ・゜゚・*:.。..。.:* できたYO! 英語のサイトで(・∀・)イイ!!ヒント見つけて 多少漏れのセンスでアレンジしましたがなにか つーかさー"StreamReader c++ textBox"で具具っても C#のサンプルや話題が多くて、参考にならなかったんで 英語でぐぐったら キタキタキタキタ━━━(゚∀゚≡(゚∀゚≡゚∀゚)≡゚∀゚)━━━━!! やっぱり本場はいいサンプルが多いな、でもそのものズバリはなかったが { // Insert code to read the stream here. System::IO::StreamReader ^ sr = gcnew System::IO::StreamReader(openFileDialog1->FileName); String ^temp = sr->ReadToEnd(); textBox2->Text=temp; //MessageBox::Show(sr->ReadToEnd()); sr->Close(); myStream->Close(); }
740 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 02:32:10 ] C++/CLI の場合でも .NET Framework のサンプルがほしければ C#やVBのをそのまま使えるってのに
741 名前:710 mailto:sage [2006/03/01(水) 02:37:58 ] |∀・).。oO(・・・) そうなのか?
742 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 02:38:23 ] ガンガレ
743 名前:710 mailto:sage [2006/03/01(水) 02:43:27 ] ムリッポ
744 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 07:19:26 ] >>740 うむ。 ちょっと間接参照の記述が違うくらいで、 流れは C# のコードのままでいいな。 まぁそれが C++/CLI の真骨頂でもある。
745 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 14:15:46 ] >>739 C++/CLIなんだからいちいちgcnewする必要はないと思う。
746 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 14:50:01 ] >>739 つかCloseもfinally句に書いてないし。 C#ならusing、C++/CLIならスタックオブジェクトにしろよなほんと。
747 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 16:30:41 ] で、STLはどうしてるんだ、おまえら?
748 名前:デフォルトの名無しさん [2006/03/01(水) 16:49:26 ] C++/CLI でGUIなアプリつくるべ、と、フォームをデザインして 遊んでます。で、みなさん、アプリで必要となる大量の 変数たちは、class Form1 のメンバとしてずらずら宣言してしまって 構わないんでしょうか? 今までは UNIX 系でのコンソールアプリ主体で、自前の アプリケーションクラスを用意して main() の中から そいつをインスタンス化して、という感じでやってました。 Windows でのグラフィカルなアプリでの作法では、 自動生成された class Form1 にどんどんメンバを 追加しちゃっていいんですか? 当然イベントハンドラなどはデザイナで追加されていくわけで、 手動で追加したメンバのためにフォームデザイナが混乱して しまわないかすごく不安です。
749 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 16:54:58 ] STLが無い、C++なんて。 クソ。
750 名前:デフォルトの名無しさん [2006/03/01(水) 16:57:44 ] >>749 え?C++/CLI で STL つかえないの?
751 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 17:06:05 ] >>750 ネイティブ型に対しては使える。 そしてマネージ型対応のSTL/CLI(旧称STL.Net)がVC++ 2005と同時に公開されるはずだったのだが、 伸びに伸びて未だ公開されていない。 www.microsoft.com/japan/msdn/vs05/visualc/stl-netprimer.asp いっそのこと俺たちで作るかw。
752 名前:デフォルトの名無しさん [2006/03/01(水) 17:18:06 ] >>751 あ〜びっくりした。 そうだよな、ネイティブ型に対しては使えるよな? C++ で書きためてきた std::vector 使ってる 数値計算用のライブラリがあって、どうしても それから逃れられない + DirectX で可視化したい、 という要求があって、それ満たすには C++/CLI しか ないだろ、ってことでこれから使おうと思ってたんで、 ちょっと焦った。
753 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 18:24:32 ] >>752 いやいやいや、お前DirectXをなんと心得る?
754 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 19:09:05 ] >>753 まだ、OpenGL のかわりみたいなもん、 くらいの認識です。頂点データの扱いとか ぜんぜんちがうんですかね? その話題はスレ違いですが。 目的は動き回る多数の分子模型の ようなものなんですが。
755 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 19:16:26 ] DirectXはまだネイティブがメインなのにどうしてSTLの無いC++/CLIを無理に使おうとするのか
756 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 19:28:40 ] com::ptr 型がそこにあるから
757 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 19:29:40 ] OpenGLでもいいし。
758 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 19:40:32 ] >>755 いや、それすらまだ知らないんですよ。 普通に次元の可視化するときに、 フォームにぺたぺたとやってえらく簡単に できたもんで、この勢いで 3D もいける? とか思ったわけです。 >>757 いわれていれば、そうかも
759 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 20:01:27 ] >>758 そのノリでやりたいんなら(ビジネスっていうかグラフ化とかな)、 確かにマネージのAvalonが向いてる。けどもまだない。残念。 DirectXとOpenGLは例えばDirectXはCOMだったりとか細かくは違う。 けど理論はあんまり違わんので好きなほうでどうぞ。 一般的には凝ったことしなければOpenGLのほうが簡単。
760 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 20:11:40 ] スレ違いなんだが、VTKとかいろいろあるじゃん? > フォームにぺたぺたとやってえらく簡単に > できたもんで、この勢いで 3D もいける? そんな子どもっぽい理由じゃなくて、(発端じゃなくて直線的な選択の事ね) 道具くらいちゃんと自分で選べるようになろうよ。 sal.linet.gr.jp/E/1/index.shtml でも漁れ。多くがWindowsもOK。 OpenGLやDirectXを直接叩くなんて馬鹿らしいよ。
761 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 20:27:15 ] >>760 THX 論文に貼る図だと、動画じゃないので普通に gnuplot で作ってるんですが、プレゼンだと やっぱ動かなきゃな、ってことで取り組んでます。 色々あるんですね、こりゃ楽しそうだ。
762 名前:710 mailto:sage [2006/03/01(水) 21:11:31 ] 今晩も盛り下がっていますね皆さん( ノ゚Д゚)こんばんわ >>744 間接参照の仕方を巧く解説してるサイトってない? >>745 newでは困憊羅君が、言うこと聞いてくれませんでした >>746 スタックオブジェクトって、なに?グラフや絵を描くメソッドのことかな?と聞いてみる 夕べ ttp://www.athomejp.com/goldfish/vcs/openfiledialogreader.asp ここのソースをC++に書き換えたらどんな風になるのかな? C#の.の使い方がポイントだと思うが、もう少し理解できない 多分>>744 の言っていた、間接参照の仕方の事だと思うのだが C++の場合漏れは、::が出てきたら 何々の何々と読んでいるのだが、C#の.の読み方(解釈)教えてください //ファイルを指定させる DialogResultresult=openFileDialog1.ShowDialog(); if(result==DialogResult.OK) { //指定されたファイルを読み取る System.IO.Streamstream=openFileDialog1.OpenFile(); System.IO.StreamReaderstreamR= newSystem.IO.StreamReader(stream, System.Text.Encoding.Default); stringstr=streamR.ReadLine(); //ファイルを読み取り while(str!=null) { //デバッグ出力 Debug.WriteLine(str); str=streamR.ReadLine(); } //StreamReaderをクローズ streamR.Close(); }
763 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 21:42:20 ] >>762 C#の . はC++(/CLI)だと、 . -> ::のどれか。 . 値(ポインタ・ハンドルでないもの)と参照(ネイティブのT&とマネージドのT%) -> ポインタ・ハンドル :: 静的メンバやその他(クラス内で親クラスを参照するときなど) なるべく同じようにC++/CLIへ写すとこうなる。 //ファイルを指定させる DialogResult result = openFileDialog1.ShowDialog(); if (result == DialogResult::OK) { // 指定されたファイルを読み取る System::IO::Stream^ stream = openFileDialog1.OpenFile(); System::IO::StreamReader^ streamR = gcnew System::IO::StreamReader(stream, System::Text::Encoding::Default); System::String^ str = streamR->ReadLine(); // ファイルを読み取り while (str != nullptr) { // デバッグ出力 Debug.WriteLine(str); str = streamR->ReadLine(); } streamR->Close(); } (続く)
764 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 21:43:14 ] これをスローカル変数を使うようにして、 個人的にReadLineが2度もソース上に現れるのが気になったのでそれを修正したもの。 //ファイルを指定させる DialogResult result = openFileDialog1.ShowDialog(); if (result == DialogResult::OK) { // 指定されたファイルを読み取る System::IO::Stream^ stream = openFileDialog1.OpenFile(); System::IO::StreamReader streamR(stream, System::Text::Encoding::Default); System::String^ str; // ファイルを読み取り do { str = streamR.ReadLine(); // デバッグ出力 Debug.WriteLine(str); } while (str != nullptr); }
765 名前:デフォルトの名無しさん [2006/03/01(水) 21:48:12 ] >>764 Debug.WriteLine に nullptr 渡すのってありだっけ。 }
766 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 22:15:08 ] >>765 どうみてもまずいですね。 本当にありがとうございました。 そう書こうと思ったけど、その前に試してみた。 System::Diagnostics::Debug::WriteLine(static_cast<String^>(nullptr)); 全く問題なかった。 ついでに言うとそれ::にするの忘れてた。すまん。 結局こうすればよかったな。 while (System::String^ str = streamR->ReadLine()) { // デバッグ出力 System::Diagnostics::Debug::WriteLine(str); }
767 名前:748 mailto:sage [2006/03/02(木) 04:01:28 ] 盛り上がってるところ済みません。 どなたか >>748 に答えてくださるかた おられませんでしょうか・・・
768 名前:デフォルトの名無しさん mailto:sage [2006/03/02(木) 05:10:09 ] >>763 解説Thanks ☆☆** v( ̄ー ̄)v**☆☆ Thanks
769 名前:デフォルトの名無しさん mailto:sage [2006/03/02(木) 06:39:27 ] >>762 スタックオブジェクト=auto変数
770 名前:デフォルトの名無しさん [2006/03/02(木) 07:16:31 ] C++/CLIで char *ptr; ptr=(char *)malloc(sizeof(hoge)); free(ptr); が使えるのに感動した!
771 名前:デフォルトの名無しさん mailto:sage [2006/03/02(木) 07:41:26 ] >>767 シングルウィンドウのアプリケーションならそれでいいと思う。
772 名前:デフォルトの名無しさん mailto:sage [2006/03/02(木) 09:47:47 ] 質問させてください。 System::Collections::Generic::ListかSystem::Collections::ArrayListで 要素へのinterior_ptrを得る方法はないでしょうか。 ToArray()はコピーを返すのでだめでした。
773 名前:デフォルトの名無しさん mailto:sage [2006/03/02(木) 19:35:49 ] >>772 ArrayList や List では無理、固定サイズの配列ならいける。 array<int>^ x = { 10, 20, 30, 40, 50 }; interior_ptr<int> r = &(x[3]);
774 名前:デフォルトの名無しさん mailto:sage [2006/03/02(木) 23:43:37 ] VS2003のC++で書いた int __pin* px = &pX -> x; こういう、書き方はVC8では通らないようですね?
775 名前:デフォルトの名無しさん mailto:sage [2006/03/02(木) 23:50:15 ] >>774 cli::pin_ptr<int> px = &pX->x;
776 名前:デフォルトの名無しさん mailto:sage [2006/03/03(金) 08:25:28 ] >774 /clr:oldSyntax
777 名前:デフォルトの名無しさん [2006/03/03(金) 20:40:09 ] おっすオラ悟空 C++/CLI コンソールアプリの main では コマンドライン引数として String^ の array への ^ が 渡されるんだけど、今まで使ってたコマンドライン処理 ルーチンに int argc, char** argv って感じの おなじみのアンマネージドな形式で渡したい。 簡単な方法無い?????
778 名前:デフォルトの名無しさん mailto:sage [2006/03/03(金) 20:49:34 ] >777 普通に int main(int argc, char**argv) で宣言すれば? C++/CLI は CLI 拡張であって、旧来の機能がなくなった訳じゃない
779 名前:デフォルトの名無しさん [2006/03/03(金) 20:53:27 ] おっす、オラ悟空 >>778 うまくいったぞ これで boost::program_options がつかえそうだぞ ところで boost のライブラリのうち /clr でビルドに しっぱいするのは graph, test, wave みたいだぞ。 ほとんどは *.hpp だからビルド不要だけど.
780 名前:デフォルトの名無しさん mailto:sage [2006/03/03(金) 20:54:45 ] おっすオラ悟空 もしかして C++/CLI ってすげぇ戦闘能力じゃねぇか? スカウターが壊れちまったぜ
781 名前:デフォルトの名無しさん mailto:sage [2006/03/03(金) 20:59:36 ] ゴクウがスカウターつけんなよ
782 名前:デフォルトの名無しさん mailto:sage [2006/03/03(金) 21:01:41 ] じゃ、お前にやる
783 名前:デフォルトの名無しさん mailto:sage [2006/03/03(金) 22:11:59 ] >>781 すげーワラタ