- 1 名前:デフォルトの名無しさん [2005/09/11(日) 23:54:01 ]
- おそらく、.NET開発でデファクトスタンダードに最も近い
であろうC++/CLIについて語ろうぜ!
- 802 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 23:24:16 ]
- >>800
これが通るんだからそれが通らないわけが無いだろ。 void func(const std::string& s); std::string hello = "Hello, World"; func(hello);
- 803 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 23:31:02 ]
- まぁそれ以前にあれだ、System::StringはImmutableなオブジェクトだ。
どっちにしろ変更できん…わけでもないけど裏技
- 804 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 13:02:40 ]
- private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
pin_ptr<const wchar_t> text = PtrToStringChars(textBox1->Text); //16進数に変換 wchar_t* pEnd; unsigned long hoge = std::wcstoul(text, &pEnd, 16); //入力されたデータの判定(省略) wchar_t* foo; foo=NULL; //unsigned long 型の整数を文字列に変換 _ultow_s (hoge,foo,32,16); String ^tmp=Convert::ToString(*foo); textBox2->Text=tmp; } ボタンを押したらtextBox1に、入力した文字を16進数に変換し、データの判定を行い 再び文字変数に変換し、textBox2に表示させるという、プログラムです、 foo=NULL;を入れないと、: warning C4700: 初期化されていないローカル変数 'foo' が使用されますと、警告され foo=NULL;としたらエラーは出ないのですが いづれの場合でも、実行すると Debug Assertion Failed! Expression:buf!=NULL とお叱りを受けます、どうしたらよいでしょうか? オナガイシマス。
- 805 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 16:21:54 ]
- 漏れには foo に割り当てられているはずの 16 wchar_t が見えないんだがどこにあるんだ?
MSDN で _ultow_s が領域確保してくれるのかどうかぐらい確かめろ pin_ptr<Char> text = textBox1->Text->ToCharArray(); wchar_t* pEnd = 0; unsigned long hoge = std::wcstoul(text, &pEnd, 16); wchar_t foo[16]; memset(foo, 0, 16*sizeof(wchar_t)); _ultow_s (hoge,foo,32,16); String ^tmp = gcnew String(foo); textBox2->Text = tmp; MSDN を読んで出直してこい
- 806 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 17:22:58 ]
- >>805ありがとう
出直す前に、スマソ unsigned longって32bitですよね、多分そのせいだと思うけど 9桁以上入力すると、結果がオーバーフローしちゃってffffffffに なっちゃいます、予期せぬ結果です wchar_tが16ビットのせいだと思うのですが、こんなときはどうしたら いいのでしょうか、教えて君で申し訳ないですが御教授お願いします。
- 807 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 17:30:43 ]
- >>806
(VC++の)unsigned longは32ビットで0〜0xffffffffの数値を格納できる。 だから十六進法で8桁までだ。wchar_tに非は無い。 たとえばunsigned long longなら64ビットあるから十六進法で倍の16桁までいける。
- 808 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 17:44:29 ]
- >>806ありがとう
unsigned long ↓ unsigned long longにしてみたら : warning C4244: '引数' : 'unsigned __int64' から 'unsigned long' への変換です。データが失われる可能性があります。 警告が出てしまい、実行するとやはり9桁でオーバーフローしてしまいました 手のほどこし方はもう無さそうですね、(´・ω・`)
- 809 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 17:44:57 ]
- UInt32::Parseじゃいかんの?
- 810 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 18:16:11 ]
- >>808
32ビットしか返さない関数使ってるんだから当たり前だな
- 811 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 18:18:02 ]
- >808
だから、自分の使っている関数の方とかをチェックしてこいといってるだろうに 受け取り側を unsigned long long にしても、変換関数が対応していなけりゃ駄目だろ おまいさんは文字列を 64 ビット長の整数値に変換したいんだから、それに対応した 変換関数を探してこい >809 がいいヒントをくれているじゃないか .net framework で 64ビット長符号なし整数値の型を探してそのメソッドを調べろよ
- 812 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 19:01:42 ]
- >>811どうもありがとう
>>806です ttp://msdn2.microsoft.com/ja-jp/library/system.convert.touint64.aspx Convert.ToUInt64 (Int32) これでいいのかな?
- 813 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 19:09:18 ]
- ・・・おまいさん、文字列を UInt64 に変換したいんだろう?
だったら使うべき変換関数は Convert.ToUInt64(String^) じゃないのかい これなら、いちいち配列変換しなくてもいいわけだし UInt64::Parse(String^) だってあるだろうに もちろん、UInt64.ToString() とすれば、文字列への変換もできるぞ C++/CLI は (3.14).ToString() ってやって文字列を取得することだってできるんだから
- 814 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 20:42:17 ]
- std::wcstoul を愛しているんだろうから、そっとしておいてやれよ
- 815 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 21:01:33 ]
- (´ε`;)ウーン…
unsigned 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 ^' に変換できません。 使用可能なユーザー定義された変換演算子がない、または 演算型のボックス化された形式からターゲット型への標準変換は存在しません なんですよね、全くなにやってんだか・・・・
- 816 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 21:11:47 ]
- >>815
Convert::ToUInt64は文字列をUInt64(unsigned long long)に変換するほうだ。
- 817 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 21:14:03 ]
- がー! だから、型と関数を考えて、ちゃんとメソッドを構成する英語を嫁と
UInt64 hoge = 0LL; if ( UInt64::TryParse(textBox->Text) ) hoge = UInt64::Parse(textBox1->Text); String^ tmp = hoge.ToString(); でいいんだって なんでわざわざ wchar_t の配列に変換するのかな ちゃんと、キーワードでぐぐるかMSDN見てる?
- 818 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 21:25:28 ]
- 文字列を数値にするのには次のものがある。
Cの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を使うかで違いが出てくる。
- 819 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 21:28:41 ]
- というか、unsigned long long int って型はまだ標準じゃないよな
- 820 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 21:31:17 ]
- >>819
C++にはまだないが、C++/CLIには存在する。 signe.japan.webmatrixhosting.net/ecma372/12_type.aspx
- 821 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 21:44:23 ]
- >820
それは知ってるが、標準関数が対応してないってこと ってそこ直リンすんなよ
- 822 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 21:46:10 ]
- >>821
だからC/C++のunsigned long longが関係するところは全て非標準だな。
- 823 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 21:49:23 ]
- そだな。非標準の型は全部 CLI 型表記にした方がわかりやすいと思うんだが
変に今までと一緒なもんだから、間違えやすいんじゃないかな
- 824 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 22:01:51 ]
- それよりも混乱する原因はC、C++、.Net Frameworkのクラス・関数が入り乱れているからのほうが大きいと思う。
答えているほうだって、あれ使え、いやこれ使えって具合だし。 そもそも一旦十六進法の文字列へ変換するまではともかく、その後文字列へ変換する必要性がわからない。 そのままtextBox2->Text = textBox1->Text;でいいと思うのだが。 大文字小文字を揃えたいだけならtextBox1->Text->ToUpper()で十分だし。
- 825 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 22:01:55 ]
- >>817さん
どうもです >>なんでわざわざ 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 個の引数を伴うオーバーロードされた関数はありません。 こうなるのですが・・・
- 826 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 22:04:35 ]
- >>825
MSDN見ろ。 TryParseは2つ目に結果を格納する引数がある。
- 827 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 22:26:47 ]
- >>826さんどうもです
private: 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 セクションで設定しなければなりません。 アプリケーションはまた、デバッグを有効にしてコンパイルされなければ なりません。
- 828 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 22:28:57 ]
- >825
勘違いしたんじゃ、ないぞ。MSDNを見るようわざと間違えたんだからな 決して、名前だけで bool 値を返すんだろとか考えて適当に書いた訳じゃ、ないんだからな
- 829 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 22:30:52 ]
- >>827
MSDN見ろ。1つめの引数の文字列の書式が書いてある。UInt64::Parseは十進法しか受け付けない。 Convert::ToUInt64なら基数が指定できるけど、Try版がないから例外を受けるしかないと思う。
- 830 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 22:30:54 ]
- スマソ
Try外していました しかし、TryParseの問題を解決しても 例外エラーは出そうな感じがするんだが
- 831 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 22:39:02 ]
- >827
だから、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( ... ) { } } まぁ、例外処理は除いたが、いったん数値にして、別のテキスト・ボックッスに文字列として 代入するならこんな感じだろ
- 832 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 22:40:02 ]
- あ、
if ( !String::IsNullOrEmpty() ) →if ( !String::IsNullOrEmpty(textBox1->Text) ) だったorz
- 833 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 23:06:15 ]
- そもそも、目的はbutton1を押すとtextBox1に入力した
16進数の入力判定を行い、(条件として、空でないこと、16進数16桁であること) button2を押したら、openFileDialogを呼び出しファイルを選択してOKを押したら textBox2に選択したファイルを読み込ませ(ここは既に実装できています) 最後にbutton3を押したらtextBox1とtextBox2を結合し、saveFileDialogで 名前を付けて保存するという、単純なものなのですが16進数変換と入力判定の所で どつぼにはまってしまいました。 文字入力 ↓ 16進数変換&入力チェック ↓ 外部ファイル読み込み ↓ 16進数+外部ファイル結合 ↓ 名前を付けて保存
- 834 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 23:24:16 ]
- とりあえず判定は829のように例外が投げられるかどうか調べるしかないと思う。
- 835 名前:デフォルトの名無しさん mailto:sage [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進数に変換されています ヮ(゚д゚)ォ!
- 836 名前:デフォルトの名無しさん mailto:sage [2006/03/06(月) 00:28:58 ]
- 16進で出力すればいいじゃん。
何言ってんだ?
- 837 名前:デフォルトの名無しさん mailto:sage [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で条件判定するのも、なんだかなぁー
- 838 名前:デフォルトの名無しさん mailto:sage [2006/03/06(月) 01:19:03 ]
- 学生さん?
- 839 名前:デフォルトの名無しさん mailto:sage [2006/03/06(月) 04:30:32 ]
- >>837
textBox2->Text = Convert::ToUInt64(textBox1->Text, 16).ToString("x"); ちゅうかうざい。
- 840 名前:デフォルトの名無しさん mailto:sage [2006/03/06(月) 07:57:43 ]
- ToString が書式指定できることを知らんと言うのもありがちで、MSDNを見れば・・・
だが、Express の配布で C++/CLI を使う初心者がこんな感じに騒いだらこの先恐ろしいな
- 841 名前:デフォルトの名無しさん mailto:sage [2006/03/06(月) 08:43:29 ]
- L"..."を
template引数で使うと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
- 842 名前:デフォルトの名無しさん mailto:sage [2006/03/06(月) 11:11:27 ]
- 仕様にそう書いてあった
template では const char* や const wchar_t* が渡されたら、char や wchar_t の配列として 扱い、ジェネリック関数は型引数で const char* や const wchar_t* が渡された場合には String として型推論するというルールだって call_template(gcnew String("123")); とやると、String としてちゃんと帰ってきた
- 843 名前:デフォルトの名無しさん [2006/03/06(月) 13:16:33 ]
- MFCはどうなるんでつか?
STL.CLIみたく、MFC.CLIが出るんでつか?
- 844 名前:デフォルトの名無しさん mailto:sage [2006/03/06(月) 13:20:15 ]
- つ CWinFormsControl
- 845 名前:デフォルトの名無しさん [2006/03/06(月) 13:27:29 ]
- Microsoft .NET Framework の Windows フォームを使用したペインティング テクニック
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 で何か変更になったのでしょうか?
- 846 名前:デフォルトの名無しさん mailto:sage [2006/03/06(月) 14:19:42 ]
- 自分のメソッドの宣言で virtual は書いたけど override 指定していない方に つI
- 847 名前:デフォルトの名無しさん mailto:sage [2006/03/06(月) 14:49:30 ]
- 汚い文法だなぁ
- 848 名前:デフォルトの名無しさん [2006/03/06(月) 15:17:51 ]
- >>864 OnPaintBackground つーのは、規定クラス
System::Windows::Forms で virtual で宣言 されている「はず」だったんですが・・・ んじゃ、OnPaint とかを乗っ取る事はできないのかなぁ。
- 849 名前:デフォルトの名無しさん mailto:sage [2006/03/06(月) 15:28:57 ]
- fつべvうぇ45wvw34
- 850 名前:デフォルトの名無しさん mailto:sage [2006/03/06(月) 15:57:19 ]
- >848
まぁ、漏れあてなんだろうけど、C++/CLI では暗黙のオーバーライドは禁止されている ちゃんと virtual void OnPaintBackGround(...) override ←これ { ... } と記述してる? これ書いても上書きできていないの?
- 851 名前:デフォルトの名無しさん [2006/03/06(月) 17:32:02 ]
- >>850 忘れてました orz
- 852 名前:デフォルトの名無しさん [2006/03/06(月) 21:01:39 ]
- >>100 本買ってまで勉強する必要はないんじゃない?
- 853 名前:デフォルトの名無しさん mailto:sage [2006/03/07(火) 18:46:38 ]
- private:
void button1_Click( Object^ /*sender*/, System::EventArgs^ /*e*/ ){ hoge = ""; 〜 } private: 内で定義した変数って、よそのプロシージャーでは当然使えませんよね グローバル変数で定義すれば、いいのだろうけど NETで ※どんなアルゴリズムでも、グローバル変数なしで 記述できることが証明されています。 グローバル変数は後述するように、非常に強力な反面、 大きな危険性を秘めています。 とはいえ、絶対に知っておくべき事柄です。 らしい、button1で発生した変数を、button2のイベントが起きたときに 継承させる方法を 、グローバル変数無しで実現できるの?
- 854 名前:デフォルトの名無しさん [2006/03/07(火) 19:41:37 ]
- >>853 まずもってプロシージャってのが C++ にあるか
ってのは置いといて、そのフォームのメンバ変数は button1_Click() からでも button2_Click() からでも アクセスできるじゃん。
- 855 名前:デフォルトの名無しさん mailto:sage [2006/03/07(火) 20:40:47 ]
- そんなことはないやろ、
private: void button1_Click( Object^ /*sender*/, System::EventArgs^ /*e*/ ){ hoge = ""; 〜 } private: void button2_Click( Object^ /*sender*/, System::EventArgs^ /*e*/ ){ textBox2->Text=hoge; 〜 } : error C2065: 'temp' : 定義されていない識別子です。
- 856 名前:デフォルトの名無しさん mailto:sage [2006/03/07(火) 20:57:37 ]
- >>855
それ別の位置でコンパイルエラー出てるだけじゃないか? そのコードの中にtempなんて識別子は出てないのだが
- 857 名前:デフォルトの名無しさん mailto:sage [2006/03/07(火) 21:14:41 ]
- >856
この人が言ってるの、auto 変数のことじゃない? メソッド内部で宣言したローカル変数にアクセスしたがってるんだよ
- 858 名前:デフォルトの名無しさん [2006/03/07(火) 21:20:23 ]
- >>857 そんなもん、VB でもできんわ・・・
プロシージャとかいってるからたぶん VB使いかな?とか思った。
- 859 名前:デフォルトの名無しさん mailto:sage [2006/03/07(火) 21:53:50 ]
- やっぱり、無理やな
- 860 名前:デフォルトの名無しさん [2006/03/07(火) 21:55:54 ]
- >>853 の頭の中には、ローカル変数とグローバル変数しか内のだろうか。
- 861 名前:デフォルトの名無しさん mailto:sage [2006/03/07(火) 21:56:09 ]
- プロシージャが WinProc のことなら、Form 間でのアクセスのことかも
何にしても、そんな状態でC++/CLIに手を出すのはやめた方がいいと思う
- 862 名前:デフォルトの名無しさん mailto:sage [2006/03/07(火) 22:24:46 ]
- そもそもC++/CLIでなくてもC#でもなんでもやめたほうがいいな。
- 863 名前:デフォルトの名無しさん mailto:sage [2006/03/07(火) 22:51:56 ]
- >>862も人生をやめたほうがいいな。
- 864 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 02:13:35 ]
- C++/CLI がこんなにも複雑なのがいけないと思います!
- 865 名前:デフォルトの名無しさん [2006/03/08(水) 02:40:33 ]
- まぁ何でもあり(?)なのが C++/CLI だしなぁ。
複雑さを避けたいなら、C#だよな。 あ、VB.NET って手もあるか。
- 866 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 02:58:40 ]
- >>865
> まぁ何でもあり(?)なのが C++/CLI だしなぁ。 まさにC++から派生した、って感じだな
- 867 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 07:35:51 ]
- 言語仕様を拡張せずに .NET 対応は出来なったのかなぁ。
managed_ptr<Object> obj = managed_new<Object>(); みたいな。
- 868 名前:デフォルトの名無しさん [2006/03/08(水) 07:39:15 ]
- >>867 managed C++ であんまりうまくいかなかったから、
結局言語使用の拡張に踏み切ったんだろ。
- 869 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 08:18:59 ]
- >867
逆に、どこまでが既存の C++ でどこからが CLI 拡張かわかりやすくていいと思うよ mc++ の混乱ぷりから考えるに、MSが出した仕様にしてはさっぱりしすぎて不思議 時代が変わっても、フレームワークをさくっと切り替えるだけで対応できるし、VES も 簡単に交換可能なところが夢があると思われ また、C++ 自体の拡張の邪魔にならないところとかもいい Sun も JNI の仕様をこれにしないかな。そしたら、JVM も使う気になるのに
- 870 名前:デフォルトの名無しさん [2006/03/08(水) 08:24:21 ]
- Java をネイティブ拡張したものがが仮にあったとして、
C++/CLI とどっちを使う??
- 871 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 08:38:56 ]
- その仮とやらの質による。存在しないものと比較しても仕方がない
- 872 名前:デフォルトの名無しさん [2006/03/08(水) 09:48:43 ]
- おい!!!!
だれだよ、俺のプロジェクトで勝手に /clr:pure にした奴は! おかげで全部 __clrcall になっててリンクできずに 一晩悩んだじゃないか! さて、そろそろ帰るか。
- 873 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 19:50:08 ]
- >>870
Javaをネイティブ拡張したもの≒C#
- 874 名前:デフォルトの名無しさん [2006/03/08(水) 20:04:29 ]
- Java = C++--
C# = Java++ = C++--++
- 875 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 21:20:07 ]
- >>873
ネイティブじゃナインじゃん
- 876 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 21:26:46 ]
- String^ arg_1 = abc;
String^ 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 となる様にしてください。 オナガイシマス
- 877 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 21:33:42 ]
- System::Environment::NewLine
- 878 名前:デフォルトの名無しさん [2006/03/08(水) 21:34:09 ]
- textBox1->Text = arg_1 + endl + arg_2;
じゃなくて textBox1->Text = arg_1 + "\n" + arg_2; でいいじゃん。 std::endl はマニピュレータで、、 マネージド型である String に対して + 演算子がオーバーロードされているなんてことはまずない。
- 879 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 21:36:40 ]
- "\r\n"にしないとだめではないか?
- 880 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 21:45:08 ]
- 変だな?
textBox1->Text = arg_1 + "\n" + arg_2; としたら コンパイルも通ったんだけど textBox1に表れた文字が abc・def 全角文字の・に似た記号が出ます(多分全角の・とは違う気がするが、定かではない) 秀丸に貼り付けると abc def と改行されてるんだが、なぜ?
- 881 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 21:47:30 ]
- >>880
サンクスできましたが、解説もオナガイシマス なんで "\n"では駄目で"\r\n"なの?
- 882 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 21:54:42 ]
- Windowsの改行コードは"\r\n"だから。
UNIXとかのコンソールプログラムでは\nで Macは"\r"
- 883 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 21:56:39 ]
- そしてC/C++は\nを使い、テキストモードでの入出力時には環境固有の改行コードと\nとで変換をしている。
- 884 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 21:57:50 ]
- ウィンドウズはそういうもん。
Unix : 円 n Windows : 円 r 円 n 旧 mac : 円 r コンソールアプリは透過的に 円 n ⇔ 円 r 円 n やってくれるが テキストボックスとかはやってくれない。 秀丸じゃなくってノートパッドならやっぱりナカテンが出ると思う。
- 885 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 21:58:49 ]
- みんなでケコーン
OS X は ¥n になったよ ... 関係ないですが。
- 886 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 22:01:40 ]
- >>882->>885
>>881です ご丁寧にありがとうございました、よく理解できました しかし皆さん本当に良く知ってますね
- 887 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 22:01:47 ]
- >>884
どっちかと言うと円記号よりもバックスラッシュ。
- 888 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 22:16:41 ]
- 完璧な回答を出しているのにスルーされてる>>877がカナシス
- 889 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 22:31:06 ]
- >>887さん
ありがとう スマソ、やっぱりC++/CLIならこうですよね (゚д゚)(。_。)(゚д゚)(。_。) ウンウン msdnでよく調べます
- 890 名前:デフォルトの名無しさん mailto:sage [2006/03/09(木) 18:13:54 ]
- String型の変数arg_1を書き込みたいのですが、
下記のコードでコンパイルも通りるのですがアプリケーションのコンポーネントで、 ハンドルされていない例外が発生しました〜後略 別のプロセスで使用されているため、プロセスはファイル'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(); } } }
- 891 名前:デフォルトの名無しさん mailto:sage [2006/03/09(木) 18:29:48 ]
- なんでSaveFileDialog->OpenFileで開いてるのにさらにStreamWriterで開き直す?
すでに開いているストリームに対してStreamWriterを使うのならStream^を渡す。
- 892 名前:デフォルトの名無しさん mailto:sage [2006/03/09(木) 18:50:37 ]
- 最近よう、気のせいか初心者歓迎スレに変わってきてないか?
なんか、聞けばいいと思っている輩が増えてきた気がするんだが
- 893 名前:デフォルトの名無しさん mailto:sage [2006/03/09(木) 18:53:25 ]
- >>891
SaveFileDialog->OpenFileに書き込むには どうしたらいいですか?
- 894 名前:デフォルトの名無しさん mailto:sage [2006/03/09(木) 19:15:18 ]
- System::IO::StreamWriter^ sw = gcnew System::IO::StreamWriter(myStream);
初心者はC#かVBからはじめるのがいいよ。MSDNの見方くらい覚えような。
- 895 名前:デフォルトの名無しさん mailto:sage [2006/03/09(木) 20:52:02 ]
- >>894
ありがd
- 896 名前:デフォルトの名無しさん mailto:sage [2006/03/10(金) 01:26:35 ]
- C++/CLI みたいなマニアな言語を使おうとする奴が
なぜこんなところで教えてくんしてるのか判らん。 (マニア、というのは、それでないと書けないほどのアプリを 書かないといけないはめになっていないと使わないだろう、 ぐらいの意味。) MSDN 読めるぐらいでないと C++/CLI 手を出さないと思うんだが、 どうなってんだろう?
- 897 名前:デフォルトの名無しさん mailto:sage [2006/03/10(金) 03:18:05 ]
- しらんがな。
- 898 名前:デフォルトの名無しさん mailto:sage [2006/03/10(金) 08:44:22 ]
- >>896
少しはC++をやっていて、新しい言語に手を付けずに.Netが使えるぞと思っているんだよ、きっと。 実際はC++とC++/CLIとは別物だということを知らず。
- 899 名前:デフォルトの名無しさん mailto:sage [2006/03/10(金) 09:08:02 ]
- つーか、自然な流れだと思うぞ。
一般的にC++が普及してた。 ライブラリはMFCやらWin32APIやらATLを使ってたであろう。 そして、MSの次期スタンダードなライブラリが、.NETになった。 じゃあ、C++から.NETを使おうか。 こんな感じでしょ。 間違いだとも思わない。
- 900 名前:デフォルトの名無しさん mailto:sage [2006/03/10(金) 09:11:06 ]
- ええっと、言語間の違いよりも、
ライブラリ間の違いのほうが余程大きいと思うんですが...
- 901 名前:デフォルトの名無しさん mailto:sage [2006/03/10(金) 09:18:01 ]
- 一般的に旧VBが普及してた。
PC以外で死滅気味だった言語が台頭。サーバーサイドJavaや組み込みC++。 サーバーサイドや組み込みに足を踏み入れるドトネトとC丼を強制。 ブビ厨氏滅&ドトネト氏産。 オネガイC++からドトネト使ってトンでも言語mc++ → C++/STL.CLI
- 902 名前:デフォルトの名無しさん mailto:sage [2006/03/10(金) 09:22:57 ]
- >>901
日本語でおk
|

|