C++/CLI について語ろうぜ Part2

このエントリーをはてなブックマークに追加
772デフォルトの名無しさん
linq は C++/CLI では使えないんでしょうか?
773デフォルトの名無しさん:2008/02/06(水) 10:03:29
>772
使えない
ttp://www.codeplex.com/linqextensions

LINQ のパフォーマンスから見ると、C++/CLI での価値を感じない
774デフォルトの名無しさん:2008/02/06(水) 10:22:23
LINQ のパフォーマンス(笑)
C++/CLI での価値を感じない(笑)
775デフォルトの名無しさん:2008/02/06(水) 10:37:31
言語使用的に無理なのかな.
似たようなことがライブラリで実現できるように見えるが.
776デフォルトの名無しさん:2008/02/06(水) 10:40:41
ttp://japanese.engadget.com/2008/02/05/linus-os-x-vista/

VistaやLeopardが大々的なマーケティングと共に投入されることを批判して:
「OSは(アプリケーションやユーザーからは)完全に透明であるべきだ」。
「マイクロソフトやアップルにとって、(OSの新バージョンは) 環境をまるごとコントロールして
ユーザーにアプリケーションやハードウェアの買い換えを強いる手段になっている」。
777デフォルトの名無しさん:2008/02/06(水) 10:52:09
>775
ライブラリで似たようなことができるから、言語でのサポートは不要
これで 0x の auto とかが出てこれば、もう少し CLinq もすっきりと書ける
言語仕様に手を入れると、標準化団体が騒ぐし
778デフォルトの名無しさん:2008/02/06(水) 10:59:38
>>776
>「OSは(アプリケーションやユーザーからは)完全に透明であるべきだ」

透明であるべきだ,ってどういう意味なんだろうね.
意識しなくていいものであるべきだってこと?
だったら,Linux ってその逆行ってない?
カーネルのマイナーバージョンが変わっただけでモジュール類
コンパイルし直さないと使えないデバイス続出だったり.
まさしくOS部分が一番の障壁になってるとおもうのだが.
自分でいじる分にはそれが楽しいけど.
779デフォルトの名無しさん:2008/02/06(水) 11:00:50
たしかに,auto は楽しみだなぁ.
ラムダ式は boost のもいいけど
ちゃんと言語でサポートしてほしいよ.
780デフォルトの名無しさん:2008/02/06(水) 11:08:17
>>777
Expression Treeサポートって今の言語機能でどうやるの?
781デフォルトの名無しさん:2008/02/06(水) 11:22:56
>透明であるべきだ,ってどういう意味なんだろうね.
>意識しなくていいものであるべきだってこと?

上と下意味違ってるだろ。常考。
782デフォルトの名無しさん:2008/02/06(水) 11:36:09
>780
何をどうやって書きたいのかを書いてもらいたいな
SQL的に書きたいだけのシンタックス・シュガーの導入が標準化団体に受け入れられる
とは思えない
783デフォルトの名無しさん:2008/02/06(水) 11:39:03
OSのバージョンアップをいちいちお祭り騒ぎにして
ソフトやハードの売り込み合戦を仕込んで
煽ってんじゃねえよって意味なんじゃないの。
784デフォルトの名無しさん:2008/02/06(水) 11:41:23
煽るだけならまだしも、ふれーむわーく(笑)ごっそり変えて、
>LINQ使えない
とかカンベン。
785デフォルトの名無しさん:2008/02/06(水) 11:51:07
>780
Expression tree ということでギってきた
ttp://blogs.msdn.com/daigoh/archive/2006/06/10/625985.aspx

たとえば、こういったことをやりたいのであれば、C#でのコードと同じものが
演算子オーバーロードで生成できるようにすればいいのでは?
boost::spirit みたいな変態ライブラリになると思うが

確かに早くラムダ式の言語サポートが欲しい
786デフォルトの名無しさん:2008/02/06(水) 18:46:45
http://d.hatena.ne.jp/NyaRuRu/20051017/p1
こういうアイデアはいいなあと思う。
787デフォルトの名無しさん:2008/02/07(木) 16:06:34
うん。
この調子なら、数年のうちに LISP が再発明されるな。
788デフォルトの名無しさん:2008/02/07(木) 16:40:43
ま、コンパイル言語で eval しようという試みでもあるからなぁ
789デフォルトの名無しさん:2008/02/07(木) 21:55:59
ExpressionはDynamicMethod&ILGeneratorの簡易版としても使えて面白いね
790デフォルトの名無しさん:2008/02/11(月) 17:17:44
3連休なんてあっという間だな。
791デフォルトの名無しさん:2008/02/11(月) 19:22:41
C++の場合は、boostでメタプログラミングするか、マネージドで拡張するか微妙なところが出るだろうな
LINQを見ていると明らかに boostにインスパイヤーされているとしか思えない所があるし
boostは、さらに、Haskellにインスパイヤーされていて、C#もLINQそれを意識しての拡張だしね。
違いは、静的にか決定できないか、動的な決定も可能にするか、実行速度的に高速か、コンパイル後にまで及ぶ高い汎用性を取るか……
しかし、C++の場合の一番の的は、templateワカンネー人間かもしれないがwww
792デフォルトの名無しさん:2008/02/11(月) 20:20:30
C++0x/CLI は可能なのだろうか?
793デフォルトの名無しさん:2008/02/11(月) 20:32:43
Haskellだけでなく、
関数型プログラミング言語全般の影響だと思うけどね。
ほかはだいたいそうだと思う。
794デフォルトの名無しさん:2008/02/11(月) 20:34:04
>>792
右辺値追跡参照%%とかできたらすげぇって思うわ。
そのセマンティクスまではよその言語へ持って行けないだろうけど。
795デフォルトの名無しさん:2008/02/13(水) 02:28:45
>右辺値追跡参照
何やら恐ろしげな用語だなと思ってググッてみたらC++/CLIの機能か
なんですかそれは、噛み砕いて解説してやってください、もうC++/CLIとかは全然追ってないので
今のC++ってギリギリ感が凄すぎなんですが、どうなんですかねー
796デフォルトの名無しさん:2008/02/13(水) 02:35:26
ようするに追跡参照T%は、ただの参照と違ってGCのついでのメモリ移動にも対応した参照型。
だからgcnewしたオブジェクトやその部分オブジェクトも参照できる。
そのポインタ版は、内部ポインタinterior_ptr<T>やハンドルT^が相当すると言っていいと思う。

右辺値参照はC++0xのやつ。
797デフォルトの名無しさん:2008/02/14(木) 22:38:12
右辺値参照の右辺値の意味はわかりずらいな
左辺にしない代わりに制約が減ったよ値にしてくれ
798デフォルトの名無しさん:2008/02/15(金) 04:34:29
template <typename T> ref struct A
{
cli::array<T%>^ m;
};

ってやるとコンパイラが落ちるな

799デフォルトの名無しさん:2008/02/15(金) 08:27:00
マジか!
ちょっと帰ってきたら試してみよう
800デフォルトの名無しさん:2008/02/15(金) 09:47:37
2008EEは落ちないな
801デフォルトの名無しさん:2008/02/15(金) 09:58:29
帰ってきたら?誰が?
802デフォルトの名無しさん:2008/02/15(金) 10:03:55
コンパイラさんが
803デフォルトの名無しさん:2008/02/15(金) 14:31:06
VS2005SP1はアウト
トラッキング参照がダメっぽい

Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
.\test.cpp(9) : fatal error C1001: コンパイラで内部エラーが発生しました。
(コンパイラ ファイル 'msc1.cpp'、行 1393)
この問題を回避するには、上記の場所付近のプログラムを単純化するか変更してください。
詳細については、Visual C++ ヘルプ メニューのサポート情報コマンドを
選択してください。またはサポート情報 ヘルプ ファイルを参照してください。
.\test.cpp(10) : コンパイルされたクラスの テンプレート のインスタンス化 'A<T>' の参照を確認してください
804デフォルトの名無しさん:2008/02/16(土) 10:41:58
C++/CLIってどうなんですかね?
今仕事が谷間なんで新しい言語でも勉強してようかと思うんですけど
仕事とかで使われてます?
805デフォルトの名無しさん:2008/02/16(土) 11:54:41
>>804
とりあえずC#やってこい.
806デフォルトの名無しさん:2008/02/16(土) 12:14:53
>>805
何いきなり否定してんだよ

>>804
仕事ではとりあえず見たこと無いな、ガベコレ?なにそれ状態だw。
C++/CLIは、やりすぎだと思うんだな、Dの様な言語を作っておいて、共存可能にした上で徐々にC++側をフェードアウトすべきだと俺は思った。
807デフォルトの名無しさん:2008/02/16(土) 12:17:09
C++ユーザーはドトネトを無視、
ドトネト厨はC++を無視、
そんな状況を解決する策











となる筈だった。
808デフォルトの名無しさん:2008/02/16(土) 12:20:04
>>807
無視してないだろ、たとえばLINQなどは思いっきりboostがやってきた事を意識しているのは明白だし。
809デフォルトの名無しさん:2008/02/16(土) 12:36:16
やっぱり橋渡し専用言語に留まるのかなあ
810デフォルトの名無しさん:2008/02/16(土) 12:59:31
>橋渡し専用言語
それ以上の用途は最初から想定してないでしょ。
言語宗教論争への配慮なんて意図は一切なかったと思うんだがなぁ。
STL/CRLは気の迷いだよたぶん。

実際のところ、C++のシンタクスを完全にマージしつつ(完全は言い過ぎか)、
.NETなセマンティクスを生成する偉業はもうちょっと評価されるべきかと。

もちろん構文が似てるからとC++/CLIから.NETに入ろうとしている人には
暴力に訴えてでも全力でC#をオススメするが。
811デフォルトの名無しさん:2008/02/16(土) 13:51:23
C#って.NETの基礎言語みたいなもんだしな。
俺はそんなものにとっくに飽きてしまって
マクロと抽象インターフェースを通すようにして
C++|C++/CLIに一発で切り替えられるようにしてプログラムしてる。
いつでも.NETから逃げ出せるようにね。
812デフォルトの名無しさん:2008/02/17(日) 23:31:21
>>806
つ C#

そんなことより、
C++をヘードアウトさせるなんてとんでもない!
813デフォルトの名無しさん:2008/02/21(木) 02:00:18
C++/CLIでは、
PropertyGridは、
String以外に指定できんのですか?

Booleanとかintにしてもリードオンリーになる

ColorとかSizeとかenumなどもやりたいお
814デフォルトの名無しさん:2008/02/21(木) 02:10:16
C++/CLI関係ないからMSDN嫁
815デフォルトの名無しさん:2008/02/21(木) 02:57:21
MSDNの何処に書いてあるのかさっぱり。
Fontは、できました。
Colorは、できません。
意味不明><
816813:2008/02/21(木) 03:13:02
VC2005です。
classは、ここのやつコピペして
http://www.gamedev.net/community/forums/topic.asp?topic_id=450334

public: cParticleDef^ def;
private: System::Void ImageEditor_Load(System::Object^ sender, System::EventArgs^ e)
{
def = gcnew cParticleDef;
this->propertyGrid1->SelectedObject = def;

みたいな子としてます。
EditorAttribute指定とかいるんかしら
817デフォルトの名無しさん:2008/02/21(木) 03:54:28
MSDNライブラリ内を探すときには、
site:msdn2.microsoft.com付けてググるといいんだよ。
818デフォルトの名無しさん:2008/02/21(木) 04:20:15
やられました。
見本にしてた
http://www.gamedev.net/community/forums/topic.asp?topic_id=450334
よく読めよって話でした。
失礼しました。

ググりかたのヒント、ありがとうございます。

819デフォルトの名無しさん:2008/02/21(木) 21:41:37
アルゴリズムにも関わるため、この板で質問していいか悩みましたが、
C++/CLIで作ろうと思っているため、質問させていただきました。


ある16Byteのデータが、
1000個くらいのアンマネージ型の16Byteの配列のどれに当てはまるか
検索することを実装したいと思っています。
1000個の配列間で共通な部分はないです。


最も早い方法というのは何が考えられるでしょうか?
今のところ以下を考えています。

if文でXORまたはmemcmpで検索する
→C++/CLIのXORは高速?

また、C++/CLIのor(||)はショートサーキットが入っているのですか?
VBのOrElseのような。もしも入っていないなら、ショートサーキット
を実現したOrコマンドはあるのでしょうか?


820デフォルトの名無しさん:2008/02/21(木) 21:57:15
慌ててるのはわかるが、日本語でplz

そこまでタイトならアセンブリで組んだら?
1000個程度ならよほど繰り返し実行しなければ、そこまで真面目にアルゴリズムを
追求する必要があるほどの速度にならないと思うけど

ショートサーキットって、if 文の順番で先に判定外れが発生したら、それ以降は検証
しない奴? それなら、当たり前にそうなってるけど
821デフォルトの名無しさん:2008/02/21(木) 22:01:31
日本語がおかしくてすいません・・・あせってまして。
ご返信ありがとうございます。

>そこまでタイトならアセンブリで組んだら?
>1000個程度ならよほど繰り返し実行しなければ、そこまで真面目にアルゴリズムを
>追求する必要があるほどの速度にならないと思うけど
そう聞くと少し安心します。ただ、検索する回数が100回くらいあります。
たいしたことないですかね?

>ショートサーキットって、if 文の順番で先に判定外れが発生したら、それ以降は検証
>しない奴? それなら、当たり前にそうなってるけど

はい。if(A || B)として、AがtrueでもBを評価することです。
MSDNを見ても書いてないから、ショートサーキットはないと思ってました。
822デフォルトの名無しさん:2008/02/21(木) 22:12:36
何回も検索するんなら、std::mapとかに入れとけば?
823デフォルトの名無しさん:2008/02/21(木) 22:13:43
変にアンマネージマネージ行ったり来たりする方が遅そう
824デフォルトの名無しさん:2008/02/21(木) 22:23:20
>>821
1000個の状態が変わらないなら、がっさりメモリ取っちゃって、その上で検索して
(速度が必要なら分割してmultithreadで)メモリのポジションから当たりのデータを
数えてもいい気がするんだけど

ttp://vene.wankuma.com/ecma372/15_expression.aspx
SS15.9, 15.10
825デフォルトの名無しさん:2008/02/21(木) 22:54:47
>>823
同意
memcmpはやめたほうがいいな
826デフォルトの名無しさん:2008/02/21(木) 23:05:02
データが静的なもので検索する回数が多いなら、ソートしちゃって
二分探索でもするのがいいと思うが。
827デフォルトの名無しさん:2008/02/22(金) 00:22:33
ご返信、ありがとうございます。
memcmpはしない方がいいのですね・・・。マネージクラスのアンマネージ処理は遅くなるのですか。だったら16バイトの比較はxorを使う
ことが適当でしょうか。

828デフォルトの名無しさん:2008/02/22(金) 00:27:36
変なことするとILの最適化の妨げになるから、素直に==で比較すべき。
829デフォルトの名無しさん:2008/02/22(金) 05:40:43
>変なことするとILの最適化の妨げになるから、素直に==で比較すべき。

ありがとうございます。素直==で比較します。ただmemcmpを使わないならば、
自分で比較関数を使った方がいいのでしょうか?
16バイト比較なので8バイトずつ比較するというような・・・
830デフォルトの名無しさん:2008/02/22(金) 06:17:55
そんなの実装なんかたいした手間でもないんだから自分でやって計測すれ
831デフォルトの名無しさん:2008/02/22(金) 07:46:12
アンマネージ型
とわかってるなら
C++で関数作ればいいだけでは?

アンマネージにする意味が分からん。
832デフォルトの名無しさん:2008/02/22(金) 08:46:48
union で char[16] を double 値2つに突っ込んで、== で比較してもいいわな
833デフォルトの名無しさん:2008/02/22(金) 10:01:38
できるだけ行ったり来たりしなくて済むようにまとめてアンマネージの範囲でやればいいと思う
834デフォルトの名無しさん:2008/02/22(金) 12:57:20
>>832
long longでいいよ。
835デフォルトの名無しさん:2008/02/23(土) 01:17:19
LOGFONT が欲しいんだけど、
void Font.ToLogFont (
Object^ logFont
)
の引数って何渡せばいいの?

Object ^o = gcnew o;
ToLogFont(o);
LOGFONT *lf ・・・?
836デフォルトの名無しさん:2008/02/23(土) 02:18:22
ググると、自分でLOGFONT構造体を定義してやるC#のサンプルが見付かった。
LOGFONTWが返ってくるらしい。
LOGFONTWを直接渡せればいいのだが、
できないので代わりに配列を送り込んだ。

namespace dr = System::Drawing;

dr::Font^ f = dr::SystemFonts::MessageBoxFont;
array<BYTE>^ a = gcnew array<BYTE>(sizeof (LOGFONTW));
f->ToLogFont(a);
pin_ptr<LOGFONTW> plf = reinterpret_cast<interior_ptr<LOGFONTW> >(&a[0]);
::MessageBoxW(0, plf->lfFaceName, L"", 0);
837デフォルトの名無しさん:2008/02/23(土) 05:20:23
>>836
ありがとうです!
ばっちりでした。

838デフォルトの名無しさん:2008/02/25(月) 20:07:22
マクロメディアFlashの
タイムラインみたいなウィンドウ作りたいけど

やっぱり自作しなきゃだめかな
なんか楽そうな方法ありませんか?
839デフォルトの名無しさん:2008/02/29(金) 00:44:15
クラスライブラリを作ろうとしてます。
C#では///から始まるコメントを書くと、そのクラスライブラリを
参照する方のインテリセンスにコメントに書いた説明が表示されますが
C++/CLIで同様のことはできないのでしょうか?
840デフォルトの名無しさん:2008/02/29(金) 00:59:15
確か、出た覚えがある
841デフォルトの名無しさん:2008/02/29(金) 01:05:33
プロジェクトの設定からXMLドキュメントファイルの生成をonにしたらできるようになりました。
けどC#のように///を入力したら自動で整形してくれたり
タグの候補を出してくれたりはしないんですね。
842デフォルトの名無しさん:2008/02/29(金) 01:08:25
CLIでは無理と認識している。
XML欲しいときは一生懸命書いてるよw
843デフォルトの名無しさん:2008/02/29(金) 01:13:25
ちなみにC#のように楽には書けんよ。圧倒的にタイプ数が増える。

俺はCtrl+spaceキーを多用する癖がついてしまった・・・
あとShiftキーもかなり使う事になる。
844デフォルトの名無しさん:2008/02/29(金) 11:26:07
C#使ってるとC++でインテリセンスが出ないときに不安になる
845デフォルトの名無しさん:2008/02/29(金) 11:57:24
>>844
うむ,とりあえず ncb ファイルを削除してみたりとかね.
846デフォルトの名無しさん:2008/02/29(金) 20:26:39
CLIの入門サイトってありますか?
847デフォルトの名無しさん:2008/02/29(金) 21:01:16
MFCじゃ駄目なんですか?
848デフォルトの名無しさん:2008/02/29(金) 21:08:43
他の言語は使えてC++/CLIは初めてなのか,
それともプログラミング自体初心者なのかどっち?
後者ならC++/CLIを選ぶのは間違い
849デフォルトの名無しさん:2008/02/29(金) 21:17:52
使える言語はC/C++でOffice風のメニュがあるアプリ作りたいからCLIを始めたいのですが・・・・
850デフォルトの名無しさん:2008/02/29(金) 21:59:46
C# の古い奴を勉強してから仕様書読んだ方が良くね?
851デフォルトの名無しさん:2008/03/01(土) 01:32:19
C / C++ がわかる人には C# の文法は全然もんだいない

C++/CLI はモンスターだから ...
852デフォルトの名無しさん:2008/03/01(土) 02:09:12
俺は意地になってCLI使ってる・・・。C#なんか糞喰らえだw

たまに羨ましく思うこともあるけど
853デフォルトの名無しさん:2008/03/01(土) 03:21:27
ILで直接コーディングしてるつわものはいないのか
854デフォルトの名無しさん:2008/03/01(土) 09:46:28
昔、スクリプトを造ろうとしてやったが、Hello,Worldで力尽きたな(w
ただアセンブリを取得したいのなら、C# を吐き出して、CodeDOM 使った方が楽だという
事実に絶望した
855デフォルトの名無しさん:2008/03/01(土) 11:19:48
そこでDLRですよ
もはやC++/CLIとは無縁の世界だなw
856デフォルトの名無しさん:2008/03/01(土) 12:33:55
>>841
こんにちは。

↓このプラグインを使ってみては、どうです?
-CodeProject: XML Comments for Managed C++ Applications. Free source code and programming help
http://www.codeproject.com/KB/macros/MCXDoc.aspx

サンプルはVS2003用ですけど、少し手直しするだけで、VS2005や2008でも動きますよ。
(自分は、 .h だけじゃなくて .cpp でもXMLコメントできるよう1行修正して使ってます)
857デフォルトの名無しさん:2008/03/01(土) 12:40:57
System::IO::MemoryStreamからアンマネージドなIStreamインターフェース
のポインタを取り出す事ってできるんですか?
ネイティブライブラリ関数の引数に渡したいのですが。
858デフォルトの名無しさん:2008/03/01(土) 16:18:02
そもそも持ってないので
自前で実装すりゃいいんじゃね?
859デフォルトの名無しさん:2008/03/01(土) 16:45:56
>>858
そうなんですか。
ComVisibleAttribute属性が付いてるからできるのかなと思ってました。
(ComVisibleAttributeの事はよく分からないけど)
860デフォルトの名無しさん:2008/03/01(土) 22:56:35
SHCreateMemStreamでIStream作成なんてどう?
861デフォルトの名無しさん:2008/03/02(日) 01:18:08
実験で
public class Hoge
{
public static void func(ref int a) {}
public static void func(int a) {}
}
というクラスライブラリをC#で書き、C++/CLIから
int a = 〜;
Hoge::func(a);
と呼ぼうとしましたが、どっちを呼べばいいか分からないとコンパイラに怒られました。
C#ならref引数にはrefを付けて呼び出さないといけないので区別することができますが
C++/CLIの場合はどうするのでしょうか?
862デフォルトの名無しさん:2008/03/02(日) 11:53:04
func(ref int a) -> func(int% a)
で駄目?
863861:2008/03/02(日) 12:38:00
delegateを介することで任意のオーバーロードを呼ぶことができました。

delegate void FuncRef(int%);
delegate void Func(int);
(gcnew FuncRef(Hoge::func))(a); // func(ref int a)を呼ぶ
(gcnew Func(Hoge::func))(a); // func(int a)を呼ぶ

>>862
よく意味が分かりません
864デフォルトの名無しさん:2008/03/02(日) 12:44:26
% は C++/CLI に置ける参照指定
865デフォルトの名無しさん:2008/03/02(日) 13:00:16
それはわかってるのですが、呼び出し時にどう関係あるのでしょうか?
866デフォルトの名無しさん:2008/03/02(日) 13:03:23
ん、cast で指定したらってことだけど?
ref に値型を渡すってことは boxing したいってことなんだよね?
867デフォルトの名無しさん:2008/03/02(日) 13:34:20
castですか?
((void (Hoge::*)(int%))&Hoge::func)(a);
とやってもマネージ型はできないと言われました。

C#でのref引数ってのは、C++/CLIでのトラッキング参照(%)、C++での参照(&)の事だと思うのですが
boxingと関係あるのでしょうか?
868デフォルトの名無しさん:2008/03/02(日) 14:06:21
関係ないよ。
869デフォルトの名無しさん:2008/03/04(火) 16:59:19
ref class A {
public:
String^ str;
int* ptr;
};

A^ a = gcnew A();

マネージドなクラスのメンバを初期化しない場合どうなるか見てみたところ
a->str, s->ptrどちらもnullptrでした。
これはたまたまなのか、それとも仕様で決まっているのでしょうか?
870デフォルトの名無しさん:2008/03/04(火) 19:38:57
871869:2008/03/04(火) 20:30:38
>>870
thx
872デフォルトの名無しさん:2008/03/04(火) 20:31:29
あるクラスのインスタンスを一気に100個作るメソッドってない?
forでまわすの面倒
873デフォルトの名無しさん:2008/03/04(火) 20:56:46
gcnew array<AruClass>(100)
874デフォルトの名無しさん:2008/03/04(火) 20:57:16
↑は忘れて
875デフォルトの名無しさん:2008/03/04(火) 21:32:22
AruClass a[100];
876デフォルトの名無しさん:2008/03/04(火) 21:40:24
↑は忘れて
877デフォルトの名無しさん:2008/03/04(火) 22:06:26
くだすれC++/CLI(初心者用)ってもう無い?
878デフォルトの名無しさん:2008/03/04(火) 22:07:42
スレ検索して見つからないんなら無いんだろう
879デフォルトの名無しさん:2008/03/04(火) 22:15:29
.NETのクラスライブラリの使い方に関する質問はC#スレで聞けばいいからなあ
言語仕様の話題だけなら2つもいらん
880デフォルトの名無しさん:2008/03/06(木) 13:59:34
スタックじゃなくてgcnewで作成する場合はどうすれば・・・
881デフォルトの名無しさん:2008/03/06(木) 14:31:03
スタックで作っ(たように見せかけ)て、リファレンスで保持するのはできなかったっけ?
882デフォルトの名無しさん:2008/03/06(木) 17:02:17
883デフォルトの名無しさん:2008/03/06(木) 20:19:10
array<char>^ a = gcnew array<char>(10);
pin_ptr<char> pinned = &a[0];
interior_ptr<char> interior = &a[0];
char* native = pinned;

pinned += 5; // pin_ptrの位置を変える
interior += 5; // interior_ptrの位置を変える

pinned = native; // ネイティブポインタからpin_ptrに
interior = native; // ネイティブポインタからinterior_ptrに


コンパイル・実行共に問題なかったんだけど、コメントのような操作って規格的にOKなの?
つか、pin_ptrやinterior_ptrってデバッガの逆アセンブルで見るとスタックに積まれた
普通のポインタにしか見えないんだけど、どういう仕組みなんだろう…
884デフォルトの名無しさん:2008/03/06(木) 21:22:00
pin_ptr の方はおっけー。元々、pin_ptr で指されているポインタの先のオブジェクトは GC の
再配置の対象にしないという仕様だから
interior_ptr の方は実体はハンドルらしい
大切なのはGCでオブジェクトの再配置が発生したとき、追随できればいいわけだから普通の
ポインタに見えても不思議はないんじゃない? GCがアドレスを変更するんだろうし
885883:2008/03/06(木) 23:20:18
pin_ptrが指してる先に再配置しないフラグとか付けてる様子無いんだけど
よく分からんが俺の知らない仕組みが働いてるんかな。
まあともかくthx
886デフォルトの名無しさん:2008/03/06(木) 23:52:49
C++ のコンサバGCだかなんだかと同様に、スタックにあるポインタらしきものが
直接指してる先のものは再配置しないんじゃないの?
そうじゃないとJITコンパイラも効率いいコード吐けないだろうし。
887デフォルトの名無しさん:2008/03/07(金) 00:38:22
ああなるほど
888デフォルトの名無しさん:2008/03/09(日) 04:54:36
あなる
889デフォルトの名無しさん:2008/03/09(日) 14:33:00
class A {
public:
 typedef int(*cbfunc)(void *);
private:
 cbfunc _cb;
 void *_cbarg;

 void somewhen() { _cb(_cbarg); }
public:
 void set(cbfunc cb, void *arg) {
  _cb = cb; _cbarg = arg;
 }
};

という感じのクラスがDLLの中にすでにあって、
A::set() の arg にマネージドオブジェクトを指定したいのだけど、
どうすればいいですか? gcroot まではたどり着いたけどなんかちがう
890デフォルトの名無しさん:2008/03/09(日) 14:58:13
Aを作ってる方の話?
それともAを使う側の話?
891デフォルトの名無しさん:2008/03/09(日) 15:43:10
使う側ですー。
892デフォルトの名無しさん:2008/03/09(日) 17:34:09
gcrootをnewしてそれをsetする。
不要になったら、そのgcrootのインスタンスをdeleteするか、
gcrootが中で使っている
System::Runtime::InteropServices::GCHandleを直接使うかというのでどう?
893デフォルトの名無しさん:2008/03/15(土) 21:10:57
へっだーにusing namespace hoge;を書くと
取り込んだ先でも影響されます。どうしますか?
894デフォルトの名無しさん:2008/03/15(土) 21:12:51
ヘッダで using しないのは常識。
895デフォルトの名無しさん:2008/03/15(土) 21:14:16
ウィザードが作ったForm1.hもusingしてるよ。
896デフォルトの名無しさん:2008/03/15(土) 21:22:14
ウィザードの吐くコードはうんこだから。
897デフォルトの名無しさん:2008/03/15(土) 21:27:54
こんなもん使うなというメッセージなんだろう
898デフォルトの名無しさん:2008/03/15(土) 21:34:46
どうしても長くて書きたくない名前空間があるなら別名作っとけ。
899デフォルトの名無しさん:2008/03/15(土) 22:34:16
よーしマヂレスしちゃうよ

C++/CLIがうんこ
900デフォルトの名無しさん:2008/03/15(土) 22:51:57
まあMSもあんまり使わせたくないんだろう
フォームのデザインなんてC++/CLI本来の用途から考えたら不要なんだから
901デフォルトの名無しさん:2008/03/15(土) 23:07:35
class Takenoko
{
public:
 Takenoko();
 ~Takenoko();
private:
  Nazo m_nazo;
};

Nazoのコンストラクタが必ず引数をとる場合エラーがでます。
902デフォルトの名無しさん:2008/03/15(土) 23:11:11
コンストラクタの中で冷害が起きるとデストラクタは呼ばれるの?
903デフォルトの名無しさん:2008/03/16(日) 00:36:38
なわけねぇだろ
904デフォルトの名無しさん:2008/03/16(日) 08:21:18
C#ではできるよ
905デフォルトの名無しさん:2008/03/16(日) 10:11:34
>>901
ただのC++と同じでコンストラクタ初期化子書け。
906デフォルトの名無しさん:2008/03/16(日) 10:17:08
C# はマネージド・オブジェクトがスコープ外れて GC に回収されてるだけだろ
そうじゃなきゃ、コンストラクタの try 構文なんていらねぇよ
907デフォルトの名無しさん:2008/03/16(日) 10:17:41
using
908デフォルトの名無しさん:2008/03/16(日) 12:35:04
>>905
渡すものがまだ出来ていない場合はどうすればいいの?
909デフォルトの名無しさん:2008/03/16(日) 12:47:21
初期化子に書いたものは、コンストラクタ実行前にできあがっていることが保証されてるだろ
そっちで発生した例外はコンストラクタの try catch で捕まえろよ
こんなの、C++の話題だろ。何ここで訊いてやがる。こっち池yo
ttp://pc11.2ch.net/test/read.cgi/tech/1204124447/
910デフォルトの名無しさん:2008/03/16(日) 13:28:39
ref class Render
{
private:
 PresentParameters pp;
 Device m_device;
}

PresentParametersの本体が自動的に出来ていたとしても
初期化リストでm_device(pp)と渡す時点で中の値は意味をなさないでしょう?

Managed DirectXの話をそこでは出来ません。
911デフォルトの名無しさん:2008/03/16(日) 13:31:19
最初からコード出せよ。ref もついていないクラスの話かと思ったぜ
それで何が問題なわけ?
912デフォルトの名無しさん:2008/03/16(日) 13:40:05
Direct3D.Device 型って値型だっけ? マネージド型のスタック書きってただのシンタックス・シュガー
だから、メンバにするときはハンドルにしておくべきなんじゃね
んで、コンストラクタでPPの値セットしてから gcnew すりゃいいだろうに、何を手を抜いているんだか
913デフォルトの名無しさん:2008/03/16(日) 15:33:49
解決しました。
914デフォルトの名無しさん:2008/03/16(日) 19:59:02
C++のライブラリでSTLコンテナの内容が更新されるんですが
コレを刻一刻とデータグリッドに表示させようと思うと
タイマーで定期的に明示的に内容をコピーしまくるしか無いでしょうか?
なんかこうもっとスマートなやり方ってありますか?
915デフォルトの名無しさん:2008/03/16(日) 20:08:10
もうちょっと話したいことを整理してくれ。
916デフォルトの名無しさん:2008/03/16(日) 20:56:40
refなクラスはオートポインタ見たいのに入れられますか?
917デフォルトの名無しさん:2008/03/16(日) 21:12:43
意味がない
918デフォルトの名無しさん:2008/03/17(月) 00:03:03
要するにmanagedなのにデストラクタ走って欲しいんだろ

MS的に実体宣言でダメなら無理でFA
919デフォルトの名無しさん:2008/03/17(月) 00:06:35
>>916
msclr::auto_handleとmsclr::auto_gcrootがまさにそれ。
前者がマネージ型(参照型)、後者がネイティブ型。

>>917
マネージクラスHogeはデストラクタ (IDisposable::Dispose実装)を持っているとして、
関数の戻り値としてHoge^を受け取るというときなんかにauto_handleは必要になる、らしい。
Hoge^ f();

void g()
{
//Hoge h = *f(); 普通、参照クラスはコピーコンストラクタがないのでこんなことできない。
msclr::auto_handle<Hoge> h = f();

} //hのデストラクタが中のHogeオブジェクトののデストラクタを呼ぶ。
920デフォルトの名無しさん:2008/03/17(月) 00:36:38
おまいら、質問者の意味不な一行にエスパーで答えすぎですよ
921デフォルトの名無しさん:2008/03/17(月) 14:01:15
>>920
いいんじゃね?優しくてw
最近おかしいプログラマって多いから・・・例えば

Q.○○するためにはどうしたらいいのですか?

普通・・・□□がいいかも。△△もお勧め。
異常・・・まず、なぜ○○しようと思ったか言え。

普通に答える人って少ないじゃんw
922デフォルトの名無しさん:2008/03/17(月) 14:05:39
その目的を達成するために選んだ経路がそもそも間違ってるケースが多いから仕方ないよ
923デフォルトの名無しさん:2008/03/17(月) 14:16:04
ほらwwwこんな感じでw
924デフォルトの名無しさん:2008/03/17(月) 14:18:46
そこでエスパー
xxxでできる。けど、もしaaaをやりたくて質問したのならyyyのほうがいいよ。
925デフォルトの名無しさん:2008/03/17(月) 14:22:05
linq とかはいずれ入って来るのかなあ
C#でしか使ったこと無いけど
926デフォルトの名無しさん:2008/03/17(月) 14:22:32
LINQはすでに入ってきてるだろ
927デフォルトの名無しさん:2008/03/17(月) 14:25:12
LINQは要りません。
928デフォルトの名無しさん:2008/03/17(月) 14:34:11
全ての式をメソッドにして律儀にデリゲートオブジェクト作って
Enumerable::Select(Enumerable::Where(…か
929デフォルトの名無しさん:2008/03/17(月) 19:25:33
Windows フォームアプリでフォームを二枚開いて
それぞれに別の情報を表示させるにはどうすりゃいいんでしょうか?
_beginthread でスレッドを複数用意して
それぞれのスレッドで System::Windows::Forms::Application::Run
を呼び出すのでしょうか?

_beginthread ・・・ ドトネトぽく無い気もするし、
そもそもフォームを表示させるのに
Application::Run を使うものだと思い込んでる
俺がダメな気もする。知恵をお貸しください。
930デフォルトの名無しさん:2008/03/17(月) 20:01:22
気のせいだとは思うがC++/CLIの方がC#より速い気がする。
もちろん根拠はない。計ってもいない。

ただ、スタックセマンティクスは大きいよね。これ使えるときは
使った方がいいよね。
少なくともファイナライザーよぶより、デストラクタ呼んだ方が
はやいよね。
931デフォルトの名無しさん:2008/03/17(月) 20:03:26
>>929
その別の情報ってのがどう意味なのかによると思うけど、
スレッドにする必要はなさそう。
スレッド使うにしても.NETのスレッドの方がプールしてる
らしくてイイと聞いたことがあるよ。
932デフォルトの名無しさん:2008/03/17(月) 20:10:53
>>931
C++ でやってる数値計算があるんですが、
スピードよりわかりやすく見せれ!ってことで
フォームをいくつか開いていろいろ表示させたいなぁ、と。

System::Windows::Forms::Application::Run(gcnew KashikaForm1);
System::Windows::Forms::Application::Run(gcnew KashikaForm2);
System::Windows::Forms::Application::Run(gcnew KashikaForm3);

ためしに適当なフォーム3つ用意して Run 呼んでみたら
当たり前だけど最初の一枚だけ表示されて帰ってコネー!
とじたばたしてました。思わず各行の最後に & つけそうになったよ・・・
933デフォルトの名無しさん:2008/03/17(月) 20:14:40
3つともインスタンス作ってからそれぞれShow()して
最後にApplication::Run()
934デフォルトの名無しさん:2008/03/17(月) 20:29:02
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |
|  ,,ノ(、_, )ヽ、,,   |
|   ,;‐=‐ヽ   .:::::|
\  `ニニ´  .:::/      NO THANK YOU  
/`ー‐--‐‐―´´\
       .n:n    nn
      nf|||    | | |^!n
      f|.| | ∩  ∩|..| |.|
      |: ::  ! }  {! ::: :|
      ヽ  ,イ   ヽ  :イ
935デフォルトの名無しさん:2008/03/17(月) 20:31:07
>>932
まずその計算てのは大変な計算なんだよね。で、
その計算自体が1つで、それを例えば数値とグラフでみせる。
のかそれとも
独立した計算自体が複数あるのかによっても変わってくるかな。

前者なら、スレッドが計算して、2つのフォームがタイマーで
読んで表示?または、スレッドが2つのフォームにポストか?

後者なら、それぞれのフォームでスレッドを作ればいいかな。
やったことないから嘘かも知れないけど。
936デフォルトの名無しさん:2008/03/17(月) 20:56:07
>>930
VB.NETやC#よりも、VC++の方が高度な最適化がかかる。
C++とC#のコンパイラの最適化レベルの違い紹介してた記事があったと思うが
ちょっと見つからないな。
937デフォルトの名無しさん:2008/03/17(月) 21:18:53
>>936
トン。知らなかったよ。
938デフォルトの名無しさん:2008/03/17(月) 21:44:52
C# 4.0 からは P/Invoke なしで Win32API が使えるようになるそうです。
939デフォルトの名無しさん:2008/03/17(月) 22:05:45
あれ?C#にinclude指令と限定Cパーザを足し込む案はボツになって、
System.Win32.[DLLNAME]が追加されたはz(ry
940デフォルトの名無しさん:2008/03/17(月) 22:15:51
938を見てDynamic dispatchが思い浮かんだ。
941デフォルトの名無しさん:2008/03/18(火) 14:37:39
>>933 >>935 THX
まだ試してませんが、早速 Show しまくってから
Run でイベントループをまわそうと思います。

>>935
計算結果はSTLのコンテナに次々と保持されていて、
そいつをいろんな切り口で見せるパネルを同時に
いくつも開いておきたいです。
942デフォルトの名無しさん:2008/03/18(火) 14:59:08

クソアメリカへ輸出の日本車に糞付けてやった

クソアメリカのクソ野郎には糞がサイコーだ

世界貿易センタービルから飛び降りて死ね

地面にブチ当たって死ねクソ野郎

クソアメリカの日本車は糞糞糞だらけ〜〜〜

クソアメリカの日本車は糞糞糞だらけ〜〜〜

クソアメリカの日本車は糞糞糞だらけ〜〜〜
943デフォルトの名無しさん:2008/03/18(火) 14:59:56

クソアメリカへ輸出の日本車に糞付けてやった

クソアメリカのクソ野郎には糞がサイコーだ

世界貿易センタービルから飛び降りて死ね

地面にブチ当たって死ねクソ野郎

クソアメリカの日本車は糞糞糞だらけ〜〜〜

クソアメリカの日本車は糞糞糞だらけ〜〜〜

クソアメリカの日本車は糞糞糞だらけ〜〜〜
944デフォルトの名無しさん:2008/03/18(火) 15:00:15

クソアメリカへ輸出の日本車に糞付けてやった

クソアメリカのクソ野郎には糞がサイコーだ

世界貿易センタービルから飛び降りて死ね

地面にブチ当たって死ねクソ野郎

クソアメリカの日本車は糞糞糞だらけ〜〜〜

クソアメリカの日本車は糞糞糞だらけ〜〜〜

クソアメリカの日本車は糞糞糞だらけ〜〜〜
945デフォルトの名無しさん:2008/03/18(火) 15:02:18
>>936
C#は標準でP/Invokeの呼び出しのたびにセキュリティチェックがかかるようになっている。
一方C++/CLIはデフォルトではチェックは発生しない。
C++/CLIで/CLRUNMANAGEDCODECHECKリンクオプションでC#と同等になる。
C#の方はSuppressUnmanagedCodeSecurity属性でチェックを無効に出来る。
双方の条件を合わせるとパフォーマンスの差はない。
946デフォルトの名無しさん:2008/03/18(火) 19:00:12
クラスに型と同名のプロパティーが在った場合、
その型を名前空間なしで使うとあいまいエラーがでるのね。
C#だと大丈夫なのに。
947デフォルトの名無しさん:2008/03/18(火) 22:24:57
それはそれは
948デフォルトの名無しさん:2008/03/19(水) 00:22:21
そんなもの作るなよ
949デフォルトの名無しさん:2008/03/19(水) 01:10:32
http://dobon.net/vb/dotnet/beginner/namingrules.html
プロパティには、その型と同じ名前をつけることができる。例えば、CacheLevel という名前の列挙型がある場合、その値を返すプロパティにも CacheLevel という名前を付けることができる。
950デフォルトの名無しさん:2008/03/19(水) 05:05:26
コンストラクタとも被るな
951デフォルトの名無しさん:2008/03/19(水) 07:57:12
>>949
そりゃ名前つけるのは自由でしょ
C++/CLIの場合は型名よりメンバ名が優先されるから不便なだけで
952デフォルトの名無しさん:2008/03/19(水) 10:17:32
.NETのクラスライブラリに普通にたくさんあるだろ型名と同じ名前のプロパティなんて
953デフォルトの名無しさん:2008/03/19(水) 10:36:50
それなんてアンチパターン?
954デフォルトの名無しさん:2008/03/19(水) 10:44:43
C#だとVSで型名が色分け表示されてるからわかりにくくはならない
955デフォルトの名無しさん:2008/03/19(水) 10:47:01
色分けしないと分からないソースコードw
956デフォルトの名無しさん:2008/03/19(水) 10:54:19
http://msdn2.microsoft.com/ja-jp/library/ms229012(VS.80).aspx
>プロパティには、その型と同じ名前を付けるようにしてください。
>列挙型に厳密に型指定されたプロパティを使用する場合は、
>プロパティの名前を列挙型の名前と同じにできます。
>たとえば、CacheLevel という名前の列挙型がある場合は、
>その値のいずれかを返すプロパティにも CacheLevel という名前を付けることができます。

こういう衝撃的なガイドラインがあるんだ
957デフォルトの名無しさん:2008/03/19(水) 10:56:13
それ、何て、要Option Explicit?
958デフォルトの名無しさん:2008/03/19(水) 13:12:03
文盲現る。
959デフォルトの名無しさん:2008/03/19(水) 13:24:55
C丼ダサダサ
960デフォルトの名無しさん:2008/03/19(水) 17:34:32
例えばフォーム等で Size を返すプロパティが Size なのはとても自然だと思うが。
961デフォルトの名無しさん:2008/03/19(水) 18:56:59
using System::Drawing;

ref class Hoge
{
public: property Size Size;
private: Size m_size; ←えらー
}

Sizeとだけ書くと全部Hoge::Size扱いになるよね。
962デフォルトの名無しさん:2008/03/19(水) 19:05:30
System::Drawing::Sizeと書けばよい
963デフォルトの名無しさん:2008/03/19(水) 19:15:16
俺はnamespace dr = System::Drawing;派。
C++でusingディレクティブは使うなって言われるけど、
C++/CLIだと使えないということをよく実感する。
964デフォルトの名無しさん:2008/03/20(木) 19:29:00
System::Collections::Generics::List<clr::autohandle<Apple>> apples;
で要素を削除しても、~Apple()は呼ばれないみたいです。
どうしますか?
965デフォルトの名無しさん:2008/03/20(木) 19:43:07
ファイナライザ書いたら?
966デフォルトの名無しさん:2008/03/20(木) 19:50:11
リストに入ってるうちに殺れば?
967デフォルトの名無しさん:2008/03/20(木) 20:21:52
Javaやってるとnewしたまんまほったらかしにするのは
道具をしまったりゴミをゴミ箱にまとめるのをサボってるようで
あまりいい気がしない。
968デフォルトの名無しさん:2008/03/20(木) 21:00:32
>>964
何で削除されないかと言えば、Listで要素を削除しても
Listは削除した要素のデストラクタを呼ぶわけではないから。
969デフォルトの名無しさん:2008/03/21(金) 02:32:09
>964
auto_handle による解放タイミングが GC での回収時なんじゃね?
970デフォルトの名無しさん:2008/03/21(金) 08:55:53
>>964
auto_handleがdeleteされないからAppleもdeleteされない。
971デフォルトの名無しさん:2008/03/21(金) 16:44:31
デストラクタやファイナライザはどうしても必要な場合でなければ書いてはいけない
特にファイナライザ
972デフォルトの名無しさん:2008/03/21(金) 17:06:32
ゲームとかヤバイ
973デフォルトの名無しさん:2008/03/23(日) 05:57:34
この言語って機能が多すぎて大人数でプログラム組むの大変じゃない?
974デフォルトの名無しさん:2008/03/23(日) 08:58:40
機能をアセンブリ化で分類して適切なスキルの人間に適切な言語で触らせればいい
問題になった場合、それができていないと言うこと
スキルがなければ、VB や C# で書けばいい。なにもかも、C++/CLI のみでやる必要はない
975デフォルトの名無しさん:2008/03/23(日) 10:13:59
CとC#の橋渡し以外は使う必要ないだろ
976デフォルトの名無しさん:2008/03/23(日) 10:38:33
o 取り込みたいネイティブライブラリがDLLでのエクスポートを考慮してくれていない
o 取り込みたいネイティブライブラリがクラスライブラリ
o C#で書こうとするとP/Invokeのための宣言や型定義がめんどくさそうな状況
o パフォーマンス上の理由でマーシャラの仕事が邪魔

こんな時に仕方なく使う言語ってところだな。
逆に言うと「こんな時」が多すぎて無いと困るんだけどさ。
.NETのネイティブとのダイレクトっぷりはJavaに対する優位性のひとつだと思うんだけど、
あんまりその文脈では語られないよなぁ。
むこうはそのために発生した複雑性が欠点と思ってるからかしら。
977デフォルトの名無しさん:2008/03/23(日) 10:56:06
ネイティブを全く考えないで良い状態が理想郷だからな
978デフォルトの名無しさん:2008/03/23(日) 11:25:20
/clr:pure
979デフォルトの名無しさん:2008/03/23(日) 12:18:59
中身を書かない property で set だけ protected: に出来ますか?
980デフォルトの名無しさん:2008/03/23(日) 12:22:28
できるよ
981デフォルトの名無しさん:2008/03/23(日) 12:47:37
むり
982デフォルトの名無しさん:2008/03/23(日) 13:20:49
中身書かないトリビアル・プロパティはアクセス指定書くところがないからな
983デフォルトの名無しさん:2008/03/23(日) 16:56:15
>>974
無駄に機能拡張しただけの印象を受ける
984デフォルトの名無しさん:2008/03/23(日) 17:07:07
>>983
具体的にどんなところが無駄だと思う?
達成目標がアクロバットすぎるので誰が作ってもこんなもんだと思ってるんだけど。
985デフォルトの名無しさん:2008/03/23(日) 17:44:35
一度Managed C++を経ているからずいぶん考えられていると思うが。
986デフォルトの名無しさん:2008/03/23(日) 19:38:42
STLのコンテナに入れたものは
削除した時点でつぶされますか?
987デフォルトの名無しさん:2008/03/23(日) 19:40:28
std::vector<T> v; として、
要素を削除した際、T のデストラクタは呼ばれる。

T がポインタで、そこに new したアドレスを入れているような場合、
それは delete されない。
その目的には boost::ptr_vector が使える。
988デフォルトの名無しさん:2008/03/23(日) 20:06:28
( ・∀・)つ〃∩ ヘェーヘェーヘェーヘェーヘェー~
989デフォルトの名無しさん:2008/03/23(日) 20:34:50
^付けないと入れられなかったorz
990デフォルトの名無しさん:2008/03/24(月) 01:51:39
いや、^ つけても、STLコンテナにマネージド・オブジェクト入れちゃ駄目だろ
そのための STL/CLR じゃまいか
991デフォルトの名無しさん:2008/03/24(月) 16:52:42
勝手に作られる関数
インデントおかしい。
インデント設定、もしくは、インデントをきれいにする方法ってありあすか?
992デフォルトの名無しさん:2008/03/24(月) 17:10:41
C++エディタにはそういうの一切無いよ。
たしかにC++/CLIのフォームデザイナの吐くコードは
ケンカ売ってるとしか思えないw
993デフォルトの名無しさん:2008/03/24(月) 18:30:08
コレクションの中身を自動変数風にすることは出来ないの?
994デフォルトの名無しさん
value class Hoge;
List<Hoge> hoges;