今勉強しるのですが、これ無くならないですよね?
そんな心配がいるほど勉強に時間かかるようなもんかね?
>>581 ドトネトのことを全く知らないと混乱するかも。
あと、古い情報(Managed C++)を見てしまって
混乱していた人がここに約一名。
ManagedDirectX2.0は消えた
584 :
デフォルトの名無しさん:2007/10/28(日) 22:39:07
MSのC++/CLIがC++委員会に却下されたが、そうすると
次世代WindowsからC#しかサポートしない、Windows
プログラミングやりたかったらVB.netやC#使え!
と嫌がらせしてくるんじゃないかと不安。
VBやC#が嫌いだから困る。
今はMFC使っているが、今後もMFCは
サポートされるのだろうか?
MFCが駄目ならC++/CLIを使うが、それも
サポートされないとなると。。。
現状は 0x の仕様策定待ちでしょ。だから、ライブラリ拡張しかしてないだけで
MFC のサポートが切れたら、WTLでも使えばいい
RADなくても大丈夫でしょ
委員会氏ね
587 :
デフォルトの名無しさん:2007/10/29(月) 11:13:27
>>585 こういう事いうからC++基地外は。。。
RADはあった方がいい。
RADは必須だが、MFCのビルダーはカンベン。
589 :
デフォルトの名無しさん:2007/10/29(月) 14:17:53
MFCのビルダーって何?
RAD で具体的には何を指してるの?
C++/CLI のデザイナのこと?
ま、一般的にはソースと連携するGUIエディタ。
コードジェネレータ以降のもの。
じゃ,コードオナペット機能とかも?
MFCのどこがRODなんだよ
594 :
デフォルトの名無しさん:2007/10/29(月) 22:51:30
RODって何だよ
ヤンキースの選手だよ
THE PAPER
いや、だからVisual C++/MFCはRADを目指してるように見せかけてた。
しかし、C++のRADができあがると開発者がオプソに流れちゃう。
>>597 それが C++/CLI + フォームデザイナではないのか?
あくまでネイティブにこだわる?
>あくまでネイティブにこだわる?
これは詭弁。
実体は、M$が非ネイティブにこだわる。
gccですんなりコンパイルできちゃったらWinが単なる開発マシンで、
ターゲットマシンが別0$になっちゃう。
C# で mono とか tcl/tk とか何かならわかるが、
pure C++ で Win32 アプリがRADで開発できても、
>gccですんなりコンパイルできちゃったらWinが単なる開発マシンで、
>ターゲットマシンが別0$になっちゃう。
ってことにはならないと思うが。
>ってことにはならないと思うが。
ってことにはならない、じゃなくて、M$が阻止する。
売る側からしたら端末みたく膨大な数を売るものだったら1台あたりに0$代払いたくない。
開発マシンとターゲットマシンと別々なのはふつー。
Winの前の時代なら、UNIXで開発&Makeして汎用機(メインフレム)に転送していた。
>UNIXで開発&Makeして汎用機に転送していた。
あ、やっぱ、コンパイルは汎用機でやってたね。
>>601 そういう意味じゃなくてさ、MS の作る Win32 アプリの RAD の出してきたコードを
gccでコンパイルしても、実行できる環境が Linux にある?
Wine がそんなに実用的になってる?
>>603 Windowsヘッダーがgcc環境に移植されてM$が慌てたのを知らないの?
RADなら製品としては成立しなくて終了したっぽいけど、Delphi / Kylix、 C++ Builder / C++ Builder Linux があるお。
>>603 あ、C++ BuilderにwxWidgetsのプラグインがあってポトペタできる。
wxWidgetsだからLinuxとMacは対応できる。
>>605 MS がクロスプラットフォームな UI フレームワークを採用した RAD を
出すわけないと思うけど。pure C++ になったとしても、Win32 べったりでそ。
次はそれに文句言うの?
それとも Wine があるから
>gccですんなりコンパイルできちゃったらWinが単なる開発マシンで、
>ターゲットマシンが別0$になっちゃう。
だ、って主張?
>>604 漏れも cygwin は使ってるけど、そういうおまいは使ってるのか?
きつい言葉だが、現実見えてる?
おおい、C++/CLI スレなんだかから、
RAD にかんしては mono で Windows.Form
が使えるかどうかってのがメインの話題にならんの?
そういう俺は Hello world しか試したことがないよ。
mono では。
mono=Hello worldツール
RHD = Rapid "Hello world" Development
RAD = RApid "Hello world" Development
CLI = Common "Hello World" Language Infrastructure
HAL = HALlo world is typo.
V$ドトネトは、ドトネト Framework の機能を最大限に利用することによって、Hello worldの生産性を劇的に向上させます。
質問です。
int sample(int (* func)(void*), void* arg);
というCの関数を呼び出したいのですが、argにマネージオブジェクトを引き渡す手段に悩んでいます。
struct Arg { gcroot<array<int>^> obj; };
と
int on_callback(void* arg) {
Arg* parg = (Arg*)arg;
Console::WriteLine(part->obj->Length);
}
を用意して
Arg arg;
arg.obj = gcnew array<int>(4);
sample(on_callback, &arg);
みたいな方法を考え付いて一見問題なく動いているように見えますが、何か問題があったりもっと一般的な方法があったりするんでしょうか。
ていうかon_callbackはなぜ#pragma unmanagedじゃなくても動くんだろう?
>>615 その方法でいいと思うよ。
>ていうかon_callbackはなぜ#pragma unmanagedじゃなくても動くんだろう?
その為の混合モードだから。関数はマネージドとネイティブの両方のエントリーを持っている。
#pragma unmanagedを使うのは DllMainとlongjmpのときくらいじゃなったかな。
>>616 ありがとうございます。
これで実装を進めることにします。
IntPtrで与えられたポインタをマネージ型のByte配列に変換したいのですが、できるのでしょうか?
アンマネージへの変換はMSDNの参照などによりわかったのですが、
マネージへはまだわかっておりません。
アンマネージに変換して使用して配列を扱ってもいいのですが、なるべくマネージ型でまとめたいと思いまして・・・
そもそも無理だとしたらIntPtrのReadByteを使うしかありませんか?
どなたかご教授ください。
それへ知ってハッキングでもする気か?
ポインタにするにはちょっとGCさえごまかせば済む話だが、
配列はオブジェクトなので新しく作る必要がある。
C++/CLI使っててポインタを使わない意味はないだろ。
何やりたいかわからんが、Marshal::Copy とかか?
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」
―――――――――――――‐┬┘
|
____.____ |
| | | |
| | ∧_∧ | |
| |( ´∀`)つ ミ |
| |/ ⊃ ノ | |
 ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄ | ミ C++/CLI
懐かしすぎるぞそのAAw
配列が三つもあるとかあほすぎ
618への回答にinterior_ptrっていいだろうかw?
マネージ型には違いないぞ。
たぶん、IntPtr に格納されたアドレス値をバイト配列に変換したい訳じゃないとは思うんだが(w
628 :
デフォルトの名無しさん:2007/11/01(木) 09:58:54
c++/cliを使うメリットってなんすか?
C++に中間吐かせるなんて、ビャーネが知ったら泣くぞ
C++ を越えた変態になれる
ま、C++と文法的に相性が悪かったCOMの悪夢の続きを見れるとか。
.netライブラリを使える
ドトネトライブラリはイラネ
既存のC/C++ライブラリを使いたいわけ。
>>632 そういう人がなぜこのスレッドにいるのかわからん。
635 :
デフォルトの名無しさん:2007/11/01(木) 19:00:04
VB.netからとりあえず早さを求めてC++/CLIやり始めたんですが、
//Form1.h
#pragma unmanaged
class hogehoge{};
#pragma managed
Form1を作ったときに自動生成されたやつ
private: System::Void start(System::Object^ sender, System::EventArgs^ e) {
hogehoge test;
}
とやると動くのは分かったんですが、デザイナに
クラス Form1 はデザインできますが、ファイルの最初のクラスではありません。Visual Studio では、デザイナはファイルの最初のクラスを使用する必要があります。クラスがファイルの最初のクラスになるようにクラス コードを移動して、デザイナを再度読み込んでください。
と怒られてしまいます。
いい方法を教えてくださいmm
>>635 IDEが作成したファイルに手を加えるのはあまりよくない。
別のファイルに書こう。
637 :
デフォルトの名無しさん:2007/11/01(木) 19:11:14
>>635 ええ、絶対間違ってると思ってtest.cppってファイルを作って同じのを書いたのですが、
hogehoge という型指定子が見つかりませんと言われてしまうんです。
638 :
635:2007/11/01(木) 19:24:35
//test.cpp
class hogehoge{};
//Form1.h
>>635の#pragma managedより下
って書いてみたんですけど、ヘッダーがコンパイルされたときには
test.cppはまだコンパイルされてないからこういう事になってるんですかね・・・?
だな。
642 :
635:2007/11/01(木) 19:41:44
ヘッダと cpp の関係がわかってないのかな?
Form.h が メインの cpp に include されてコンパイルされる前に、hogehoge なるクラスが
定義されていないといけないんだよ
だから、hogehoge をヘッダに定義して、Form1.h で include すればいいんだけど
この説明の意味、わかる?
次はたぶん、混合型はサポートされていません。て、エラーになると予言(w
644 :
635:2007/11/01(木) 20:28:37
>>643 ヘッダーを作らないといけないのを全く理解してませんでした。
IDEでクラスを作って見よう見まねでいじったらうまく行きました^^
丁寧にありがとうございましたmm
まぁ、別に cpp を include してもいいんだけどな
いやいや、リンクしたときに定義が衝突するでしょ
648 :
デフォルトの名無しさん:2007/11/03(土) 09:36:00
C++/CLIって、仕事あるか?
CLI穴だらけじゃん(`Д')ノ
じゃあみんなで補完しあおうぜ(=゚ω゚)ノ
議論盛り上がりまくり(゚д゚)ウマー
ドトネト対応(・∀・)イイ!
ってのが製作者の狙いということか( ゚Д゚)ハッ
いや…なん違うような(;´Д`)
なすてnullptrなんて作たんだろ、nullで統一してよ
ぬるぽ
>>653 > なすてnullptrなんて作たんだろ、nullで統一してよ
'\0' と混同する人がいないとも限らないからかな…
#define null 0としているプログラムは探せば結構ありそうに思う。
そんなコードでも変更なしに使えるようにという配慮では?
え C++/CLIはヘッダーに全部実装するのが流儀だろ
cppファイルなんていらんのですよ
実体化しないのかよ
まさか、プリコンパイルヘッダに全部うわなんだおまえやめr
>>649 このあいだ、基本は.NETライブラリで、ネイティブ用のI/Fも欲しいって仕事があって
何を使っても良かったし、ずっと自分が面倒みる事になる事は分ってたから
C++/CLI のラッパーで対応したが。
レアケースなのは間違いないな。
>基本は.NETライブラリで、ネイティブ用のI/Fも欲しいって
これ、何ていうドトネトアプリの破滅。
661 :
デフォルトの名無しさん:2007/11/11(日) 16:39:40
>>え C++/CLIはヘッダーに全部実装するのが流儀だろ
あ、やはりそうなのか?
こより的には、そのやり方はちょっと…
C#でいう「インターフェイス メンバの明示的実装」をやるにはどうすればいいの?
自己解決
private: virtual Object^ Clone() = ICloneable::Clone { ... }
CLI 部分については C++/CLI って C# よりむしろ VB に近いと思う瞬間の一つだな
raise とか
>raise とか
これ、何てDelphi?
2008入れてみた。
STL/CLI使えるぽ。
.net fx 2.0 指定でも使える?
この言語って、どの程度流行ってんの?
各国で静かなブームですよ
TreeViewとListViewにxVN_GETDISPINFO相当の機能がなかったので、
Controlから派生させて自作したよ('A`)
(VirtualModeもパフォーマンスがよくなかった・・・)
C#だとAPIや定数の定義が面倒だが、C++/CLIだとWin32ヘッダそのままインクルードして使えるから楽でいい。
だがそんなことするくらいなら最初っから
つMFC
・・・そんな感じだ。
メッセージぐらいならわざわざControl使わんでもどうとでもなるが。
Notify系メッセージならWM_REFLECTION付きで当該コントロールに来るし。
いやWTL最強
>>673 メッセージぐらいではどうにもならんのですよ。
WM_NOTIFY + WM_REFLECTでメッセージ引っ掛けても、先が続かん
676 :
デフォルトの名無しさん:2007/11/27(火) 18:43:18
Windowsプログラムを組む必要がない場合
CLIを勉強する意味ある?
Windows以外で動く独自のCLIを開発する場合とか。
( ゚д゚ )( ゚д゚ )( ゚д゚ )…
独自にCLRを実装するなら、CLI の勉強は必要だな
C++/CLI は不要だが
Object型の変数の値が、値型Tのボクシングされたオブジェクトであるかどうかを
調べるにはどうすればいいんでしょうか
C#では obj is T とするところです
参照型同様dynamic_cast<T^>(obj)がnullptrになるか否かで判定すればいい。
safe_cast ?
castに失敗した時に、例外が発生したほうがいいならsafe_cast。
nullptrを返してほしいなら、dynamic_cast。
if分の条件でスマートに使いたいなら、T::typeid->IsSubclassOf(obj)もしくはIsInstanceOfType()の組み合わせで。
public ref class A : public Generic::IEnumerable<Object^>
{
public:
virtual Generic::IEnumerator<Object^>^ GetEnumerator();
};
コンパイルエラーになるのだが、こういう実装はだめなの?
エラーメッセージぐらい書(ry
System::Collections::IEnumerable::GetEnumeratorの方の宣言がない
>>685 public ref class A : Generic::IEnumerable<Object^>
{
public:
virtual Generic::IEnumerator<Object^>^ GetEnumerator();
virtual Collections::IEnumerator^ GetEnumerator();
};
してみたけど、だめでした。
error C2556: 'System::Collections::IEnumerator ^A::GetEnumerator(void)' : overloaded function differs only by return type from 'System::Collections::Generic::IEnumerator<T> ^A::GetEnumerator(void)'
with
[
T=System::Object ^
]
そりゃ返値が違うだけの同名同引数メソッドを宣言できるわけないだろ?
別名定義する必要がある。リファレンスのinterface classの解説見れ
>>687 以下でコンパイル通りました。
public ref class A : Generic::IEnumerable<Object^>
{
public:
virtual Generic::IEnumerator<Object^>^ GetEnumerator() = Generic::IEnumerable<Object^>::GetEnumerator;
virtual Collections::IEnumerator^ GetEnumerator2() = Collections::IEnumerable::GetEnumerator;
};
ありがとうございました。
GetEnumerator2のほうはprivateにしたほうが
>>689 早速private: + sealedにしました。
重ね重ねありがとう
マネージクラスも共変できたらいいのにと思う。
共変ができないのはなんでだろう
CLI 上の制約?
>>691 Genericsは共変/反変をサポートしてるけど
標準クラスライブラリと有名どころの言語がサポートしていないので事実上死に設定
たしかデリゲートもIL上は共変・反変できたような。
C#はデリゲートなら共変反変おk
696 :
デフォルトの名無しさん:2007/12/08(土) 17:56:12
(C/C++スレから誘導されて来ました)
VS2005にてC++/CLI使用中です。
Hoge()というアンマネージドクラスが既にあり、これをマネージ環境で使うことを考えています。
このとき、
Hoge *hoge0 = new Hoge();
Hoge *hoge1 = new Hoge();
Hoge *hoge2 = new Hoge();
・・・
というのを
Hoge *hoge[10];
hoge[0] = new Hoge();
hoge[1] = new Hoge();
hoge[2] = new Hoge();
・・・
のよう配列にするにはどうしたらよいでしょう?
(マネージ環境だと Hoge *hoge[10]; の時点でCLI配列使え!って怒られてしまうんですよね・・・)
普通にできるはずだが?
エラーメッセージとか番号とかちゃんと書けよ
698 :
デフォルトの名無しさん:2007/12/08(土) 18:21:12
C++/CLIでSTLって使えないんですかね。。。
アンマネージ内で使いたいんですが、#include<list>とか<vector>とかすると
error C2039: 'free' : '`global namespace'' のメンバではありません。 e:\program files\microsoft visual studio 8\vc\include\cstdlib
error C3861: 'free': 識別子が見つかりませんでした e:\program files\microsoft visual studio 8\vc\include\malloc.h
とエラーが出ます。。。
699 :
696:2007/12/08(土) 18:25:37
>>697 アンマネージクラスだと普通にできますが、マネージ環境だと
Hoge *hoge[10]; のところで
「error C4368: hoge' をマネージ 'test01:managedClass01' のメンバとして定義できません。混合型はサポートされていません」
といったエラーになります。
このエラーでググると「マネージ環境なんだからarray<>使うべし」といった見つかるのですが、
例文はintの配列とかそんなんばっかりで、今回のような場合はどうすりゃいいのか・・・といった感じです。
よろしくお願いいたします。
>>698 普通に使えるが?
ファイルぶっ壊れてるんじゃね?
702 :
デフォルトの名無しさん:2007/12/08(土) 21:20:59
>>701 まじですか。。。
再インストールしてみます、ありがとですω
>
>>701 再インストールしたところ思いっきり動きました。
5時間悩んでたのが馬鹿らしい。。。
ありがとでした。
>>699 やりたいことと少し違うかも知れんが、
new N[10]で10個のオブジェクトの生成は済んでるから注意な。
class N { }; // native class
ref class M { // managed class
N *n;
public:
M() { n = new N[10]; }
~M() { delete [] n; }
!M() { delete [] n; }
};
array<IntPtr>^ _ptrs = gcnew array<IntPtr>(10);
_ptrs[0] = IntPtr( new Hoge() );
・・・
でよくね?
Conditional属性は使えないの?
諦めてマクロにするしかない?
>>1 は?お前バカか?
.NET開発のデファクトスタンダードはC#だろ。常識的に考えて
いまさら時代遅れのC++なんて勉強する気しねーよ。
俺はJavaから始めたからよ。
で、ホントはC#よりC++/CLIのほうが未来ありそうなん?
>>707 C++ と C++/CLI の区別が出来ない人は
他の人を馬鹿呼ばわりする資格はありません
C++/CLIはC++にどっぷり漬かった俺にはなんか納得できないものがある。
全然チェックしてないけど.NET3.5で言語に手は加わってんの?
マーシャリングライブラリが付くって話は聞いたことがあるけど あとSTLと
この辺は言語そのものじゃないしな
>>710 C++ がすでに何でもありなところを、さらに C++/CLI でなんでもありになってるので好感もてない?ポインタがふたとおりあるとか。
ポインタじゃないよトラッキングハンドルだよ
C++ のネイティブ・クラスをマネージドに委託できると嬉しいんだよな
普通にクラス作って gcnew したらマネージドになってくれるような機能
715 :
デフォルトの名無しさん:2007/12/16(日) 10:15:37
BCCで使えるの?
gcc-cil はどうなったん?
717 :
デフォルトの名無しさん:2007/12/18(火) 01:30:20
なあ、Windowsアプリ作るならC#のほうが楽じゃね?
C++にマネージコードが混ざるとうっとおしい。
つ C++ Builder
おまえらがC#に移行しない理由は何?
いつまで待ってもドトネトが必要とされない。
Managed DirectX が消滅した
というか C++/CLI と C# は使う場所がちがうだろ、常識的に考えて ...
( <●><●>) C丼だけで全部を作れないということは分かってます
(U )つ
u u
C#でC++よりも効率のいいデバイスドライバーって作れるの?
ここC++/CLIスレなんだけど
C#は.NETを必要とする代わりに便利な環境を提供するものだけど
C++/CLIはどうしても.NETが必要な人のためのものだからな
727 :
デフォルトの名無しさん:2007/12/19(水) 01:40:55
.NETが必要なこと自体に遭遇したことがない
リッチなGUIを簡単に作れるのは魅力的なんだが
.NETは美しいんだよ。
APIのドキュメントと長時間睨めっこしなくて済む
それなんてDelphi/VCL?
某は見苦しさを極めてるからなw
>>724 そもそもC#で作ったデバイスドライバなんてあるの?
733 :
デフォルトの名無しさん:2007/12/26(水) 00:46:25
マネージド、アンマネージドのクラスや配列の解放について質問があります。
なるべく使い終わったクラスを即時メモリ解放したくて、
delete しているのですが、タスクマネージャで確認しても、解放しているようには見えません。
マネージもアンマネージも、deleteしたタイミングでメモリ解放されるのでしょうか?
それとも、マネージはGCに頼るしかなく、アンマネージはdeleteのあるタイミングでメモリ解放されるのでしょうか?
アンマネージドでも確保したメモリをプールして使いまわしてるだけだから、
deleteしたからといって、即座にメモリがOSに返還されるわけではないよ。
735 :
デフォルトの名無しさん:2007/12/26(水) 09:49:21
既定の new や malloc から先はどうやってるのか
追いかけたことないけど,「必要なら持っていっても
いいよ」っていうマークでもつけておいて必要に応じて
OS が回収できるようにしているのかな?
newやmallocはHeap系APIに丸投げでねーの?
737 :
デフォルトの名無しさん:2007/12/26(水) 12:43:27
>>736 ん?システムコールに丸投げ?
もっと,こう,自前でヒープを管理していると思うんだけど.
>>737 ちょいと階層は深いけど最終的にはそうなってるようだね>VC2005で確認。
そうなると500KB以上は個別にVirtualAlloc/VirtualFreeで、
小さいのは一元管理で縮小せずに再利用だろう。
もしかしてLINKオプションの/HEAPオプションは使われてないかも?
>>737 Win32APIはシステムコールではないよ。
Windowsのシステムコールは非公開でげすよ。
741 :
デフォルトの名無しさん:2007/12/26(水) 21:10:12
>>739 Windows においてはシステムコールはサブシステムの裏に隠れて
いて直接呼び出すことはできないってこと?
Win32 API って POSIX レイヤと同じレイヤ?
基本的に同じ。ただ、GDI関係は性能の都合でWin32 APIはカーネルのほうまで突っ込んでいたはず。
これをシステムコールというのかはわからないけど、
そういうサブシステムの下に位置するネイティブAPIと呼ばれるがNTDLL.DLLから公開されている。
9xの場合はVxDをDeviceIOControlで呼び出すことがシステムコールに相当するといっていいと思う。
ファイナライザって要らない子?
Disposeし忘れたときに必要
745 :
デフォルトの名無しさん:2007/12/31(月) 00:50:26
C++/CLIくだすれって消えてる?あるならそちらに誘導してもらえれば嬉しいです(’・ω・)
おとなしくC#いけって話かなぁ。。。
ttp://homepage3.nifty.com/ishidate/vcpp05_6/vcpp05_6.htm ここを参考にしながらForm1_Paintが呼ばれたときに
DrawlineとかDrawRectangleで描画するプログラム書いてるんですが、
その処理がとても重いので(他の理由もあるのですが)ボタンを押されたときだけ画面を更新するようにしたいんですが、どうしたら良いでしょうか。
(Form1_Paintだとウィンドウの移動などでも更新されてしまうので、それを避けたいということです。)
button1ってボタン作って、button1_Clickに全部書きゃ良いじゃんとか思ったんですが、
引数が(System::Object^ sender, System::EventArgs^ e)なのでe->Graphicsを使えなくて困ってます。
メンバにBitmapとか描画バッファを用意して
button1_Clickで描画、PaintでBitBltが妥当じゃね?
>>745 Form.CreateGraphicsは?
.NET使うならC#は読み書きできるようになった方がいろいろ便利だよ
あけおめです。
>>746-747 レスありがとうございます。
まず
>>747のようにbutton1_Clickに
Graphic^ g=CreateGraphics();
としてボタンでの描画は成功したんですが、今度はForm1_Paintが呼ばれたときに描画されたものが消えてしまったので
>>746の方法をとろうとしたんですが、ドキュメント見たりググったりしてもいまいち描画バッファ→画面のBitBltのやり方が
分からなかったので、
http://www.atmarkit.co.jp/fdotnet/dotnettips/458picboxdraw/picboxdraw.html を見ながらpictureBox1を作って、
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Graphics^ g = Graphics::FromImage(pictureBox1->Image);
drawRandomWalk(g);
pictureBox1->Refresh();
}
こんな感じで解決しました。結果的には
>>746の方法に近い?解決策となりました。
C#も勉強してみます(’・ω・)
ありがとうございました。
make_publicの使い方に詳しい方いますか?
ReleaseでDLLをBuildするとリンクエラーが発生します。
>libtest.obj : error LNK2022: metadata operation failed (80131195) : カスタム属性が適合しません: (0x0c00021b)。
>Stdafx.obj : error LNK2022: metadata operation failed (80131195) : カスタム属性が適合しません: (0x0c000261)。
Debugでビルドするとエラーが発生しません。
make_publicはStdafx.h(PreCompileヘッダ)に記述しているのですが、
どう対処すればよいのでしょうか?
ガベージコレクションが走るスレッドっていうのは、どのスレッドかは確定してないんですよね?
ということは、ガベージコレクションが走る際に呼び出すアンマネージリソースの処理は
スレッドセーフにしておかなければならないということかな?
具体的には参照カウントオブジェクトのラッパーをC++/CLIで作って.NETで使おうとしてるんだけど
Release関数をスレッドセーフにしなきゃならんのかなと。
(Interlockedにすればいいだけの話なんで、それ自体はどうってことないのですが)
ファイナライザスレッドは独立したスレッドなのでどのみちスレッドセーフは必要だろう
ファイナライザ中でthisに属するオブジェクトも生存は保証されていないしね
本当に最後の手段なんだから、基本的にはGC任せにしない方がいいよ
値型メンバは確実に生存してるぜ? その値型が持つ参照型はともかく
>>751-752 ありがとうございます。
明示的にDisposeてことになると思うんですが、
そうなるとDisposeしなければならないインスタンスを持つクラスがデータ構造の奥深くにあると
どんどんDispose呼び出しが感染していって親クラスのとこまで行ってしまいますよね。
面倒くさいなぁと思いつつも、仕方が無いなぁとも感じてるんですが
やっぱりそんなもんですかね…
アンマネージリソースを取り扱う以上、これは仕方ねっス。
頭切り替えるしかねっス。
ちなみにアンマネージリソース絡みでSafeHandleてのもあるんスが、
これの経緯とか調べるとさらに頭痛のタネが増えるのでオススメっす。
756 :
デフォルトの名無しさん:2008/01/19(土) 09:08:52
C++/CLIのメソッド引数に%をつけることについて質問があります。
マネージ型の配列や構造体をメソッドに渡すとき、”^”をつけますが、 この渡し方で配列や構造体の”ポインタ”が渡されると思っていました。
”^”の引数があるメソッドを持ったクラスライブラリをVBで参照したら “ByVal”となっていました。
ここで質問ですが、”^”でなく”^%”としなければ配列や構造体が 値渡し(配列全体がCopy?)になるのでしょうか?%をつける、 という概念がC++/CLIで現れたため悩んでいます。
できるならば 配列や構造体は値渡しでなく、アドレス渡し、配列渡しをしたいのですが・・・
^は参照型 そのまま渡すと参照をコピー
%はC++の&、C#のref/outに当たる参照渡し
「参照型 参照渡し」で調べればいいよ
758 :
デフォルトの名無しさん:2008/01/19(土) 09:54:02
>>757 ありがとうございます。調べてみました。参照型の^引数はアドレスをコピー、参照型の^%渡しはアドレスを参照渡しする、ということですね。
ということは参照型の場合、どちらの方法で渡してもパフォーマンスに大きな影響はないということでしょうか。
参照型と参照渡しの違いを理解しないといけないのですね。
.NETで参照渡しはあんまり使わないよ
参照で渡すことが多いんだったら初めから参照型にする
TryParseとかあるじゃん
スレ立ったのが2006年とかC++/CLIは使われてないの?
今からやるならC#のがいいかね?
アンマネージC++もC#も使えるようになった上で、
もしも必要に迫られたときにやっと登場する言語だからね
俺は間違っても#なんか使わん。意地でCLI
シーナンバー
>>761 そりゃ今からやるならC#だな
それよりVB.NETがいいに決まってるけどw
少なくともC++/CLIなんて論外だ
まあ.NETやること自体が間違いかもしれないが・・・
なぜVBを推すのか
ref じゃないクラスで managed なクラスのイベント捕まえようとしてるのだけど
やり方がわからないので教えてください。
ref class hoge {
event EventHandler ^ev;
};
class hoge_wrapper {
hoge ^_hoge;
void OnHogeEv(System::Object ^o, System::EventArgs ^);
hoge_wrapper(hoge ^_hoge) {
this->_hoge = _hoge;
_hoge->ev += gcnew System::EventHandler (this, &hoge_wrapper::OnHogeEv);
}
};
こんなコードを書いているのだけど EventHandler のコンストラクターでC3364のコンパイルエラーがでて怒られます。
>767
そりゃ、混合型は駄目だろ
ネイティブはネイティブ、マネージドはマネージドで扱わないと
あ、hoge_wrapper::_hoge の型は
gcroot<hoge ^> _hoge;
って宣言してました。転記ミスです。
いや、そこもそうだけど、gcnew しているイベント・ハンドラにネイティブの
ポインタ this を渡してるだろ?
マネージドでイベントアダプタみたいな物を作ったら?
MAKE_DELIGATE っていうのを見つけて、試してみたら意図したとおりに動くみたいです。
中身を見てみたら 770 さんの言うとおりの動きなのかな?
とりあえず解決しましたー。ありがとです。
772 :
デフォルトの名無しさん:2008/02/06(水) 09:11:08
linq は C++/CLI では使えないんでしょうか?
LINQ のパフォーマンス(笑)
C++/CLI での価値を感じない(笑)
775 :
デフォルトの名無しさん:2008/02/06(水) 10:37:31
言語使用的に無理なのかな.
似たようなことがライブラリで実現できるように見えるが.
>775
ライブラリで似たようなことができるから、言語でのサポートは不要
これで 0x の auto とかが出てこれば、もう少し CLinq もすっきりと書ける
言語仕様に手を入れると、標準化団体が騒ぐし
778 :
デフォルトの名無しさん:2008/02/06(水) 10:59:38
>>776 >「OSは(アプリケーションやユーザーからは)完全に透明であるべきだ」
透明であるべきだ,ってどういう意味なんだろうね.
意識しなくていいものであるべきだってこと?
だったら,Linux ってその逆行ってない?
カーネルのマイナーバージョンが変わっただけでモジュール類
コンパイルし直さないと使えないデバイス続出だったり.
まさしくOS部分が一番の障壁になってるとおもうのだが.
自分でいじる分にはそれが楽しいけど.
779 :
デフォルトの名無しさん:2008/02/06(水) 11:00:50
たしかに,auto は楽しみだなぁ.
ラムダ式は boost のもいいけど
ちゃんと言語でサポートしてほしいよ.
>>777 Expression Treeサポートって今の言語機能でどうやるの?
>透明であるべきだ,ってどういう意味なんだろうね.
>意識しなくていいものであるべきだってこと?
上と下意味違ってるだろ。常考。
>780
何をどうやって書きたいのかを書いてもらいたいな
SQL的に書きたいだけのシンタックス・シュガーの導入が標準化団体に受け入れられる
とは思えない
OSのバージョンアップをいちいちお祭り騒ぎにして
ソフトやハードの売り込み合戦を仕込んで
煽ってんじゃねえよって意味なんじゃないの。
煽るだけならまだしも、ふれーむわーく(笑)ごっそり変えて、
>LINQ使えない
とかカンベン。
うん。
この調子なら、数年のうちに LISP が再発明されるな。
ま、コンパイル言語で eval しようという試みでもあるからなぁ
ExpressionはDynamicMethod&ILGeneratorの簡易版としても使えて面白いね
790 :
デフォルトの名無しさん:2008/02/11(月) 17:17:44
3連休なんてあっという間だな。
C++の場合は、boostでメタプログラミングするか、マネージドで拡張するか微妙なところが出るだろうな
LINQを見ていると明らかに boostにインスパイヤーされているとしか思えない所があるし
boostは、さらに、Haskellにインスパイヤーされていて、C#もLINQそれを意識しての拡張だしね。
違いは、静的にか決定できないか、動的な決定も可能にするか、実行速度的に高速か、コンパイル後にまで及ぶ高い汎用性を取るか……
しかし、C++の場合の一番の的は、templateワカンネー人間かもしれないがwww
792 :
デフォルトの名無しさん:2008/02/11(月) 20:20:30
C++0x/CLI は可能なのだろうか?
Haskellだけでなく、
関数型プログラミング言語全般の影響だと思うけどね。
ほかはだいたいそうだと思う。
>>792 右辺値追跡参照%%とかできたらすげぇって思うわ。
そのセマンティクスまではよその言語へ持って行けないだろうけど。
>右辺値追跡参照
何やら恐ろしげな用語だなと思ってググッてみたらC++/CLIの機能か
なんですかそれは、噛み砕いて解説してやってください、もうC++/CLIとかは全然追ってないので
今のC++ってギリギリ感が凄すぎなんですが、どうなんですかねー
ようするに追跡参照T%は、ただの参照と違ってGCのついでのメモリ移動にも対応した参照型。
だからgcnewしたオブジェクトやその部分オブジェクトも参照できる。
そのポインタ版は、内部ポインタinterior_ptr<T>やハンドルT^が相当すると言っていいと思う。
右辺値参照はC++0xのやつ。
右辺値参照の右辺値の意味はわかりずらいな
左辺にしない代わりに制約が減ったよ値にしてくれ
template <typename T> ref struct A
{
cli::array<T%>^ m;
};
ってやるとコンパイラが落ちるな
マジか!
ちょっと帰ってきたら試してみよう
2008EEは落ちないな
帰ってきたら?誰が?
コンパイラさんが
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>' の参照を確認してください
C++/CLIってどうなんですかね?
今仕事が谷間なんで新しい言語でも勉強してようかと思うんですけど
仕事とかで使われてます?
805 :
デフォルトの名無しさん:2008/02/16(土) 11:54:41
>>805 何いきなり否定してんだよ
>>804 仕事ではとりあえず見たこと無いな、ガベコレ?なにそれ状態だw。
C++/CLIは、やりすぎだと思うんだな、Dの様な言語を作っておいて、共存可能にした上で徐々にC++側をフェードアウトすべきだと俺は思った。
C++ユーザーはドトネトを無視、
ドトネト厨はC++を無視、
そんな状況を解決する策
となる筈だった。
>>807 無視してないだろ、たとえばLINQなどは思いっきりboostがやってきた事を意識しているのは明白だし。
やっぱり橋渡し専用言語に留まるのかなあ
>橋渡し専用言語
それ以上の用途は最初から想定してないでしょ。
言語宗教論争への配慮なんて意図は一切なかったと思うんだがなぁ。
STL/CRLは気の迷いだよたぶん。
実際のところ、C++のシンタクスを完全にマージしつつ(完全は言い過ぎか)、
.NETなセマンティクスを生成する偉業はもうちょっと評価されるべきかと。
もちろん構文が似てるからとC++/CLIから.NETに入ろうとしている人には
暴力に訴えてでも全力でC#をオススメするが。
C#って.NETの基礎言語みたいなもんだしな。
俺はそんなものにとっくに飽きてしまって
マクロと抽象インターフェースを通すようにして
C++|C++/CLIに一発で切り替えられるようにしてプログラムしてる。
いつでも.NETから逃げ出せるようにね。
>>806 つ C#
そんなことより、
C++をヘードアウトさせるなんてとんでもない!
C++/CLIでは、
PropertyGridは、
String以外に指定できんのですか?
Booleanとかintにしてもリードオンリーになる
ColorとかSizeとかenumなどもやりたいお
C++/CLI関係ないからMSDN嫁
MSDNの何処に書いてあるのかさっぱり。
Fontは、できました。
Colorは、できません。
意味不明><
816 :
813:2008/02/21(木) 03:13:02
MSDNライブラリ内を探すときには、
site:msdn2.microsoft.com付けてググるといいんだよ。
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コマンドはあるのでしょうか?
慌ててるのはわかるが、日本語でplz
そこまでタイトならアセンブリで組んだら?
1000個程度ならよほど繰り返し実行しなければ、そこまで真面目にアルゴリズムを
追求する必要があるほどの速度にならないと思うけど
ショートサーキットって、if 文の順番で先に判定外れが発生したら、それ以降は検証
しない奴? それなら、当たり前にそうなってるけど
821 :
デフォルトの名無しさん:2008/02/21(木) 22:01:31
日本語がおかしくてすいません・・・あせってまして。
ご返信ありがとうございます。
>そこまでタイトならアセンブリで組んだら?
>1000個程度ならよほど繰り返し実行しなければ、そこまで真面目にアルゴリズムを
>追求する必要があるほどの速度にならないと思うけど
そう聞くと少し安心します。ただ、検索する回数が100回くらいあります。
たいしたことないですかね?
>ショートサーキットって、if 文の順番で先に判定外れが発生したら、それ以降は検証
>しない奴? それなら、当たり前にそうなってるけど
はい。if(A || B)として、AがtrueでもBを評価することです。
MSDNを見ても書いてないから、ショートサーキットはないと思ってました。
何回も検索するんなら、std::mapとかに入れとけば?
変にアンマネージマネージ行ったり来たりする方が遅そう
>>823 同意
memcmpはやめたほうがいいな
データが静的なもので検索する回数が多いなら、ソートしちゃって
二分探索でもするのがいいと思うが。
ご返信、ありがとうございます。
memcmpはしない方がいいのですね・・・。マネージクラスのアンマネージ処理は遅くなるのですか。だったら16バイトの比較はxorを使う
ことが適当でしょうか。
変なことするとILの最適化の妨げになるから、素直に==で比較すべき。
829 :
デフォルトの名無しさん:2008/02/22(金) 05:40:43
>変なことするとILの最適化の妨げになるから、素直に==で比較すべき。
ありがとうございます。素直==で比較します。ただmemcmpを使わないならば、
自分で比較関数を使った方がいいのでしょうか?
16バイト比較なので8バイトずつ比較するというような・・・
そんなの実装なんかたいした手間でもないんだから自分でやって計測すれ
アンマネージ型
とわかってるなら
C++で関数作ればいいだけでは?
アンマネージにする意味が分からん。
union で char[16] を double 値2つに突っ込んで、== で比較してもいいわな
できるだけ行ったり来たりしなくて済むようにまとめてアンマネージの範囲でやればいいと思う
LOGFONT が欲しいんだけど、
void Font.ToLogFont (
Object^ logFont
)
の引数って何渡せばいいの?
Object ^o = gcnew o;
ToLogFont(o);
LOGFONT *lf ・・・?
ググると、自分で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);
マクロメディアFlashの
タイムラインみたいなウィンドウ作りたいけど
やっぱり自作しなきゃだめかな
なんか楽そうな方法ありませんか?
クラスライブラリを作ろうとしてます。
C#では///から始まるコメントを書くと、そのクラスライブラリを
参照する方のインテリセンスにコメントに書いた説明が表示されますが
C++/CLIで同様のことはできないのでしょうか?
確か、出た覚えがある
プロジェクトの設定からXMLドキュメントファイルの生成をonにしたらできるようになりました。
けどC#のように///を入力したら自動で整形してくれたり
タグの候補を出してくれたりはしないんですね。
CLIでは無理と認識している。
XML欲しいときは一生懸命書いてるよw
ちなみにC#のように楽には書けんよ。圧倒的にタイプ数が増える。
俺はCtrl+spaceキーを多用する癖がついてしまった・・・
あとShiftキーもかなり使う事になる。
C#使ってるとC++でインテリセンスが出ないときに不安になる
845 :
デフォルトの名無しさん:2008/02/29(金) 11:57:24
>>844 うむ,とりあえず ncb ファイルを削除してみたりとかね.
846 :
デフォルトの名無しさん:2008/02/29(金) 20:26:39
CLIの入門サイトってありますか?
MFCじゃ駄目なんですか?
他の言語は使えてC++/CLIは初めてなのか,
それともプログラミング自体初心者なのかどっち?
後者ならC++/CLIを選ぶのは間違い
使える言語はC/C++でOffice風のメニュがあるアプリ作りたいからCLIを始めたいのですが・・・・
C# の古い奴を勉強してから仕様書読んだ方が良くね?
C / C++ がわかる人には C# の文法は全然もんだいない
C++/CLI はモンスターだから ...
俺は意地になってCLI使ってる・・・。C#なんか糞喰らえだw
たまに羨ましく思うこともあるけど
ILで直接コーディングしてるつわものはいないのか
昔、スクリプトを造ろうとしてやったが、Hello,Worldで力尽きたな(w
ただアセンブリを取得したいのなら、C# を吐き出して、CodeDOM 使った方が楽だという
事実に絶望した
そこでDLRですよ
もはやC++/CLIとは無縁の世界だなw
>>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行修正して使ってます)
System::IO::MemoryStreamからアンマネージドなIStreamインターフェース
のポインタを取り出す事ってできるんですか?
ネイティブライブラリ関数の引数に渡したいのですが。
そもそも持ってないので
自前で実装すりゃいいんじゃね?
>>858 そうなんですか。
ComVisibleAttribute属性が付いてるからできるのかなと思ってました。
(ComVisibleAttributeの事はよく分からないけど)
SHCreateMemStreamでIStream作成なんてどう?
実験で
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の場合はどうするのでしょうか?
func(ref int a) -> func(int% a)
で駄目?
863 :
861: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 よく意味が分かりません
% は C++/CLI に置ける参照指定
それはわかってるのですが、呼び出し時にどう関係あるのでしょうか?
ん、cast で指定したらってことだけど?
ref に値型を渡すってことは boxing したいってことなんだよね?
castですか?
((void (Hoge::*)(int%))&Hoge::func)(a);
とやってもマネージ型はできないと言われました。
C#でのref引数ってのは、C++/CLIでのトラッキング参照(%)、C++での参照(&)の事だと思うのですが
boxingと関係あるのでしょうか?
関係ないよ。
ref class A {
public:
String^ str;
int* ptr;
};
A^ a = gcnew A();
マネージドなクラスのメンバを初期化しない場合どうなるか見てみたところ
a->str, s->ptrどちらもnullptrでした。
これはたまたまなのか、それとも仕様で決まっているのでしょうか?
871 :
869:2008/03/04(火) 20:30:38
あるクラスのインスタンスを一気に100個作るメソッドってない?
forでまわすの面倒
gcnew array<AruClass>(100)
↑は忘れて
AruClass a[100];
↑は忘れて
くだすれC++/CLI(初心者用)ってもう無い?
スレ検索して見つからないんなら無いんだろう
.NETのクラスライブラリの使い方に関する質問はC#スレで聞けばいいからなあ
言語仕様の話題だけなら2つもいらん
スタックじゃなくてgcnewで作成する場合はどうすれば・・・
スタックで作っ(たように見せかけ)て、リファレンスで保持するのはできなかったっけ?
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ってデバッガの逆アセンブルで見るとスタックに積まれた
普通のポインタにしか見えないんだけど、どういう仕組みなんだろう…
pin_ptr の方はおっけー。元々、pin_ptr で指されているポインタの先のオブジェクトは GC の
再配置の対象にしないという仕様だから
interior_ptr の方は実体はハンドルらしい
大切なのはGCでオブジェクトの再配置が発生したとき、追随できればいいわけだから普通の
ポインタに見えても不思議はないんじゃない? GCがアドレスを変更するんだろうし
885 :
883:2008/03/06(木) 23:20:18
pin_ptrが指してる先に再配置しないフラグとか付けてる様子無いんだけど
よく分からんが俺の知らない仕組みが働いてるんかな。
まあともかくthx
C++ のコンサバGCだかなんだかと同様に、スタックにあるポインタらしきものが
直接指してる先のものは再配置しないんじゃないの?
そうじゃないとJITコンパイラも効率いいコード吐けないだろうし。
ああなるほど
あなる
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 まではたどり着いたけどなんかちがう
Aを作ってる方の話?
それともAを使う側の話?
使う側ですー。
gcrootをnewしてそれをsetする。
不要になったら、そのgcrootのインスタンスをdeleteするか、
gcrootが中で使っている
System::Runtime::InteropServices::GCHandleを直接使うかというのでどう?
へっだーにusing namespace hoge;を書くと
取り込んだ先でも影響されます。どうしますか?
ヘッダで using しないのは常識。
ウィザードが作ったForm1.hもusingしてるよ。
ウィザードの吐くコードはうんこだから。
こんなもん使うなというメッセージなんだろう
どうしても長くて書きたくない名前空間があるなら別名作っとけ。
よーしマヂレスしちゃうよ
C++/CLIがうんこ
まあMSもあんまり使わせたくないんだろう
フォームのデザインなんてC++/CLI本来の用途から考えたら不要なんだから
class Takenoko
{
public:
Takenoko();
~Takenoko();
private:
Nazo m_nazo;
};
Nazoのコンストラクタが必ず引数をとる場合エラーがでます。
コンストラクタの中で冷害が起きるとデストラクタは呼ばれるの?
なわけねぇだろ
C#ではできるよ
>>901 ただのC++と同じでコンストラクタ初期化子書け。
C# はマネージド・オブジェクトがスコープ外れて GC に回収されてるだけだろ
そうじゃなきゃ、コンストラクタの try 構文なんていらねぇよ
using
>>905 渡すものがまだ出来ていない場合はどうすればいいの?
ref class Render
{
private:
PresentParameters pp;
Device m_device;
}
PresentParametersの本体が自動的に出来ていたとしても
初期化リストでm_device(pp)と渡す時点で中の値は意味をなさないでしょう?
Managed DirectXの話をそこでは出来ません。
最初からコード出せよ。ref もついていないクラスの話かと思ったぜ
それで何が問題なわけ?
Direct3D.Device 型って値型だっけ? マネージド型のスタック書きってただのシンタックス・シュガー
だから、メンバにするときはハンドルにしておくべきなんじゃね
んで、コンストラクタでPPの値セットしてから gcnew すりゃいいだろうに、何を手を抜いているんだか
解決しました。
914 :
デフォルトの名無しさん:2008/03/16(日) 19:59:02
C++のライブラリでSTLコンテナの内容が更新されるんですが
コレを刻一刻とデータグリッドに表示させようと思うと
タイマーで定期的に明示的に内容をコピーしまくるしか無いでしょうか?
なんかこうもっとスマートなやり方ってありますか?
もうちょっと話したいことを整理してくれ。
refなクラスはオートポインタ見たいのに入れられますか?
意味がない
要するにmanagedなのにデストラクタ走って欲しいんだろ
MS的に実体宣言でダメなら無理でFA
>>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 いいんじゃね?優しくてw
最近おかしいプログラマって多いから・・・例えば
Q.○○するためにはどうしたらいいのですか?
普通・・・□□がいいかも。△△もお勧め。
異常・・・まず、なぜ○○しようと思ったか言え。
普通に答える人って少ないじゃんw
その目的を達成するために選んだ経路がそもそも間違ってるケースが多いから仕方ないよ
ほらwwwこんな感じでw
そこでエスパー
xxxでできる。けど、もしaaaをやりたくて質問したのならyyyのほうがいいよ。
925 :
デフォルトの名無しさん:2008/03/17(月) 14:22:05
linq とかはいずれ入って来るのかなあ
C#でしか使ったこと無いけど
LINQはすでに入ってきてるだろ
LINQは要りません。
全ての式をメソッドにして律儀にデリゲートオブジェクト作って
Enumerable::Select(Enumerable::Where(…か
929 :
デフォルトの名無しさん:2008/03/17(月) 19:25:33
Windows フォームアプリでフォームを二枚開いて
それぞれに別の情報を表示させるにはどうすりゃいいんでしょうか?
_beginthread でスレッドを複数用意して
それぞれのスレッドで System::Windows::Forms::Application::Run
を呼び出すのでしょうか?
_beginthread ・・・ ドトネトぽく無い気もするし、
そもそもフォームを表示させるのに
Application::Run を使うものだと思い込んでる
俺がダメな気もする。知恵をお貸しください。
気のせいだとは思うがC++/CLIの方がC#より速い気がする。
もちろん根拠はない。計ってもいない。
ただ、スタックセマンティクスは大きいよね。これ使えるときは
使った方がいいよね。
少なくともファイナライザーよぶより、デストラクタ呼んだ方が
はやいよね。
>>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 呼んでみたら
当たり前だけど最初の一枚だけ表示されて帰ってコネー!
とじたばたしてました。思わず各行の最後に & つけそうになったよ・・・
3つともインスタンス作ってからそれぞれShow()して
最後にApplication::Run()
/\___/\
/ / ヽ ::: \
| (●), 、(●)、 |
| ,,ノ(、_, )ヽ、,, |
| ,;‐=‐ヽ .:::::|
\ `ニニ´ .:::/ NO THANK YOU
/`ー‐--‐‐―´´\
.n:n nn
nf||| | | |^!n
f|.| | ∩ ∩|..| |.|
|: :: ! } {! ::: :|
ヽ ,イ ヽ :イ
>>932 まずその計算てのは大変な計算なんだよね。で、
その計算自体が1つで、それを例えば数値とグラフでみせる。
のかそれとも
独立した計算自体が複数あるのかによっても変わってくるかな。
前者なら、スレッドが計算して、2つのフォームがタイマーで
読んで表示?または、スレッドが2つのフォームにポストか?
後者なら、それぞれのフォームでスレッドを作ればいいかな。
やったことないから嘘かも知れないけど。
>>930 VB.NETやC#よりも、VC++の方が高度な最適化がかかる。
C++とC#のコンパイラの最適化レベルの違い紹介してた記事があったと思うが
ちょっと見つからないな。
C# 4.0 からは P/Invoke なしで Win32API が使えるようになるそうです。
あれ?C#にinclude指令と限定Cパーザを足し込む案はボツになって、
System.Win32.[DLLNAME]が追加されたはz(ry
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
クソアメリカへ輸出の日本車に糞付けてやった
クソアメリカのクソ野郎には糞がサイコーだ
世界貿易センタービルから飛び降りて死ね
地面にブチ当たって死ねクソ野郎
クソアメリカの日本車は糞糞糞だらけ〜〜〜
クソアメリカの日本車は糞糞糞だらけ〜〜〜
クソアメリカの日本車は糞糞糞だらけ〜〜〜
>>936 C#は標準でP/Invokeの呼び出しのたびにセキュリティチェックがかかるようになっている。
一方C++/CLIはデフォルトではチェックは発生しない。
C++/CLIで/CLRUNMANAGEDCODECHECKリンクオプションでC#と同等になる。
C#の方はSuppressUnmanagedCodeSecurity属性でチェックを無効に出来る。
双方の条件を合わせるとパフォーマンスの差はない。
クラスに型と同名のプロパティーが在った場合、
その型を名前空間なしで使うとあいまいエラーがでるのね。
C#だと大丈夫なのに。
それはそれは
そんなもの作るなよ
コンストラクタとも被るな
>>949 そりゃ名前つけるのは自由でしょ
C++/CLIの場合は型名よりメンバ名が優先されるから不便なだけで
.NETのクラスライブラリに普通にたくさんあるだろ型名と同じ名前のプロパティなんて
それなんてアンチパターン?
C#だとVSで型名が色分け表示されてるからわかりにくくはならない
色分けしないと分からないソースコードw
http://msdn2.microsoft.com/ja-jp/library/ms229012(VS.80).aspx
>プロパティには、その型と同じ名前を付けるようにしてください。
>列挙型に厳密に型指定されたプロパティを使用する場合は、
>プロパティの名前を列挙型の名前と同じにできます。
>たとえば、CacheLevel という名前の列挙型がある場合は、
>その値のいずれかを返すプロパティにも CacheLevel という名前を付けることができます。
こういう衝撃的なガイドラインがあるんだ
それ、何て、要Option Explicit?
文盲現る。
C丼ダサダサ
例えばフォーム等で Size を返すプロパティが Size なのはとても自然だと思うが。
using System::Drawing;
ref class Hoge
{
public: property Size Size;
private: Size m_size; ←えらー
}
Sizeとだけ書くと全部Hoge::Size扱いになるよね。
System::Drawing::Sizeと書けばよい
俺はnamespace dr = System::Drawing;派。
C++でusingディレクティブは使うなって言われるけど、
C++/CLIだと使えないということをよく実感する。
System::Collections::Generics::List<clr::autohandle<Apple>> apples;
で要素を削除しても、~Apple()は呼ばれないみたいです。
どうしますか?
ファイナライザ書いたら?
リストに入ってるうちに殺れば?
Javaやってるとnewしたまんまほったらかしにするのは
道具をしまったりゴミをゴミ箱にまとめるのをサボってるようで
あまりいい気がしない。
>>964 何で削除されないかと言えば、Listで要素を削除しても
Listは削除した要素のデストラクタを呼ぶわけではないから。
>964
auto_handle による解放タイミングが GC での回収時なんじゃね?
>>964 auto_handleがdeleteされないからAppleもdeleteされない。
デストラクタやファイナライザはどうしても必要な場合でなければ書いてはいけない
特にファイナライザ
ゲームとかヤバイ
この言語って機能が多すぎて大人数でプログラム組むの大変じゃない?
機能をアセンブリ化で分類して適切なスキルの人間に適切な言語で触らせればいい
問題になった場合、それができていないと言うこと
スキルがなければ、VB や C# で書けばいい。なにもかも、C++/CLI のみでやる必要はない
CとC#の橋渡し以外は使う必要ないだろ
o 取り込みたいネイティブライブラリがDLLでのエクスポートを考慮してくれていない
o 取り込みたいネイティブライブラリがクラスライブラリ
o C#で書こうとするとP/Invokeのための宣言や型定義がめんどくさそうな状況
o パフォーマンス上の理由でマーシャラの仕事が邪魔
こんな時に仕方なく使う言語ってところだな。
逆に言うと「こんな時」が多すぎて無いと困るんだけどさ。
.NETのネイティブとのダイレクトっぷりはJavaに対する優位性のひとつだと思うんだけど、
あんまりその文脈では語られないよなぁ。
むこうはそのために発生した複雑性が欠点と思ってるからかしら。
ネイティブを全く考えないで良い状態が理想郷だからな
/clr:pure
中身を書かない property で set だけ protected: に出来ますか?
できるよ
むり
中身書かないトリビアル・プロパティはアクセス指定書くところがないからな
>>983 具体的にどんなところが無駄だと思う?
達成目標がアクロバットすぎるので誰が作ってもこんなもんだと思ってるんだけど。
985 :
デフォルトの名無しさん:2008/03/23(日) 17:44:35
一度Managed C++を経ているからずいぶん考えられていると思うが。
STLのコンテナに入れたものは
削除した時点でつぶされますか?
std::vector<T> v; として、
要素を削除した際、T のデストラクタは呼ばれる。
T がポインタで、そこに new したアドレスを入れているような場合、
それは delete されない。
その目的には boost::ptr_vector が使える。
( ・∀・)つ〃∩ ヘェーヘェーヘェーヘェーヘェー~
^付けないと入れられなかったorz
いや、^ つけても、STLコンテナにマネージド・オブジェクト入れちゃ駄目だろ
そのための STL/CLR じゃまいか
勝手に作られる関数
インデントおかしい。
インデント設定、もしくは、インデントをきれいにする方法ってありあすか?
C++エディタにはそういうの一切無いよ。
たしかにC++/CLIのフォームデザイナの吐くコードは
ケンカ売ってるとしか思えないw
コレクションの中身を自動変数風にすることは出来ないの?
value class Hoge;
List<Hoge> hoges;