[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/09 17:12 / Filesize : 240 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【.NET】 C++/CLI について語ろうぜ 【最適】



1 名前:デフォルトの名無しさん [2005/09/11(日) 23:54:01 ]
おそらく、.NET開発でデファクトスタンダードに最も近い
であろうC++/CLIについて語ろうぜ!

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間接参照の仕方を巧く解説してるサイトってない?
>>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進で出力すればいいじゃん。
何言ってんだ?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<240KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef