【.NET】 C++/CLI について語ろうぜ 【最適】at TECH
【.NET】 C++/CLI について語ろうぜ 【最適】 - 暇つぶし2ch577:デフォルトの名無しさん
06/02/10 22:20:02
>>575
つIL (ilasm)
まぁぶっちゃけいらないっていうかあってもまずやっちゃいけないしな


578:575
06/02/10 23:53:50
>>576,577
どうも

Reflectorでみてみたら
staticコンストラクタで代用しているのはありました。

こんな感じで試してみようかな...
URLリンク(www.gdncom.jp)

579:575
06/02/11 01:08:41
やってみたけどよくわからんかった。でも
templateの部分特殊化でCLI型が使えるみたいだから、それでcreateすればいいか.

template <typename T> ref struct Type{ T create(); };
template <typename T> ref struct Type<T^>{ T^ create(); };


580:デフォルトの名無しさん
06/02/11 07:51:31
C++ で boost の shared_ptr とか boost::program_options とか
使いまくりんぐのプログラム作ってきたんだけど、
C++/CLI でそのコード流用できるんですかね?
stl::map とか使いまくりんぐノプログラムは
そのままで動くのか、STL.NET みたいなモノをつかうように
移植しなけりゃならないのか、System::Collections を
使うのが C++/CLI 流なのか・・・・・・

何でも出来るから何使えばいいか迷う。

581:デフォルトの名無しさん
06/02/11 09:40:08
C++/CLIは便利だと思うが、棲み分けに失敗した感じがするな。
C#で統合するはずが、C++/CLIで統合されるとは…。
本当は.NET対応はC#だけでよかったんだと思う。

582:デフォルトの名無しさん
06/02/11 10:25:45
>>580
managedなobjectをどう扱いたいかによるだろ?

例えば数値計算してその結果を3Dグラフ表示するような場合、
数値計算の部分は普通にC++使えばいいけど、(例えばboostなど)
画面表示の部分はどうしてもCLIに頼らないといけない。

C++/CLIは基本的にC++の上位互換と考えていいから。
"spaced keyword"なんていうのは非互換だけどね。


583:デフォルトの名無しさん
06/02/11 10:29:11
おまえら、どのエディション使ってるの?

584:デフォルトの名無しさん
06/02/11 10:35:44
>>582 うむ、いっていることは分かる。
まさに数値計算して可視化、ってのは仕事で必要。
しかも膨大な数値計算用のライブラリ(自作+他作)がすでにある。

今一番の問題は、コマンドラインをパーすするために便利な
boost::program_options を C++/CLI コンソールアプリでも
使いたいってことかな(笑

585:デフォルトの名無しさん
06/02/11 11:10:32
C++/CLIは、CLIに頼らなければいけない時だけ、
managedなコードを書かなければいけないC++だろ?

embedded C++みたいに言語の機能抜かれているわけじゃないから。

ライブラリであるSTL .NETは、C#やHaskelからも使えるSTLライブラリとして、
C++特有のところは抜かれているけれど。(特殊化関連など)

586:デフォルトの名無しさん
06/02/11 11:11:09
>>585
> managedなコードを書かなければいけないC++だろ?

managedなコードも書ける、とも言えるし。

587:デフォルトの名無しさん
06/02/11 11:15:34
>>585 ふむ、いわれてみればそうだな。
俺があまりにも boost 依存なコードを書きすぎていただけだと思う。

588:デフォルトの名無しさん
06/02/11 15:56:27
>>581
いろんな言語が使用できるっていうのが.NETのうたい文句のひとつだったから
C#だけって言うのはいただけない

589:デフォルトの名無しさん
06/02/11 16:22:28
馬鹿はスルーしる

590:デフォルトの名無しさん
06/02/11 16:26:50
.NETって実際複数言語で開発してたりすんの?

591:デフォルトの名無しさん
06/02/11 16:48:36
>>590 俺はドトネトは C# しか使ってないけど、
俺が使ってるアセンブリが C++/CLI や VB.NET
で作られているかどうかは知らない。

592:デフォルトの名無しさん
06/02/11 16:53:16
VC++はVC++で作られていますという件はもはや過去のもの?

593:デフォルトの名無しさん
06/02/11 17:26:02
「ドトネト」って言う呼び方はアンチっぽいからやめてくれ

594:デフォルトの名無しさん
06/02/11 17:31:18
エロビデオのネバスペみたいなもんか。

595:デフォルトの名無しさん
06/02/11 17:39:26
Win32APIなどのネイティブ呼び出しをC++/CLIでラップしてあとはC#で開発してる。
windows.h の関数や定数の定義をそのまま使える上にInteropで呼び出しも高速なので
P/Invokeよりぜんぜんいいよ。

ドトネトよりポチネットのほうが可愛い

596:デフォルトの名無しさん
06/02/11 18:07:08
>>595
狂おしいほどに同意
アセンブリの中にネイティブコードを突っ込めるから
逆コンパイルにも対抗できるし。


597:デフォルトの名無しさん
06/02/11 20:57:49
そんなことしたら64bitでそのまま動かないじゃん

598:デフォルトの名無しさん
06/02/12 03:52:02
>>597
32bitで何か問題でも?


599:デフォルトの名無しさん
06/02/12 16:51:41
C++/CLIがNativeとManagedの混合アプリを作るのに優秀なのは理解できるが、
/clr:safe なアプリをあえてC++/CLIで作ることに意味があるのだろうか。

600:デフォルトの名無しさん
06/02/12 17:37:42
>>599
特になし。C++/CLIはC++使い慣れてる(C++ライブラリを膨大に抱えてる)人を
.NETに繋ぎとめておくためのもの。

601:デフォルトの名無しさん
06/02/12 21:00:01
2003のWin32APIやMFCを2005ExpressEditionで使おうと
頑張ってみたが無理だった。
Win32APIはコンパイル通るけど警告出るし、
MFCに関しては全くお手上げ。


602:デフォルトの名無しさん
06/02/12 22:31:04
>>601
WinAPIは2003から持ってこなくても最新のPlatform SDKを入れればいいだろうに。

603:デフォルトの名無しさん
06/02/12 23:14:27
C++/CLIはVB.NETで作ったクラスライブラリを呼び出すことも可能?

604:デフォルトの名無しさん
06/02/12 23:33:15


605:デフォルトの名無しさん
06/02/12 23:51:30
>>602
最新のSDK持ってきたら、警告なくなったよ。ありがと。

606:デフォルトの名無しさん
06/02/13 08:02:58
managed C++ みたいに C++/CLI もやっぱやーめたなんてことにはならんだろうな?
前者はなんか標準化団体には出されてたんだっけ?後者はだされてたよな?

607:デフォルトの名無しさん
06/02/13 08:05:18
>>605
感謝は言葉ではなく物で示せ。

608:デフォルトの名無しさん
06/02/13 12:44:28
>606
今、ISO で標準化の審査中

609:デフォルトの名無しさん
06/02/13 13:03:53
>>608 それは C++/CLI だよね?
もう Managed C++ はいらんでそ。

610:デフォルトの名無しさん
06/02/13 14:01:33
(1)for each( int obj in v)
(2)for each( int^ itr in v)
(3)for each( int% r in v)

for each する場合、どれがお勧め?

611:デフォルトの名無しさん
06/02/13 15:26:41
>>609
URLリンク(www.ecma-international.org)
これがISOに提出された。まあISOになる可能性はないと思うけれど。

612:デフォルトの名無しさん
06/02/13 16:55:39
>>611 あれ?ないの?

613:デフォルトの名無しさん
06/02/13 17:22:33
CLI 自体はすでに ISO 標準になってるんだよな。
Java VM も ISO 標準にすればいいのに。
Java 言語とは切り離して。

614:デフォルトの名無しさん
06/02/13 18:06:42
で、ISO 標準て何の役に立つの?

615:デフォルトの名無しさん
06/02/13 18:07:31
ネームバリュー

616:デフォルトの名無しさん
06/02/13 18:10:32
実質を無視したネームバリューなら、
Java >>>>>>(壁)>>>>>> C丼(I$O)
だね。

617:デフォルトの名無しさん
06/02/13 18:13:08
>>616 実質的なネームバリューだと思うけど。

618:デフォルトの名無しさん
06/02/13 21:22:11
>>616
Java のネームバリューってかなり実質的なものだと思うぞ。


619:デフォルトの名無しさん
06/02/13 23:26:25
>>613
EMCAの時に、J2EEも同時に採用されることにこだわった。
当時は、IBMその他ベンダーが独自ビジネス向けフレームワークの覇権を争っていた。

Javaはまだまだ言語規格の変化が激しいから、10年前なら見送りも妥当だったと思う。
今は、C++みたいにろくにない実装も規格を作るのに抵抗がなくなってきている。
だからJavaも今からISOの提出してもいいと思うけれど、
EMCAのWin系規格みたいに放置されると困るよね。

C#やCLIもそんなことにならないかと心配。

620:デフォルトの名無しさん
06/02/14 04:09:12
>>618
確かにJavaはネームバリューだけだな

621:デフォルトの名無しさん
06/02/14 09:09:07
ドトネッツは実質NO.1










(ベーパーウェア部門)

622:デフォルトの名無しさん
06/02/14 13:57:47
>610
vの中身を書き換えたいときは、必然的に(3)
(1)と(2)でコンパイル結果に差が出るかは知らんが、同じなら(2)の方が他の参照型などと統一性が採れると思う

623:デフォルトの名無しさん
06/02/14 22:40:58
int^ だとボックス化のコストが高くない?

624:610
06/02/15 09:08:44
>>622,623
値型の場合、(1)が無難な気がしてきた。(2)はテンポラリGCポインタなのか...(3)はなんか怪しい...
参照型の場合、(2)しか選択もうない気が、第4の選択肢は危険ぽいし...


ref struct Test{
Test(){}int x;Test(int in_x) :x(in_x){}
static void test(){
System::Collections::Generic::List<int> v;v.Add(1);v.Add(2);v.Add(3); //case1
//cli::array<int>^ v = {1,2,3}; //case2
#define SHOW for each(int i in v){Console::WriteLine(i);}
for each(int i in v){i *= 2;}SHOW;//result->{1,2,3}
for each(int^ p in v){(*p) *= 2;}SHOW;//result->{1,2,3}
//for each(int^% p in v){(*p) *= 2;}SHOW;//danger
for each(int% r in v){r *= 2;}SHOW; //case1->{1,2,3},case2->{2,4,6} -> unsafe code
}
static void test2(){
System::Collections::Generic::List<Test^> v;v.Add(%Test(1));v.Add(%Test(2));v.Add(%Test(3));
//cli::array<Test^>^ v ={ %Test(1),%Test(2),%Test(3) };
#define SHOW2 for each(Test^ t in v){Console::WriteLine(t->x);}
for each(Test^ p in v){(*p).x *= 2;}SHOW2;//result->{2,4,6}
for each(Test^% r in v){(*r).x *= 2;}SHOW2;//result->{4,8,12},case2->{2,4,6} -> unsafe code
}
};

625:デフォルトの名無しさん
06/02/15 12:54:23
>624
何を悩んでいるのかよくわからん
列挙する型に合わせれば良いんじゃないか?
適材適所だろ

626:デフォルトの名無しさん
06/02/15 16:25:30
^うざ

627:デフォルトの名無しさん
06/02/15 19:45:53
よーく見ると、顔に見えてくる。

628:デフォルトの名無しさん
06/02/18 14:49:04
VS 2005 C++だす
× String str = "Hello";
○ String ^str = "Hello";
いちち^付けないといけないみたいですね、
^ってどういう意味デツカ

629:デフォルトの名無しさん
06/02/18 15:09:39
>>628
C++/CLIに於けるポインタ

630:デフォルトの名無しさん
06/02/18 15:17:47
そっか、それで
*を^に変えろって困憊羅が言ってるの、見たような希ガスル
しかしなぁー、なぜ換える必要があるのかと、悩む事小10分
*アスタリスクはなんか他の用途でつかってるのかなぁ??

631:デフォルトの名無しさん
06/02/18 15:30:01
こう覚えた方が早い
* を使っているのは C++
^ を使っているのは CLI 拡張

632:デフォルトの名無しさん
06/02/18 15:44:42
>>630
*のポインタ型同士はポインタ演算があるから演算子多重定義ができない。
^の追跡ハンドルならそのようなことがないから演算子多重定義ができる。

633:628
06/02/18 16:29:22
>>631
>>632サンクスです
GUIが使えるWin32でアプリケーションを作りたくて、NETや本を読んで
今学習しているところなんです、Visual Studio 2005 C++の
Win32コンソールアプリケーションを開いてボタンを押したら、
テキストボックスにメッセージを表示させたりとかして
動かしているのですけど訳も分からずに、CLIを使っていたんですね(;^ω^)
VS2005C++な環境でネイテイブなC++でコンソールアプリケーションは
作れないのでしょうか?MFCも挑戦しようと思いましたが、又別物のようですし
初心者的にはどの方向で進んだら良いでしょう、小一週間悶々としています

634:628
06/02/18 16:32:13
スマソ
× GUIが使えるWin32でアプリケーションを作りたくて
○ GUIで動作するWindowsアプリケーションを作りたくて

635:デフォルトの名無しさん
06/02/18 16:45:58
初心者ならC#へ行ってみてはどうかと惑わしてみる。
VS2005C++使った事無いけど、アンマネージド(ネイティブ)は作れるはずだ。

636:デフォルトの名無しさん
06/02/18 16:55:38
2005は普通に「Win32コンソールアプリケーション」でネイティブを作れるはずだが…
Expressだと違うのか?

637:デフォルトの名無しさん
06/02/18 17:01:58
>628
GUI でモノを作りたければ、素直に MFC に進んだ方がいいと思われ
C++/CLI はちと初心者にはお勧めできない。普通の方法では満足できなくなった玄人向け
だから
あとは、635 の進めるとおり、C# でモノを作ってみて満足できなくなったら、またこちらに
出戻ってくると言うのもいい

638:デフォルトの名無しさん
06/02/18 17:15:12
>>633
コンソールアプリケーションとテキストボックスのつながりがわからん

639:デフォルトの名無しさん
06/02/18 17:36:48
すんません、又間違えていました
CLRからWindowsフォームアプリケーション作成でした

640:デフォルトの名無しさん
06/02/18 21:12:37
他スレから誘導されてきました。

C++/CLIを使っているんですが、
自分のクラスライブラリのシングルトンのクラスにあるSystem::Drawing::Size型のプロパティを変更しようとしたら
p->Size = System::Drawing::Size(64, 64);
と設定はできるのですが、
p->Size.Width = 64;
のように個別に設定しようとしたら必ず0になってしまいます。

どうすれば個別に設定できるようになりますか。

641:640
06/02/18 21:26:55
投稿して気付いたのですが、Sizeの部分をハンドルにしたら設定出来るようになりました。
何故かがわからないですが・・・。

スレ汚しすいませんでした。

642:デフォルトの名無しさん
06/02/18 21:48:34
>>641
System.Drawing.Sizeは型値だから扱いが面倒だのう。

643:デフォルトの名無しさん
06/02/19 06:34:22
>>633
スレ違い
スレリンク(tech板)

644:デフォルトの名無しさん
06/02/19 14:36:44
>>641
というかそれはあまりよろしくない。たぶん。

p->Size = Size(64, p->Sizte.Width);

としなさい(こういうCLRの常識みたいなのもいるから
また複雑なんだよな>C++/CLI)。


645:644
06/02/19 14:43:34
にゃー、コード間違いすぎ

p->Size = Size(64, p->Size.Height);

こう。

646:デフォルトの名無しさん
06/02/19 15:20:04
そんなんわからん奴はC#やJavaも微妙だろ。

647:デフォルトの名無しさん
06/02/19 15:28:54
>>646
…まぁな。実体の追跡もできないレベルだし。
C#はまだ動かないだけで安全だけど、こういうやつには特にC++は使わせたくない。
メモリ関係のバグ大量コードを書く。しかもそういう場合デバッグビルドだと動いたり
することもあるから性質が悪い…。

648:デフォルトの名無しさん
06/02/19 20:48:42
Visual C++ 2005 Express Edition の環境で、はまってしまい、皆さんのお知恵を拝借したいです。

Webのダウンロードなのですが、
方法1
  WebClient^ wc = gcnew WebClient();
  Stream^ st = wc->OpenRead("URLリンク(www.yahoo.co.jp)");
  Encoding^ enc = Encoding::GetEncoding("euc-jp");
  StreamReader^ sr = gcnew StreamReader(st, enc);
  String^ out = sr->ReadToEnd();
  Debug::WriteLine(out);
これはうまくいきWebデータの取得ができます。

方法2
WebClient^ wc = gcnew WebClient();
Byte ^ myDataBuffer = wc->DownloadData("URLリンク(www.google.co.jp)");
Encoding^ enc = Encoding::GetEncoding("euc-jp");
String^ out = enc->GetString(data);
このコードだとコンパイルエラーです。
エラーメッセージは、
.\MainForm.cpp(50) : error C2440: '初期化中' : 'cli::array<Type,dimension> ^' から 'System::Byte ^' に変換できません。
    with
    [
      Type=unsigned char,
      dimension=1
    ]
    この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。

とあります。
バイト配列に入れたいだけなのに。

649:デフォルトの名無しさん
06/02/19 21:05:11
>>648
WebClient::DownloadData()の戻り値の型はcli::array<unsigned char>^。
Encoding::GetString()の引数もcli::array<unsigned char>^。

650:デフォルトの名無しさん
06/02/19 21:12:35
^ ←なんかコレうざい。よくわからないけど腹立たしい。


651:デフォルトの名無しさん
06/02/19 21:18:36
(^^:

652:デフォルトの名無しさん
06/02/19 21:20:18
^<T>^

653:648
06/02/19 21:44:16
>>649
Byte を cli::array<Byte> にしたところ、できました。

cli::array<Byte> ^ myDataBuffer = wc->DownloadData("URLリンク(www.yahoo.co.jp)");
Encoding^ enc = Encoding::GetEncoding("euc-jp");
String^ out = enc->GetString(myDataBuffer);

ばっちりです。これで先に進めます。

つい最近まで C++ Builder 使いだったので、いろいろと戸惑ってます。
ポインタは使えず、^ というものが必要だとわかるまで、延べ1日くらいかかってます。
勉強がてら少しずつ移植していきます。

どうもありがとうございました。


654:Pascal
06/02/19 23:09:23
>>650
呼んだ?

655:デフォルトの名無しさん
06/02/20 00:22:49
>>650
あなたの心が汚れてるからですよ(^^;;;

656:デフォルトの名無しさん
06/02/20 00:30:26
そんなばかな^^;

657:デフォルトの名無しさん
06/02/20 01:26:15
>>650-652
ヤベ、ツボにはまったw

658:デフォルトの名無しさん
06/02/21 10:07:18
>>422-423
>ダイレクトに C++ を知らずに、C++/CLI に手を出すのは、止めた方がいいだろ
>さっさとC#かVBで始めたほうがいいと思う。

とりあえずC#で始めようと思った矢先、C++/CLI とかいうのが目に入って、
「ファイナライザいいな」とか思ってしまったんですが、
やっぱりC#から始めることにします。

>>424
関数単位ですか。
つまり、関数呼び出しを共通化することで様々な実行環境にあるコードを一つのプログラムにまとめることができたと言うことでしょうかね。


659:デフォルトの名無しさん
06/02/21 11:10:22
>>658
ああ、C#にしたのか。まぁそうしとけ。C++/CLIはネイティブの知識(C++)とCLRの
知識(C#)が両方要求されるひどい言語だ。最低限どっちかぐらい自由に使える
ようになってからおいで。…両方自由に使えるぐらいじゃないと使える言語でも
ないかもしれないが。

ファイナライザ?C#にもあるぞ。というかCLR用語だそれ。
まぁDisposeがスタックオブジェクトのように書けることをいいたかったんだろうけど。
川俣とかが取り上げているほど、たいしたものじゃない。あの人は大げさに書く文体
が売りだからな。いい悪いは別にして。

660:デフォルトの名無しさん
06/02/21 21:17:52
通のお勧めは関数のオーバーライド
ディスポーズ・パターンの変形に目が眩んでちゃ、まだまだ

661:デフォルトの名無しさん
06/02/21 21:25:46
>>660 ポリモにならんじゃん

662:デフォルトの名無しさん
06/02/21 21:32:20
>>658
~hogeか!hogeが使われている場合に下のようなコードを自動生成してくれる。
GC.SuppressFinalize(this)がむき出しにならないだけスマートだね。VB.NETにもほしい機能だと思う。
void Dispose(bool disposing) { if (disposing) ~hoge(); else !hoge() }
void Dispose() { Dispose(true); GC::SuppressFinalize(this); };
void Finalize() { Dispose(false); }
deleteしたり { ClassA a(); ...; } でスコープから離れた場合は
Dispose()が呼び出されるだけでその場でGCされるわけではない。

663:デフォルトの名無しさん
06/02/22 00:50:01
!hogeなんてあったんだ

664:デフォルトの名無しさん
06/02/22 07:21:27
>>662
いや、えーと、このスレにいる以上知っている。
ildasmでも確認したしな。ああ、そうか、それをC++/CLI用語でFinalizerというのか。


665:デフォルトの名無しさん
06/02/22 12:42:51
>661
おまいはC++/CLIにおける関数上書きの奥の深さに気付いていない

ここに IEnumerable を継承したインターフェイス IEA と IEB がある
その双方を実装した ref クラス RAB は明示的オーバーライドによって列挙の方式を
IEA と IEB によって変更できる
つまり、RAB から取得したインターフェイスによって、for each のオーダーを自由に
選択できるわけだ

666:デフォルトの名無しさん
06/02/22 16:05:53
MSがC++/CLIを捨てるのは何年後くらいですか?

667:デフォルトの名無しさん
06/02/22 16:13:12
MFCの如くこの劣悪貧を10年使うかも。
C++ってだけでもSTLやBoostが混ざってくると複雑なのに、正直CLIはカンベンて感じだおね。

668:デフォルトの名無しさん
06/02/22 17:22:04
>>667
駄菓子菓子、これがないとネイティブとかからCLRが非常に使いにくい。
ほら、次でWPFとかなんかたくさんあるし。

669:デフォルトの名無しさん
06/02/22 23:36:01
マイクロソフトがもうイラネと思ったら容赦なく捨てにくるさ。


670:デフォルトの名無しさん
06/02/23 02:00:23
>>669

そりゃ日本だけ。海外ではVBerが反乱おこして、msも今では Love VB, Love C#だとよ。

671:デフォルトの名無しさん
06/02/23 02:53:32
C#は、VC++とVBの中間を行くような言語だから、
どっちからも反発が強いだろうね。


672:デフォルトの名無しさん
06/02/23 03:03:54
反発はしないけど、C++で出来るなら C++ Nativeでやっちゃうよ。
必要なとこだけ CLIで .Netなんてライブラリ感覚で使えばいい。

673:デフォルトの名無しさん
06/02/23 03:20:44
/clrでNativeコンパイルすると遅くなる?



674:デフォルトの名無しさん
06/02/23 08:50:40
>673
>348

675:デフォルトの名無しさん
06/02/23 09:37:51
>>669
要るだろ。

だって、C++市場をCLIで混乱させることにより、
開発者をWin@ブビ or Win@C丼で留めておける。

676:デフォルトの名無しさん
06/02/23 10:00:24
>>674

遅くなるのは事実としても、何で遅くなるんだろ?
異なるライブラリがリンクされるからか? lstrcmp自体の実装が異なるのか?

それとも呼び出し時にスタックチェックでも入ってるのかね…。


677:デフォルトの名無しさん
06/02/23 14:21:46
>676
単純なループでは簡単に結論が出ない問題かもしれない
ちなみに漏れの環境では
CLR 6 - 7 sec.
Native 8 sec.
となった。意外だがCLRの方が早い
Win のほうは -02 -0t を付けた状態で、CLRの方はデフォルトのリリースモジュールだ

678:
06/02/23 22:30:11
>>670
そんな話しきいたことネ

679:デフォルトの名無しさん
06/02/23 22:47:11
誰か、C++/CLI で吐いた実行ファイル、
mono で動かした奴いる??

以前 VS.NET 2003 の C# で書いたコンソールアプリなら
mono で動かしたことあるんだけど。

680:デフォルトの名無しさん
06/02/23 23:22:55
mono がそもそも .net framework 2.0 に対応してたか?
してるなら、/clr:pure で動くだろう

681:デフォルトの名無しさん
06/02/24 08:17:28
nullptr

682:デフォルトの名無しさん
06/02/24 11:48:08
ガッ^

683:デフォルトの名無しさん
06/02/24 17:24:15
>>678

URLリンク(blogs.msdn.com)

ケツの穴が広がるぐらい、ハードに読めや。


684:デフォルトの名無しさん
06/02/24 21:07:35
>>683
良く読んだよ

>表の顔の日記 

> 裏の顔の日記
> さっさと消えてくんないかな。 うざいんだけど、 まじで。


685:デフォルトの名無しさん
06/02/25 04:29:20
という電波でも飛んでるのか?


686:648
06/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:デフォルトの名無しさん
06/02/25 11:43:26
typedef struct → typedef value struct
では?

688:648
06/02/25 12:05:23
>>687
そうです。コピペ間違いました。

value struct HOGE{
  int x;
  int y[4];
};

と記述してます。

689:デフォルトの名無しさん
06/02/25 12:17:18
・・・value型使わず、ネイティブ型で定義すれば?

690:デフォルトの名無しさん
06/02/25 12:20:37
あとは ref にして array<long>^ y で宣言して、コンストラクタで初期化するか

691:デフォルトの名無しさん
06/02/25 12:23:04
value struct HOGE
{
  int x;
  array<long>^ y;
};
はコンパイルが通るが、仕様上これでいいのか?

692:デフォルトの名無しさん
06/02/25 12:38:17
ok
ハンドルは nullptr で初期化される

693:648
06/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:デフォルトの名無しさん
06/02/25 13:05:44
2~3日あがくなら2~3日かけてマニュアル読んだほうがいいような気がする

695:デフォルトの名無しさん
06/02/25 13:45:46
>>693
値型にGCを求める必要がある?

696:デフォルトの名無しさん
06/02/25 14:23:50
C++/CLIのスレ見てると無意味にvalueを使いたがる人が多い気がするな。
valueは動作に癖があるから基本refで作ったほうがいいと思う。

697:デフォルトの名無しさん
06/02/25 16:22:08
value使ったほうが処理速度が速いとでも思い込んでいるんじゃ?
クセがあるには同意。


698:648
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/02/25 22:33:45
C++は真のローカル変数を使える言語なんだから、(ユーザー定義オブジェクト
がスタック上に配置できる)GCが必要な場合ってのはそんなに多くはならない
ってビョーン先生が言ってた。

701:デフォルトの名無しさん
06/02/25 23:11:17
>>700
それはわかるけれど、C++/CLIはCLIの世界にあわせないといけないからさ。

702:デフォルトの名無しさん
06/02/25 23:42:48
C++/CLIは二つの言語が同居しているようなものだからな。
C++の拡張というより建て増し。

703:デフォルトの名無しさん
06/02/25 23:49:05
>699
それだと、配列のサイズが3で固定されちゃわない?

704:デフォルトの名無しさん
06/02/26 00:22:20
>>702
二世帯住宅

705:デフォルトの名無しさん
06/02/26 00:49:18
ビョーン先生が取り扱っている案件はそうかもしれんけどな。
動的にオブジェクトが増えたり減ったりする案件のほうが多い。

706:デフォルトの名無しさん
06/02/26 00:56:47
>>700
しかしビョーン先生はGCをそんなに否定していない。
既存のC/C++のコードと互換性を保ったまま導入できるのなら、
C++に入れてもいいというようなことをD&Eで書いている。

707:デフォルトの名無しさん
06/02/26 20:57:17
>>705
vector使えばええやん。メンバかローカルにしておけばdeleteいらん。

708:デフォルトの名無しさん
06/02/26 21:08:56
>>707
グローバルでもdeleteいらんぞ

709:デフォルトの名無しさん
06/02/26 21:14:38
別に GC なんて C++/CLI の利点じゃないだろ
単に .net framework を既存の C++ と混同することなく使えるってとこが一番重要さ

C++/Smalltalk とか C++/Squeak とか出てこないかな

710:デフォルトの名無しさん
06/02/27 01:56:21
【初心者歓迎】C/C++室 Ver.25【環境依存OK】から誘導されてきました( `・ω・´)ノヨロシクー
VC8でopenFileDialogを使いたくて
MSDNのソースを試してみようと
URLリンク(msdn2.microsoft.com)
説明を読み
フォームに 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:デフォルトの名無しさん
06/02/27 07:06:19
>>710
System::Windows::Forms::DialogResult::OK とフルで書く。

712:デフォルトの名無しさん
06/02/27 07:26:28
>>711
最後まで仕様が揺れた所かも知れないね。

713:デフォルトの名無しさん
06/02/27 10:47:00
この状況って System::Windows::Forms まで using で指定しているから、単純にグローバル
スコープ指定していることが問題なんじゃね?
12行目の ::DialogResult を意味なく、:: で始めるな、と

714:デフォルトの名無しさん
06/02/27 11:06:47
>>713
ところがどっこい
DialogResult::OK と書くと今度は
System::Windows::Forms::Form::DialogResultが無いというエラーになる。
using namespace は探しに行ってくれないらしい。

715:デフォルトの名無しさん
06/02/27 11:38:26
ん、サンプルだと :: で始めてるな
っていうか、>710 って名前空間 System しか宣言してないって言ってるが
using namespace System::Windows::Forms が宣言されている環境では
::DialogResult::OK でエラーなくコンパイルできるな

先頭 :: の名前検索ルールって、グローバル指定じゃないんだ・・・

716:デフォルトの名無しさん
06/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
06/02/27 13:45:08
まず、 >710 の問題は、単に System::Windows::Forms が using 指定していないから
using namespace System::Windows::Form;
を付ければおっけー

>716
::DialogResult ってなっているから、先頭に :: を付ける場合ってグローバル名前空間の
名前空間指定だと思ってた。カレント解決してくれるんだ


718:716
06/02/27 13:55:54
>>717
いや、「正しい」はグローバル参照の方。

> using namespace System::Windows::Form;
> を付ければおっけー

Forms

719:715
06/02/27 18:46:14
ということは、MSの実装はバグかMS独自仕様か、微妙なとこだな

720:710
06/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:デフォルトの名無しさん
06/02/27 20:17:53
>>720
その一
using namespace ...
using namespace ...
namespace hoge {
と順番を変えたら ::DialogResult::OK でコンパイルが通る。

その二
hoge::DialogResult::OK  でコンパイルが通る。
恐らく下のも通るはず。
[hoge::STAThreadAttribute]

その三
namespace hoge { を使わずすべてGlobalに書く

これが仕様なのかバグなのかは俺にもわかんね~

722:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/02/27 20:45:59
>>723
C++/CLIの列挙子は列挙型の中のスコープにある。

725:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/02/28 01:38:12
>>727
CLRタイプのenum class と Cタイプのenumの2種類あって、
後者の話ならそのとおり。

729:710
06/02/28 21:38:39
皆さんのおかげで、openFileDialogを動かす事ができたのですが
肝心な事を忘れていました、ファイルを選択してボタンを押しても
実際にファイルが開かないんですよね(;^ω^)
// Insert code to read the stream here.
ってコメントアウトしてある部分が気になるけど、ここに何か
書かないといけないのかな?


730:デフォルトの名無しさん
06/02/28 21:43:05
教えてクンマンセー!

731:デフォルトの名無しさん
06/02/28 21:53:32
コメントが何のために有るのかわかってるのか?
っていうか読めよ。

732:710
06/02/28 21:54:54
>>731
英語読めません(´・ω・`)

733:デフォルトの名無しさん
06/02/28 21:57:00
>>732
んじゃ、英語の勉強から。英語書けないならともかく、読めないんじゃ
プログラミングなんてやってられない。

734:デフォルトの名無しさん
06/02/28 22:35:55
翻訳サイトも使えないようなヤツはプログラミングやめれ

735:デフォルトの名無しさん
06/02/28 22:40:27
ていうか、732は710の偽なんですが

736:732
06/03/01 00:45:52
俺は嘘つきだから俺の言うことは嘘ばっかりさ。さてこの嘘はホントかわかるかねwww

737:デフォルトの名無しさん
06/03/01 01:08:24
そんなおもしろくないよ?

738:デフォルトの名無しさん
06/03/01 01:32:16
>>733
ひまわりが専門なので関係ないでしょ

739:710
06/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:デフォルトの名無しさん
06/03/01 02:32:10
C++/CLI の場合でも .NET Framework のサンプルがほしければ
C#やVBのをそのまま使えるってのに

741:710
06/03/01 02:37:58
|∀・).。oO(・・・)
そうなのか?


742:デフォルトの名無しさん
06/03/01 02:38:23
ガンガレ

743:710
06/03/01 02:43:27
ムリッポ

744:デフォルトの名無しさん
06/03/01 07:19:26
>>740 うむ。
ちょっと間接参照の記述が違うくらいで、
流れは C# のコードのままでいいな。
まぁそれが C++/CLI の真骨頂でもある。

745:デフォルトの名無しさん
06/03/01 14:15:46
>>739
C++/CLIなんだからいちいちgcnewする必要はないと思う。

746:デフォルトの名無しさん
06/03/01 14:50:01
>>739
つかCloseもfinally句に書いてないし。
C#ならusing、C++/CLIならスタックオブジェクトにしろよなほんと。

747:デフォルトの名無しさん
06/03/01 16:30:41
で、STLはどうしてるんだ、おまえら?


748:デフォルトの名無しさん
06/03/01 16:49:26
C++/CLI でGUIなアプリつくるべ、と、フォームをデザインして
遊んでます。で、みなさん、アプリで必要となる大量の
変数たちは、class Form1 のメンバとしてずらずら宣言してしまって
構わないんでしょうか?

今までは UNIX 系でのコンソールアプリ主体で、自前の
アプリケーションクラスを用意して main() の中から
そいつをインスタンス化して、という感じでやってました。

Windows でのグラフィカルなアプリでの作法では、
自動生成された class Form1 にどんどんメンバを
追加しちゃっていいんですか?

当然イベントハンドラなどはデザイナで追加されていくわけで、
手動で追加したメンバのためにフォームデザイナが混乱して
しまわないかすごく不安です。

749:デフォルトの名無しさん
06/03/01 16:54:58
STLが無い、C++なんて。

クソ。

750:デフォルトの名無しさん
06/03/01 16:57:44
>>749 え?C++/CLI で STL つかえないの?

751:デフォルトの名無しさん
06/03/01 17:06:05
>>750
ネイティブ型に対しては使える。

そしてマネージ型対応のSTL/CLI(旧称STL.Net)がVC++ 2005と同時に公開されるはずだったのだが、
伸びに伸びて未だ公開されていない。

URLリンク(www.microsoft.com)

いっそのこと俺たちで作るかw。

752:デフォルトの名無しさん
06/03/01 17:18:06
>>751 あ~びっくりした。
そうだよな、ネイティブ型に対しては使えるよな?

C++ で書きためてきた std::vector 使ってる
数値計算用のライブラリがあって、どうしても
それから逃れられない + DirectX で可視化したい、
という要求があって、それ満たすには C++/CLI しか
ないだろ、ってことでこれから使おうと思ってたんで、
ちょっと焦った。

753:デフォルトの名無しさん
06/03/01 18:24:32
>>752
いやいやいや、お前DirectXをなんと心得る?

754:デフォルトの名無しさん
06/03/01 19:09:05
>>753 まだ、OpenGL のかわりみたいなもん、
くらいの認識です。頂点データの扱いとか
ぜんぜんちがうんですかね?
その話題はスレ違いですが。

目的は動き回る多数の分子模型の
ようなものなんですが。

755:デフォルトの名無しさん
06/03/01 19:16:26
DirectXはまだネイティブがメインなのにどうしてSTLの無いC++/CLIを無理に使おうとするのか

756:デフォルトの名無しさん
06/03/01 19:28:40
com::ptr 型がそこにあるから

757:デフォルトの名無しさん
06/03/01 19:29:40
OpenGLでもいいし。

758:デフォルトの名無しさん
06/03/01 19:40:32
>>755 いや、それすらまだ知らないんですよ。
普通に次元の可視化するときに、
フォームにぺたぺたとやってえらく簡単に
できたもんで、この勢いで 3D もいける?
とか思ったわけです。

>>757 いわれていれば、そうかも

759:デフォルトの名無しさん
06/03/01 20:01:27
>>758
そのノリでやりたいんなら(ビジネスっていうかグラフ化とかな)、
確かにマネージのAvalonが向いてる。けどもまだない。残念。

DirectXとOpenGLは例えばDirectXはCOMだったりとか細かくは違う。
けど理論はあんまり違わんので好きなほうでどうぞ。
一般的には凝ったことしなければOpenGLのほうが簡単。

760:デフォルトの名無しさん
06/03/01 20:11:40
スレ違いなんだが、VTKとかいろいろあるじゃん?

> フォームにぺたぺたとやってえらく簡単に
> できたもんで、この勢いで 3D もいける?

そんな子どもっぽい理由じゃなくて、(発端じゃなくて直線的な選択の事ね)
道具くらいちゃんと自分で選べるようになろうよ。
URLリンク(sal.linet.gr.jp) でも漁れ。多くがWindowsもOK。
OpenGLやDirectXを直接叩くなんて馬鹿らしいよ。

761:デフォルトの名無しさん
06/03/01 20:27:15
>>760 THX

論文に貼る図だと、動画じゃないので普通に
gnuplot で作ってるんですが、プレゼンだと
やっぱ動かなきゃな、ってことで取り組んでます。
色々あるんですね、こりゃ楽しそうだ。

762:710
06/03/01 21:11:31
今晩も盛り下がっていますね皆さん( ノ゚Д゚)こんばんわ
>>744間接参照の仕方を巧く解説してるサイトってない?
>>745newでは困憊羅君が、言うこと聞いてくれませんでした
>>746スタックオブジェクトって、なに?グラフや絵を描くメソッドのことかな?と聞いてみる
夕べ
URLリンク(www.athomejp.com)
ここのソースを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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/01 21:48:12
>>764
Debug.WriteLine に nullptr 渡すのってありだっけ。
}

766:デフォルトの名無しさん
06/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
06/03/02 04:01:28
盛り上がってるところ済みません。
どなたか >>748 に答えてくださるかた
おられませんでしょうか・・・

768:デフォルトの名無しさん
06/03/02 05:10:09
>>763
解説Thanks ☆☆** v( ̄ー ̄)v**☆☆ Thanks

769:デフォルトの名無しさん
06/03/02 06:39:27
>>762
スタックオブジェクト=auto変数


770:デフォルトの名無しさん
06/03/02 07:16:31
C++/CLIで

char *ptr;

ptr=(char *)malloc(sizeof(hoge));
free(ptr);

が使えるのに感動した!


771:デフォルトの名無しさん
06/03/02 07:41:26
>>767
シングルウィンドウのアプリケーションならそれでいいと思う。

772:デフォルトの名無しさん
06/03/02 09:47:47
質問させてください。
System::Collections::Generic::ListかSystem::Collections::ArrayListで
要素へのinterior_ptrを得る方法はないでしょうか。
ToArray()はコピーを返すのでだめでした。

773:デフォルトの名無しさん
06/03/02 19:35:49
>>772
ArrayList や List では無理、固定サイズの配列ならいける。
array<int>^ x = { 10, 20, 30, 40, 50 };
interior_ptr<int> r =  &(x[3]);


774:デフォルトの名無しさん
06/03/02 23:43:37
VS2003のC++で書いた
int __pin* px = &pX -> x;
こういう、書き方はVC8では通らないようですね?

775:デフォルトの名無しさん
06/03/02 23:50:15
>>774
cli::pin_ptr<int> px = &pX->x;

776:デフォルトの名無しさん
06/03/03 08:25:28
>774
/clr:oldSyntax

777:デフォルトの名無しさん
06/03/03 20:40:09
おっすオラ悟空

C++/CLI コンソールアプリの main では
コマンドライン引数として String^ の array への ^ が
渡されるんだけど、今まで使ってたコマンドライン処理
ルーチンに int argc, char** argv って感じの
おなじみのアンマネージドな形式で渡したい。
簡単な方法無い?????

778:デフォルトの名無しさん
06/03/03 20:49:34
>777
普通に int main(int argc, char**argv) で宣言すれば?
C++/CLI は CLI 拡張であって、旧来の機能がなくなった訳じゃない

779:デフォルトの名無しさん
06/03/03 20:53:27
おっす、オラ悟空
>>778 うまくいったぞ
これで boost::program_options がつかえそうだぞ

ところで boost のライブラリのうち /clr でビルドに
しっぱいするのは graph, test, wave みたいだぞ。
ほとんどは *.hpp だからビルド不要だけど.

780:デフォルトの名無しさん
06/03/03 20:54:45
おっすオラ悟空
もしかして C++/CLI ってすげぇ戦闘能力じゃねぇか?
スカウターが壊れちまったぜ

781:デフォルトの名無しさん
06/03/03 20:59:36
ゴクウがスカウターつけんなよ

782:デフォルトの名無しさん
06/03/03 21:01:41
じゃ、お前にやる

783:デフォルトの名無しさん
06/03/03 22:11:59
>>781
すげーワラタ

784:デフォルトの名無しさん
06/03/04 00:03:43
STL.Netが待ちきれなくて、System::Collections::Generic::ListのラッパをVectorという名で作ってみようとしたが、難しい。
クラスライブラリ化して他言語からも使えるようにとか考え出したら駄目だこりゃ。

785:デフォルトの名無しさん
06/03/04 05:40:23
CLIだとメンバにref object(ref ptrは可)
おけないからSTL.NETは
ptr_contenaみたいになるよね?


786:デフォルトの名無しさん
06/03/04 09:42:38
何処で聞こうかと迷いましたがここでお願いします
.NET Framework クラス ライブラリで
メール送信するSystem.Net.Mailというクラスがあるのですが
受信するクラスはどれですか?


787:デフォルトの名無しさん
06/03/04 13:39:45
Socket で imap か pop のポートに繋げてプロトコルながしゃいいんでない?

788:デフォルトの名無しさん
06/03/04 13:44:22
追加
URLリンク(mobiquitous.com)
ま、ライブラリとかもぐぐりゃ出てくるんだが

789:デフォルトの名無しさん
06/03/04 19:41:13
void func(const std::string & s); ってのは書けるけど
void func(const String ^ s); ってなふうにはかけないのね。

790:デフォルトの名無しさん
06/03/04 20:51:19
ハンドルは追跡ポインタだから const したら追跡できないだろ

791:デフォルトの名無しさん
06/03/04 21:02:23
>>790 ポイント先のオブジェクトを変更したくないよ
ってのを明示したかった。const な String へのハンドル、
って書きたかったんだ。

792:デフォルトの名無しさん
06/03/04 21:07:25
意味はわかるが、const の意味を拡張しない限りできんだろ
const や volatile は GCヒープには使えないと思わないとな

793:デフォルトの名無しさん
06/03/04 21:14:03
う~む、渡された側で不用意に変更して
しまわないようにしたかったんだけどな。
マネージドなオブジェクトに対しては無理なのか。

794:デフォルトの名無しさん
06/03/04 21:19:51
普通にconst指定出来たが、何をもって書けないと言っているんだ?

795:デフォルトの名無しさん
06/03/04 21:31:41
>>794
「const System::String ^
 この型での const/volatile 修飾子はサポートされていません」

って、コンパイラが優しくおこってくれた。


796:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/04 21:58:02
>>796 いいなぁ。
うちのコンパイラは出るんだ。
なんかスイッチの関係かな。
もうちょっと調べてみるよ。

798:デフォルトの名無しさん
06/03/04 22:02:33
それ、コンパイル警告C4400で、警告レベルは4。
どうやら漏れが警告レベルを一番高くしてるから表示されてるみたいだ。

799:MSDN Libraryによると
06/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:デフォルトの名無しさん
06/03/04 22:04:21
いいなぁって、駄目だろ。const 指定できちゃ(w

String^ hello = "Hello, World";
func(hello);

だとエラーだったりして

801:デフォルトの名無しさん
06/03/04 22:15:41
.NETの共通として通用しないだけで、
C++/CLI上では値を変更しようとするとエラーになるし、
特に問題はないと思うけど。

ちなみに>>800のも通った。

802:デフォルトの名無しさん
06/03/04 23:24:16
>>800
これが通るんだからそれが通らないわけが無いだろ。
void func(const std::string& s);

std::string hello = "Hello, World";
func(hello);

803:デフォルトの名無しさん
06/03/04 23:31:02
まぁそれ以前にあれだ、System::StringはImmutableなオブジェクトだ。
どっちにしろ変更できん…わけでもないけど裏技

804:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/05 17:22:58
>>805ありがとう
出直す前に、スマソ
unsigned longって32bitですよね、多分そのせいだと思うけど
9桁以上入力すると、結果がオーバーフローしちゃってffffffffに
なっちゃいます、予期せぬ結果です
wchar_tが16ビットのせいだと思うのですが、こんなときはどうしたら
いいのでしょうか、教えて君で申し訳ないですが御教授お願いします。


807:デフォルトの名無しさん
06/03/05 17:30:43
>>806
(VC++の)unsigned longは32ビットで0~0xffffffffの数値を格納できる。
だから十六進法で8桁までだ。wchar_tに非は無い。
たとえばunsigned long longなら64ビットあるから十六進法で倍の16桁までいける。

808:デフォルトの名無しさん
06/03/05 17:44:29
>>806ありがとう
unsigned long

unsigned long longにしてみたら
: warning C4244: '引数' : 'unsigned __int64' から 'unsigned long' への変換です。データが失われる可能性があります。
警告が出てしまい、実行するとやはり9桁でオーバーフローしてしまいました
手のほどこし方はもう無さそうですね、(´・ω・`)

809:デフォルトの名無しさん
06/03/05 17:44:57
UInt32::Parseじゃいかんの?


810:デフォルトの名無しさん
06/03/05 18:16:11
>>808
32ビットしか返さない関数使ってるんだから当たり前だな

811:デフォルトの名無しさん
06/03/05 18:18:02
>808
だから、自分の使っている関数の方とかをチェックしてこいといってるだろうに
受け取り側を unsigned long long にしても、変換関数が対応していなけりゃ駄目だろ
おまいさんは文字列を 64 ビット長の整数値に変換したいんだから、それに対応した
変換関数を探してこい
>809 がいいヒントをくれているじゃないか
.net framework で 64ビット長符号なし整数値の型を探してそのメソッドを調べろよ

812:デフォルトの名無しさん
06/03/05 19:01:42
>>811どうもありがとう
>>806です
URLリンク(msdn2.microsoft.com)
Convert.ToUInt64 (Int32)
これでいいのかな?


813:デフォルトの名無しさん
06/03/05 19:09:18
・・・おまいさん、文字列を UInt64 に変換したいんだろう?
だったら使うべき変換関数は Convert.ToUInt64(String^) じゃないのかい
これなら、いちいち配列変換しなくてもいいわけだし
UInt64::Parse(String^) だってあるだろうに
もちろん、UInt64.ToString() とすれば、文字列への変換もできるぞ

C++/CLI は (3.14).ToString() ってやって文字列を取得することだってできるんだから

814:デフォルトの名無しさん
06/03/05 20:42:17
std::wcstoul を愛しているんだろうから、そっとしておいてやれよ

815:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/05 21:11:47
>>815
Convert::ToUInt64は文字列をUInt64(unsigned long long)に変換するほうだ。

817:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/05 21:28:41
というか、unsigned long long int って型はまだ標準じゃないよな

820:デフォルトの名無しさん
06/03/05 21:31:17
>>819
C++にはまだないが、C++/CLIには存在する。
URLリンク(signe.japan.webmatrixhosting.net)

821:デフォルトの名無しさん
06/03/05 21:44:23
>820
それは知ってるが、標準関数が対応してないってこと
ってそこ直リンすんなよ

822:デフォルトの名無しさん
06/03/05 21:46:10
>>821
だからC/C++のunsigned long longが関係するところは全て非標準だな。

823:デフォルトの名無しさん
06/03/05 21:49:23
そだな。非標準の型は全部 CLI 型表記にした方がわかりやすいと思うんだが
変に今までと一緒なもんだから、間違えやすいんじゃないかな

824:デフォルトの名無しさん
06/03/05 22:01:51
それよりも混乱する原因はC、C++、.Net Frameworkのクラス・関数が入り乱れているからのほうが大きいと思う。
答えているほうだって、あれ使え、いやこれ使えって具合だし。

そもそも一旦十六進法の文字列へ変換するまではともかく、その後文字列へ変換する必要性がわからない。
そのままtextBox2->Text = textBox1->Text;でいいと思うのだが。
大文字小文字を揃えたいだけならtextBox1->Text->ToUpper()で十分だし。

825:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/05 22:04:35
>>825
MSDN見ろ。
TryParseは2つ目に結果を格納する引数がある。

827:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/05 22:28:57
>825
勘違いしたんじゃ、ないぞ。MSDNを見るようわざと間違えたんだからな
決して、名前だけで bool 値を返すんだろとか考えて適当に書いた訳じゃ、ないんだからな

829:デフォルトの名無しさん
06/03/05 22:30:52
>>827
MSDN見ろ。1つめの引数の文字列の書式が書いてある。UInt64::Parseは十進法しか受け付けない。
Convert::ToUInt64なら基数が指定できるけど、Try版がないから例外を受けるしかないと思う。

830:デフォルトの名無しさん
06/03/05 22:30:54
スマソ
Try外していました
しかし、TryParseの問題を解決しても
例外エラーは出そうな感じがするんだが

831:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/05 22:40:02
あ、
if ( !String::IsNullOrEmpty() ) →if ( !String::IsNullOrEmpty(textBox1->Text) )
だったorz

833:デフォルトの名無しさん
06/03/05 23:06:15
そもそも、目的はbutton1を押すとtextBox1に入力した
16進数の入力判定を行い、(条件として、空でないこと、16進数16桁であること)
button2を押したら、openFileDialogを呼び出しファイルを選択してOKを押したら
textBox2に選択したファイルを読み込ませ(ここは既に実装できています)
最後にbutton3を押したらtextBox1とtextBox2を結合し、saveFileDialogで
名前を付けて保存するという、単純なものなのですが16進数変換と入力判定の所で
どつぼにはまってしまいました。

文字入力

16進数変換&入力チェック

外部ファイル読み込み

16進数+外部ファイル結合

名前を付けて保存


834:デフォルトの名無しさん
06/03/05 23:24:16
とりあえず判定は829のように例外が投げられるかどうか調べるしかないと思う。

835:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/06 00:28:58
16進で出力すればいいじゃん。
何言ってんだ?

837:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/06 01:19:03
学生さん?

839:デフォルトの名無しさん
06/03/06 04:30:32
>>837
textBox2->Text = Convert::ToUInt64(textBox1->Text, 16).ToString("x");

ちゅうかうざい。

840:デフォルトの名無しさん
06/03/06 07:57:43
ToString が書式指定できることを知らんと言うのもありがちで、MSDNを見れば・・・

だが、Express の配布で C++/CLI を使う初心者がこんな感じに騒いだらこの先恐ろしいな


841:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/06 13:16:33
MFCはどうなるんでつか?

STL.CLIみたく、MFC.CLIが出るんでつか?

844:デフォルトの名無しさん
06/03/06 13:20:15
つ CWinFormsControl

845:デフォルトの名無しさん
06/03/06 13:27:29
Microsoft .NET Framework の Windows フォームを使用したペインティング テクニック
URLリンク(www.gotdotnet.com)
これを参考に、C++/CLI からのグラフィックスの基礎を勉強しています。

最後の TextClipping というアプリケーションの例で、
protected override void OnPaintBackground(PaintEventArgs e)
という C# における記述が出てくるのですが、
同様の記述を C++/CLI でやってみたところ、
override 仕様にも基本クラスで OnPaintBackground は
virtual じゃないよ、って言われます。

.NET Framework 2.0 で何か変更になったのでしょうか?

846:デフォルトの名無しさん
06/03/06 14:19:42
自分のメソッドの宣言で virtual は書いたけど override 指定していない方に つ⑩

847:デフォルトの名無しさん
06/03/06 14:49:30
汚い文法だなぁ

848:デフォルトの名無しさん
06/03/06 15:17:51
>>864 OnPaintBackground つーのは、規定クラス
System::Windows::Forms で virtual で宣言
されている「はず」だったんですが・・・
んじゃ、OnPaint とかを乗っ取る事はできないのかなぁ。

849:デフォルトの名無しさん
06/03/06 15:28:57
fつべvうぇ45wvw34

850:デフォルトの名無しさん
06/03/06 15:57:19
>848
まぁ、漏れあてなんだろうけど、C++/CLI では暗黙のオーバーライドは禁止されている
ちゃんと
virtual void OnPaintBackGround(...) override ←これ
{
...
}
と記述してる? これ書いても上書きできていないの?

851:デフォルトの名無しさん
06/03/06 17:32:02
>>850 忘れてました orz

852:デフォルトの名無しさん
06/03/06 21:01:39
>>100 本買ってまで勉強する必要はないんじゃない?

853:デフォルトの名無しさん
06/03/07 18:46:38
private:
  void button1_Click( Object^ /*sender*/, System::EventArgs^ /*e*/ ){
  hoge = "";
  ~
}

private:
内で定義した変数って、よそのプロシージャーでは当然使えませんよね
グローバル変数で定義すれば、いいのだろうけど
NETで
※どんなアルゴリズムでも、グローバル変数なしで
記述できることが証明されています。
グローバル変数は後述するように、非常に強力な反面、
大きな危険性を秘めています。
とはいえ、絶対に知っておくべき事柄です。
らしい、button1で発生した変数を、button2のイベントが起きたときに
継承させる方法を
、グローバル変数無しで実現できるの?


854:デフォルトの名無しさん
06/03/07 19:41:37
>>853 まずもってプロシージャってのが C++ にあるか
ってのは置いといて、そのフォームのメンバ変数は
button1_Click() からでも button2_Click() からでも
アクセスできるじゃん。

855:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/07 20:57:37
>>855
それ別の位置でコンパイルエラー出てるだけじゃないか?
そのコードの中にtempなんて識別子は出てないのだが

857:デフォルトの名無しさん
06/03/07 21:14:41
>856
この人が言ってるの、auto 変数のことじゃない?
メソッド内部で宣言したローカル変数にアクセスしたがってるんだよ

858:デフォルトの名無しさん
06/03/07 21:20:23
>>857 そんなもん、VB でもできんわ・・・
プロシージャとかいってるからたぶん
VB使いかな?とか思った。

859:デフォルトの名無しさん
06/03/07 21:53:50
やっぱり、無理やな

860:デフォルトの名無しさん
06/03/07 21:55:54
>>853 の頭の中には、ローカル変数とグローバル変数しか内のだろうか。

861:デフォルトの名無しさん
06/03/07 21:56:09
プロシージャが WinProc のことなら、Form 間でのアクセスのことかも
何にしても、そんな状態でC++/CLIに手を出すのはやめた方がいいと思う

862:デフォルトの名無しさん
06/03/07 22:24:46
そもそもC++/CLIでなくてもC#でもなんでもやめたほうがいいな。

863:デフォルトの名無しさん
06/03/07 22:51:56
>>862も人生をやめたほうがいいな。

864:デフォルトの名無しさん
06/03/08 02:13:35
C++/CLI がこんなにも複雑なのがいけないと思います!

865:デフォルトの名無しさん
06/03/08 02:40:33
まぁ何でもあり(?)なのが C++/CLI だしなぁ。
複雑さを避けたいなら、C#だよな。
あ、VB.NET って手もあるか。

866:デフォルトの名無しさん
06/03/08 02:58:40
>>865
> まぁ何でもあり(?)なのが C++/CLI だしなぁ。
まさにC++から派生した、って感じだな

867:デフォルトの名無しさん
06/03/08 07:35:51
言語仕様を拡張せずに .NET 対応は出来なったのかなぁ。
managed_ptr<Object> obj = managed_new<Object>();
みたいな。

868:デフォルトの名無しさん
06/03/08 07:39:15
>>867 managed C++ であんまりうまくいかなかったから、
結局言語使用の拡張に踏み切ったんだろ。

869:デフォルトの名無しさん
06/03/08 08:18:59
>867
逆に、どこまでが既存の C++ でどこからが CLI 拡張かわかりやすくていいと思うよ
mc++ の混乱ぷりから考えるに、MSが出した仕様にしてはさっぱりしすぎて不思議
時代が変わっても、フレームワークをさくっと切り替えるだけで対応できるし、VES も
簡単に交換可能なところが夢があると思われ
また、C++ 自体の拡張の邪魔にならないところとかもいい
Sun も JNI の仕様をこれにしないかな。そしたら、JVM も使う気になるのに

870:デフォルトの名無しさん
06/03/08 08:24:21
Java をネイティブ拡張したものがが仮にあったとして、
C++/CLI とどっちを使う??

871:デフォルトの名無しさん
06/03/08 08:38:56
その仮とやらの質による。存在しないものと比較しても仕方がない


872:デフォルトの名無しさん
06/03/08 09:48:43
おい!!!!
だれだよ、俺のプロジェクトで勝手に /clr:pure にした奴は!
おかげで全部 __clrcall になっててリンクできずに
一晩悩んだじゃないか!

さて、そろそろ帰るか。

873:デフォルトの名無しさん
06/03/08 19:50:08
>>870
Javaをネイティブ拡張したもの≒C#

874:デフォルトの名無しさん
06/03/08 20:04:29
Java = C++--
C# = Java++ = C++--++

875:デフォルトの名無しさん
06/03/08 21:20:07
>>873
ネイティブじゃナインじゃん

876:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/08 21:33:42
System::Environment::NewLine

878:デフォルトの名無しさん
06/03/08 21:34:09
textBox1->Text = arg_1 + endl + arg_2;
じゃなくて
textBox1->Text = arg_1 + "\n" + arg_2;
でいいじゃん。

std::endl はマニピュレータで、、
マネージド型である String に対して
+ 演算子がオーバーロードされているなんてことはまずない。


879:デフォルトの名無しさん
06/03/08 21:36:40
"\r\n"にしないとだめではないか?

880:デフォルトの名無しさん
06/03/08 21:45:08
変だな?
textBox1->Text = arg_1 + "\n" + arg_2;
としたら
コンパイルも通ったんだけど
textBox1に表れた文字が
abc・def
全角文字の・に似た記号が出ます(多分全角の・とは違う気がするが、定かではない)
秀丸に貼り付けると
abc
def
と改行されてるんだが、なぜ?


881:デフォルトの名無しさん
06/03/08 21:47:30
>>880
サンクスできましたが、解説もオナガイシマス
なんで
"\n"では駄目で"\r\n"なの?


882:デフォルトの名無しさん
06/03/08 21:54:42
Windowsの改行コードは"\r\n"だから。
UNIXとかのコンソールプログラムでは\nで
Macは"\r"

883:デフォルトの名無しさん
06/03/08 21:56:39
そしてC/C++は\nを使い、テキストモードでの入出力時には環境固有の改行コードと\nとで変換をしている。

884:デフォルトの名無しさん
06/03/08 21:57:50
ウィンドウズはそういうもん。
Unix : 円 n
Windows : 円 r 円 n
旧 mac : 円 r

コンソールアプリは透過的に 円 n ⇔ 円 r 円 n やってくれるが
テキストボックスとかはやってくれない。
秀丸じゃなくってノートパッドならやっぱりナカテンが出ると思う。


885:デフォルトの名無しさん
06/03/08 21:58:49
みんなでケコーン

OS X は ¥n になったよ ... 関係ないですが。

886:デフォルトの名無しさん
06/03/08 22:01:40
>>882->>885
>>881です
ご丁寧にありがとうございました、よく理解できました
しかし皆さん本当に良く知ってますね

887:デフォルトの名無しさん
06/03/08 22:01:47
>>884
どっちかと言うと円記号よりもバックスラッシュ。

888:デフォルトの名無しさん
06/03/08 22:16:41
完璧な回答を出しているのにスルーされてる>>877がカナシス

889:デフォルトの名無しさん
06/03/08 22:31:06
>>887さん
ありがとう
スマソ、やっぱりC++/CLIならこうですよね
(゚д゚)(。_。)(゚д゚)(。_。) ウンウン
msdnでよく調べます


890:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/09 18:29:48
なんでSaveFileDialog->OpenFileで開いてるのにさらにStreamWriterで開き直す?
すでに開いているストリームに対してStreamWriterを使うのならStream^を渡す。

892:デフォルトの名無しさん
06/03/09 18:50:37
最近よう、気のせいか初心者歓迎スレに変わってきてないか?
なんか、聞けばいいと思っている輩が増えてきた気がするんだが

893:デフォルトの名無しさん
06/03/09 18:53:25
>>891
SaveFileDialog->OpenFileに書き込むには
どうしたらいいですか?


894:デフォルトの名無しさん
06/03/09 19:15:18
System::IO::StreamWriter^ sw = gcnew System::IO::StreamWriter(myStream);

初心者はC#かVBからはじめるのがいいよ。MSDNの見方くらい覚えような。

895:デフォルトの名無しさん
06/03/09 20:52:02
>>894
ありが㌧


896:デフォルトの名無しさん
06/03/10 01:26:35
C++/CLI みたいなマニアな言語を使おうとする奴が
なぜこんなところで教えてくんしてるのか判らん。
(マニア、というのは、それでないと書けないほどのアプリを
書かないといけないはめになっていないと使わないだろう、
ぐらいの意味。)
MSDN 読めるぐらいでないと C++/CLI 手を出さないと思うんだが、
どうなってんだろう?

897:デフォルトの名無しさん
06/03/10 03:18:05
しらんがな。

898:デフォルトの名無しさん
06/03/10 08:44:22
>>896
少しはC++をやっていて、新しい言語に手を付けずに.Netが使えるぞと思っているんだよ、きっと。
実際はC++とC++/CLIとは別物だということを知らず。

899:デフォルトの名無しさん
06/03/10 09:08:02
つーか、自然な流れだと思うぞ。

一般的にC++が普及してた。
ライブラリはMFCやらWin32APIやらATLを使ってたであろう。
そして、MSの次期スタンダードなライブラリが、.NETになった。
じゃあ、C++から.NETを使おうか。

こんな感じでしょ。
間違いだとも思わない。

900:デフォルトの名無しさん
06/03/10 09:11:06
ええっと、言語間の違いよりも、
ライブラリ間の違いのほうが余程大きいと思うんですが...

901:デフォルトの名無しさん
06/03/10 09:18:01
一般的に旧VBが普及してた。
PC以外で死滅気味だった言語が台頭。サーバーサイドJavaや組み込みC++。
サーバーサイドや組み込みに足を踏み入れるドトネトとC丼を強制。
ブビ厨氏滅&ドトネト氏産。
オネガイC++からドトネト使ってトンでも言語mc++ → C++/STL.CLI

902:デフォルトの名無しさん
06/03/10 09:22:57
>>901
日本語でおk

903:デフォルトの名無しさん
06/03/10 09:44:39
899=線能されてる

C++の文法複雑+マネージドの理解+旧COMの理解を要するなんてサイアクじゃん。
で、C++のBoostなんかは使えないという利点が無いオマケ月。

904:デフォルトの名無しさん
06/03/10 09:51:19
>>903 ネイティブな領域では普通に Boost 使えてるけど?
たとえば Boost.Serialization で既存のデータを読み込んで、
Windows Forms で表示したり ADO.NET で DB に投入したりできる。

905:デフォルトの名無しさん
06/03/10 09:54:30
>>904
書いてて自分の文章の複雑さに気付かない?

906:デフォルトの名無しさん
06/03/10 09:56:50
スレリンク(tech板:115番)
こういうこともあるみたいだけど。

907:デフォルトの名無しさん
06/03/10 10:01:59
>>904 ネイティブな領域では普通に Boost 使えてるけど?

なんだ、丸々大ウソか。
さすが線能されてるだけある。

M$もCOMでC++を汚しきったが、mc++で文法破壊、CLIでライブラリ破壊だね。

908:904≠899
06/03/10 10:16:42
>>906 それ書いたの俺。で、そのオチが >>872

909:デフォルトの名無しさん
06/03/10 10:20:06
>>908
>だれだよ、俺のプロジェクトで勝手に /clr:pure にした奴は!

PUREでない混合だと激遅になるドトネトに何の意味があるのかと小一時間。

910:904≠899
06/03/10 10:24:15
>>909 pure でやるなら、既存のライブラリの多くを
あきらめるってことなので、俺なら C# を選択する。

911:デフォルトの名無しさん
06/03/10 10:28:38
>あきらめるってことなので、俺なら C# を選択する。

ソースコードの価値ってのは既存コードだったり、
環境変わってもコンパイルしたりすると動くことだったりするのに、
馬の骨C丼に何の価値があるのかと。

912:デフォルトの名無しさん
06/03/10 10:29:34
スレリンク(tech板:1番)
         ,. -‐'''''""¨¨¨ヽ
         (.___,,,... -ァァフ|          あ…ありのまま 今 起こった事を話すぜ!
          |i i|    }! }} //|
         |l、{   j} /,,ィ//|       『.NET framework 2.0を入れたと思ったら
        i|:!ヾ、_ノ/ u {:}//ヘ        何故かノータッチデプロイメントがぶっ壊れた』
        |リ u' }  ,ノ _,!V,ハ |
       /´fト、_{ル{,ィ'eラ , タ人        な… 何を言ってるのか わからねーと思うが
     /'   ヾ|宀| {´,)⌒`/ |<ヽトiゝ        おれも 何をされたのか わからなかった…
    ,゙  / )ヽ iLレ  u' | | ヾlトハ〉
     |/_/  ハ !ニ⊇ '/:}  V:::::ヽ        頭がどうにかなりそうだった…
    // 二二二7'T'' /u' __ /:::::::/`ヽ
   /'´r -―一ァ‐゙T´ '"´ /::::/-‐  \   移植や修正が必要だとか
   / //   广¨´  /'   /:::::/´ ̄`ヽ ⌒ヽ    そんなチャチなもんじゃあ 断じてねえ
  ノ ' /  ノ:::::`ー-、___/::::://       ヽ  }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::...       イ  もっと恐ろしいものの 片鱗を味わったぜ…

913:904≠899
06/03/10 10:31:16
>>911 だから今俺は C++/CLI 使ってるんだってば。

914:デフォルトの名無しさん
06/03/10 10:37:16
>>913
で、C++/CLI複雑じゃない?それだけ価値あるということ?

915:904≠899
06/03/10 10:38:48
>>914 使わざるを得ない場面があるということ。
あと、マゾにはたまらないって言うこと。

916:デフォルトの名無しさん
06/03/10 11:13:29
自分で判断できないような人はC#やっといた方がいい。
C++/CLIは必要があって使うもの。

917:デフォルトの名無しさん
06/03/10 11:29:40
既存のライブラリの多くを諦める事になるからC♯って意味分からん。
C♯だったら、多くを諦めるどころか、全部諦めにゃならんだろw
ヤケクソやってんのか?w

918:904≠899
06/03/10 11:45:23
>917 そんなこといってないじゃん。
既存のライブラリを使いたいから /clr:pure あきらめて
C++/CLI つかってます、って書いてんのに。

919:デフォルトの名無しさん
06/03/10 11:56:18
ヒント;M$ジレンマ

920:デフォルトの名無しさん
06/03/10 13:48:25
>>918
君は正しい。ただあんまり一生懸命レスすること無い。疲れるだけだから。

921:デフォルトの名無しさん
06/03/10 19:38:26
昔:VB-VC-Windwos
今:.NET Framework-C++/CLI-Windows



922:デフォルトの名無しさん
06/03/10 20:36:09
伸びてると思ったら不毛な議論が続いてたようだな。
アンチが何したいのかわからんがこんなところで騒いでも無駄ですよ

923:デフォルトの名無しさん
06/03/11 09:58:42
皆さんはやっぱり、C++/CLIでもファイルの入出力とか自作のライブラリー等
作成されてるのですか?Stream オブジェクトとか、MSDN見る限り、素人目には
既に完成されていると思うのですが、個人的にパラメータを渡して読み込み、書き込み
モードで開いたりとかテキストモードで開いたり、バイナリモードで開いたりとか、やったほうがもっと楽でミスも少なくて、いいのかなぁーと思ったりするのですが、
いかがなものでしょう?


924:デフォルトの名無しさん
06/03/11 10:07:31
逆に聞くが>>923は今まで入出力に自作のライブラリを使っていたのか?

925:デフォルトの名無しさん
06/03/11 10:10:33
>>923 C++/CLI でも、っていうか、マネージドの領域では
.NET Framework べったりのプログラミングしてます。

C++/CLI 使うメリットはネイティブとの橋渡しができる
ことだと思ってるんで、ネイティブの領域では
従来通りの自作のライブラリーを多用しています。

926:デフォルトの名無しさん
06/03/11 10:36:50
>>923
何言っているんだかわからん。
Streamのどこが気に入らなくて、どういうことをやっているわけ?

927:デフォルトの名無しさん
06/03/11 10:47:06
>>926 抽象化されていないもっとファイルシステムべったりの
いじり方をしたいのでは、と推測するけど、まぁそういうことが
したけりゃ Windows API 叩くのも C の標準ライブラリ
叩くのも低レベルファイルアクセス関数群叩くのも
C++ の標準 I/O ストリーム使うのも自由、としか言いようがないな。


928:デフォルトの名無しさん
06/03/11 20:59:39
テキストボックスに
0
1
2
3
4
5
6
7
8
9
と表示したいけど

for( int i = 0 ; i < 10 ; i++ ){
  String^arg = Convert::ToString(i);
  textBox1->Text = arg + "\r\n";
}
これだと
9
しか表示できないんですよね(;´∀`)
うーんわからん


929:デフォルトの名無しさん
06/03/11 21:03:49
これはひどい

930:デフォルトの名無しさん
06/03/11 21:04:01
> textBox1->Text = arg + "\r\n"; 

931:デフォルトの名無しさん
06/03/11 21:05:39
>>928 そりゃ、Text に最後に設定されるのが
"9\r\n" だからだろ。
arg = じゃなくて arg += とかじゃないの?
と、試しもせずにカキコ

932:デフォルトの名無しさん
06/03/11 21:09:22
>>931
で、そのargはどこに行くんだ

933:928
06/03/11 21:17:24
>>930さん
>>931さん
残念ですが巧くいきません、同じ結果です

934:デフォルトの名無しさん
06/03/11 21:27:42
textBox1->Add(arg);

935:デフォルトの名無しさん
06/03/11 21:31:10
StringBuilder^ builder = gcnew StringBuilder();

for(int i = 0;i < 10; i ++)
{
 builder->AppendFormat("{1}{0}",System::Environment::NewLine,i.ToString());
}
this->textBox1->Text = builder->ToString();

936:928
06/03/11 21:58:21
>>935さん
ありがと、巧くいきました
StringBuilderクラス初めて知りました
builder->AppendFormat("{1}{0}",System::Environment::NewLine,i.ToString());
の"{1}{0}"は何を意味するものですか?


937:デフォルトの名無しさん
06/03/11 22:15:05
>>936
引数の2番目({1})と1番目({0})

.NETでは基礎的なこと。

938:デフォルトの名無しさん
06/03/11 22:21:51
うんざりするほどの教えてクンだな

939:デフォルトの名無しさん
06/03/11 22:28:44
理解していない {1}{0} を教えてもらった通り
使っただけで「うまくいきました」と言える神経が理解出来ない

940:デフォルトの名無しさん
06/03/11 23:07:57
正直、C# に移って .net framework の使い方から勉強してきてほしいものだ
.net framework 総合ってあったよな

941:デフォルトの名無しさん
06/03/11 23:23:19
enum classのインスタンスを
switchの条件式に使うとunsafeにならない?
Reflectorでみたらunsafeになってたんだけど...orz

942:デフォルトの名無しさん
06/03/12 00:01:20
しかし、海外ではC#なんて朽ち果ててるのに、ここは鎖国な人ばかりですか?


943:デフォルトの名無しさん
06/03/12 00:03:12
>>942
じゃ、その海外では何を使ってるの?
あちこちでその書き込み見るんで、
マジで教えて欲しいんだが。

それにここ C++/CLI のスレッドだし。

944:デフォルトの名無しさん
06/03/12 01:06:44
北米でのサンデープログラマはJavaよりもC#が多いってニュースみたことあるけど

945:943
06/03/12 01:14:43
ちなみに、クライアントサイドでのJavaの案件なんて
ほとんど見たこと無い。

946:デフォルトの名無しさん
06/03/12 01:19:23
ref class のデータメンバにどうしてもネイティブクラスの
インスタンスを持たせたいんだけど、混合はできないから
ポインタで持たせるしかない?

ref class ManagedClass {
      中略
      NativeClass* nativeClass;
      中略
};

みたいに。せめて std::auto_ptr つかって

ref class ManagedClass {
      中略
      std::auto_ptr<NativeClass> nativeClass;
      中略
};

って書きたいけど、結局は混合になるからだめなんだよな。


947:デフォルトの名無しさん
06/03/12 01:36:31
gcroot
auto_gcroot

948:デフォルトの名無しさん
06/03/12 02:08:28
>>943

VB。つーか、こんな簡単な事もわからないヤツがいるのか。
日本人同士で馴れ合ってるから、バカになるんだよ。



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch