- 1 名前:デフォルトの名無しさん [2005/09/11(日) 23:54:01 ]
- おそらく、.NET開発でデファクトスタンダードに最も近い
であろうC++/CLIについて語ろうぜ!
- 762 名前:710 mailto:sage [2006/03/01(水) 21:11:31 ]
- 今晩も盛り下がっていますね皆さん( ノ゚Д゚)こんばんわ
>>744間接参照の仕方を巧く解説してるサイトってない? >>745newでは困憊羅君が、言うこと聞いてくれませんでした >>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
すげーワラタ
- 784 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 00:03:43 ]
- STL.Netが待ちきれなくて、System::Collections::Generic::ListのラッパをVectorという名で作ってみようとしたが、難しい。
クラスライブラリ化して他言語からも使えるようにとか考え出したら駄目だこりゃ。
- 785 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 05:40:23 ]
- CLIだとメンバにref object(ref ptrは可)
おけないからSTL.NETは ptr_contenaみたいになるよね?
- 786 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 09:42:38 ]
- 何処で聞こうかと迷いましたがここでお願いします
.NET Framework クラス ライブラリで メール送信するSystem.Net.Mailというクラスがあるのですが 受信するクラスはどれですか?
- 787 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 13:39:45 ]
- Socket で imap か pop のポートに繋げてプロトコルながしゃいいんでない?
- 788 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 13:44:22 ]
- 追加
ttp://mobiquitous.com/programming/apop-imap.html ま、ライブラリとかもぐぐりゃ出てくるんだが
- 789 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 19:41:13 ]
- void func(const std::string & s); ってのは書けるけど
void func(const String ^ s); ってなふうにはかけないのね。
- 790 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 20:51:19 ]
- ハンドルは追跡ポインタだから const したら追跡できないだろ
- 791 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 21:02:23 ]
- >>790 ポイント先のオブジェクトを変更したくないよ
ってのを明示したかった。const な String へのハンドル、 って書きたかったんだ。
- 792 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 21:07:25 ]
- 意味はわかるが、const の意味を拡張しない限りできんだろ
const や volatile は GCヒープには使えないと思わないとな
- 793 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 21:14:03 ]
- う〜む、渡された側で不用意に変更して
しまわないようにしたかったんだけどな。 マネージドなオブジェクトに対しては無理なのか。
- 794 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 21:19:51 ]
- 普通にconst指定出来たが、何をもって書けないと言っているんだ?
- 795 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 21:31:41 ]
- >>794
「const System::String ^ この型での const/volatile 修飾子はサポートされていません」 って、コンパイラが優しくおこってくれた。
- 796 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 21:46:00 ]
- コンソールアプリで確認したけど、エラーなんて出なかったが。
#include "stdafx.h" using namespace System; void func(const String^ s) { Console::WriteLine((String^)s); } int main(array<System::String ^> ^args) { func(L"Hello World"); return 0; }
- 797 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 21:58:02 ]
- >>796 いいなぁ。
うちのコンパイラは出るんだ。 なんかスイッチの関係かな。 もうちょっと調べてみるよ。
- 798 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 22:02:33 ]
- それ、コンパイル警告C4400で、警告レベルは4。
どうやら漏れが警告レベルを一番高くしてるから表示されてるみたいだ。
- 799 名前:MSDN Libraryによると mailto:sage [2006/03/04(土) 22:04:20 ]
- const (C++) 修飾子および volatile (C++) 修飾子は、
共通言語ランタイムの型の変数では使用できません。 次の例では C4400 エラーが生成されます。 // C4400.cpp // compile with: /clr /W4 // C4401 expected using namespace System; #pragma warning (disable : 4101) int main() { const String^ str; // C4400 volatile String^ str2; // C4400 }
- 800 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 22:04:21 ]
- いいなぁって、駄目だろ。const 指定できちゃ(w
String^ hello = "Hello, World"; func(hello); だとエラーだったりして
- 801 名前:デフォルトの名無しさん mailto:sage [2006/03/04(土) 22:15:41 ]
- .NETの共通として通用しないだけで、
C++/CLI上では値を変更しようとするとエラーになるし、 特に問題はないと思うけど。 ちなみに>>800のも通った。
- 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#でもなんでもやめたほうがいいな。
|

|