くだすれC++/CLI(初心者用)part2

■ このスレッドは過去ログ倉庫に格納されています
2010/03/15(月) 09:41:19
おそらく、.NET開発でデファクトスタンダードに最も近いであろう
C++/CLIについて語ろうぜ!

このスレはC++および.NET Frameworkについて一定以上の知識を持っている人が対象となります。
.NETのクラスライブラリの使い方といった質問は Visual Studioスレにお願いします。

前スレッドはこちら
くだすれC++/CLI(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1142144110/l1

dat落ち姉妹スレ
C++/CLI part3
http://pc12.2ch.net/test/read.cgi/tech/1206447234/l1
http://pc11.2ch.net/test/read.cgi/tech/1142147319/l1
http://pc8.2ch.net/test/read.cgi/tech/1126450441/l1

managed C++ やろうぜ!! 002
http://pc8.2ch.net/test/read.cgi/tech/1139043535/l1
2013/02/20(水) 15:26:26.90
staticなんだし適当にやってみりゃよかろう
WIDTHとHEIGHTはどこでもいいしarray部分はclass Form1に入れたら
とりあえず動いたぞ、面白いなこれw
2013/02/20(水) 15:33:46.31
何の役に立つのかな
2013/02/20(水) 15:34:48.07
>>649
自分やると動かないんですけど・・・
何で動かないんだ?
2013/02/20(水) 15:38:18.30
エスパー希望ですねわかります
2013/02/20(水) 15:54:18.59
うまくいかないのは実行時なのかコンパイル時なのか
うまくいかないと判断したのはどこ?
2013/02/20(水) 17:02:18.31
初心者なので…すいません
実行するとエラー100いくつとかはくんですよね
範囲設定間違ってるのか、何が原因なのかわかんないです。。。
2013/02/20(水) 17:07:17.35
100いくつって数かよ
もしそうならコンパイル時だろうし
全角スペース入ったままなんだろ
置換で半角に変えとけ
2013/02/20(水) 17:26:40.56
全角→半角やってもダメみたいです…
もし成功した方いたらそのプロジェクトファイルうpしていただけませんか?
どなたかお願いしますううう
2013/02/20(水) 17:30:18.61
ダメみたいとか、自分の状況を隠し続ける人に言えることは何もない
658デフォルトの名無しさん
垢版 |
2013/04/17(水) 21:57:33.57
等高線グラフを表示させたいのですが、
手段が見つかりません。

3D点(x,y,z)の点(データ)×数万個を線で結びつけて、色付けしたものです。

チャートコントロール(mschar)では等高線をサポートしておらず、実現できません。
System::Windows::Forms::DataVisualization::Charting::Chart

どなたかご教授くださいませ!

[環境]
visual c++ 2008 express
vs2012へ更新検討中
2013/04/17(水) 22:02:56.86
そういうのは可視化ツール使えよ
ParaViewとか
2013/04/17(水) 22:10:53.92
Gnuplotでも使えば一瞬
自分でそういうの書くのは手段が目的化してるバカ
2013/04/17(水) 23:21:24.73
マルチ
2013/06/01(土) 08:15:06.30
ちょっと教えてください
自分は独学でC/C++,C#と、まぁC系の勉強をして、ソフトも作れるようにもなりました。
で、就職活動してたんですが、年齢のせいで、資格か業務経験が無いとって感じで、どの企業にもスルーされてきました。
で、今、職業訓練学校でJAVA及びAndroidアプリの作製っていうコースにかよってて
さすがに、まぁ、昔、独習JAVAって本でさらっとJAVAを勉強してた部分もあったりでJAVA自体は
勉強するというより(現在は、まだAndroid開発の講義じゃなくてJAVAの講義)今の、講師からも言われたんですが
「〜(自分)さんは、もうJAVAの部分は解かってるだろうから、色々と予習していったら良いですよ。」と言われてる状態です。
さて、ここからが本題ですが、JAVAのソースを見てるとnativeっていう修飾子があって文字通りnativeで作られた
メソッドがあったんです。で、JAVAのVMもどうやらCで書かれてるようなのがソース見てわかりました。
そしてCLIですが、C++で組んだアンマナージドなクラスライブラリ等をC#で使う時ってなんかしらの修飾子
ってあるんですか?一度実験でアンマネージドなC++のクラス作ってマネージド(CLI)なクラスの中にほりこんだら
[そりゃ無理じゃ、ポインタとして宣言しろ!このカスが!]って嘘だけど、まぁ、こんな感じのエラーがでたんです。
C#側でwin32apiを使いったかったらdllのアトリビュート文を書けば良いんですけど
クラスはどうしたら良いんでしょうか。
どなたかこうすれば良いという方法があればご教示ください。
2013/06/01(土) 09:35:33.80
文章にイラン部分が多すぎ。人生相談の板は別にあるぞ
質問は的確に
664662
垢版 |
2013/06/01(土) 10:22:22.81
>>663
そやね、確かに質問がまとまってなかったは。
要は、普通にC++でクラスを作ります(例えばTestっていうクラス)。
それをC#内で使おうと思っても、無理になります。
で、その仲介役としてCLIを使うとします。
その時にCLIで作ったマネージドなクラス内でTestクラスのインスタンスを生成するには
どうしたら良いですか。という質問です。
2013/06/01(土) 11:56:57.18
>>664
C++のクラスをCOMコンポーネントにする
これで直接C#内で使えるだろ
2013/06/01(土) 12:11:21.91
gcnew じゃなくて new してポインタを受けるだけじゃうまくいかなかったのか?

ちなみにマネージドとアンマネージドの世界の行ったり来たりはオーバーヘッドすごいから
小さなメソッドをちまちま呼び出すような処理はやめておけ。
667662
垢版 |
2013/06/01(土) 12:13:59.07
>>665
あ、そっか、たしかにCOMコンポーネントは呼べるね。
でも、C#で以前(何年前かは忘れた)Excel呼び出して
C#側で、Excel終了さしたのにプロセス見たら
残ってて、こりゃあかんと思ってExcel呼び出すのは
やめたんだけど、今のVSは、そこらへんもちゃんとしょりしてるのかな
俺がもってるVSって2005なんでね
2013/06/01(土) 12:22:18.97
>>667
ぼろいPCならアプリ終了しても暫くプロセス残ってるなんて普通にあると思うが
2013/06/01(土) 14:37:10.11
COMの場合それとは違って寿命管理の話だな
2013/06/01(土) 14:39:16.16
>>664
C++/CLIのマネージドクラス内でインスタンスを生成して
「フィールドに保持したい」ということでいいのか

フィールドをポインタにしてnewして持てばいい
2013/06/02(日) 00:02:02.93
こんなかんじかな、Disposableにしてるから
deleteのタイミングが重要なときはDisposeすればよい

ref class M2 {
N1 *n;
public:
M2() { n = new N1; }
~M2() { delete n; }
!M2() { delete n; }
};
2013/06/02(日) 10:25:59.95
CLI用スマポを作る
2013/06/02(日) 12:55:57.74
>>667
多少スレ違いだけど、それの解決方法はほぼ確立してるんだ。
結局のところ外部プロセスサーバーが終了する前に
Execl.Appicationを何度も生成からそうなるわけで、
はじめからExecl.Appicationをひとつだけ生成しておくか、
WeakReferenceにExecl.Appicationの参照をもって、
参照が消えてれば生成するというロジックにすれば万事解決する。
連続して使うときはExcelのインスタンスが毎回立ち上がらずに
パフォーマンスがいい。
674デフォルトの名無しさん
垢版 |
2013/06/02(日) 13:08:52.90
そうだね
2013/06/02(日) 14:57:18.85
>>667
似たような経験があるけど、そのときは、単に参照を破棄してもGCされるまでは
オブジェクトが解放されないからCOMサーバーに伝わらんだけだった。
そういうことじゃなくて?
2013/06/02(日) 15:17:26.36
俺も経験ある
GCされるまで開放されないんだよねあれ
2013/06/02(日) 19:34:42.29
馬鹿には無理
2013/06/02(日) 21:35:27.92
ReleaseComObjectは現実的な対処法ではないだろう。
ある程度の規模のコードで、例外時も含めて漏れなく書くとなると
コード量が膨らみすぎる。
2013/06/17(月) 19:39:26.55
.Net Framework 2.0のUdpClientクラスって、recvfromに該当するものってないのかな?
相手のIPアドレスが知りたいんだけども。

同じポートに複数のスレッドがブロードキャストしてて、片側のパケットだけを対象にしたい
のよね。
2013/06/17(月) 22:44:18.60
Connectすればいいよ
681679
垢版 |
2013/06/18(火) 12:48:05.81
自己解決した。

ひとまず、EndRecieveの引数にIPEndPoint仕掛けてやればいいっぽ。
そしたらStringで判定できる。
2013/06/18(火) 13:06:09.51
>>679
recvfrom の仕様は分からないけど、送信元のアドレスは UdpClient.Receive
の引数で取れるよ。
非同期なら UdpClient.EndReceive の第2引数。
見当違いだったらごめん。
683682
垢版 |
2013/06/18(火) 13:07:11.20
リロード忘れたorz
684679
垢版 |
2013/06/18(火) 15:35:49.41
>>682
うん、後者でやることにしたんだわ
2013/06/18(火) 15:44:15.55
リロード忘れたの意味がわからない人か
2013/06/18(火) 16:31:15.38
わかってるから優しくフォローしたように見えるけど。
世の中難しいね!
687デフォルトの名無しさん
垢版 |
2013/07/03(水) NY:AN:NY.AN
配列初期化時に値も設定したのですが、gcnew array<int>(3){1,2,3};
って書かないとコンパイラさんにはじかれます。
gcnew array<int>(){1,2,3};
みたいな、配列サイズを指定しない初期化方法は無いでしょうか。
2013/07/03(水) NY:AN:NY.AN
()書かない
2013/07/03(水) NY:AN:NY.AN
本当だ!!<>のあとに{}を書くっていう発想がなかったです。
ありがとうございました。
2013/07/15(月) NY:AN:NY.AN
C++/CLIで使えるロギングライブラリってどういうのがあるんでしょう?
.netで用意されているのか、あるいはlog4cppなんかのC++用の
ライブラリを使ったりしているんでしょうか。
2013/07/15(月) NY:AN:NY.AN
log4netとか
2013/07/15(月) NY:AN:NY.AN
なるほど、見落としていました。
log4netは名前を見たことはあったんですが、「C#で使うもの」と
刷り込まれて、すっかり頭から抜けていました。
693デフォルトの名無しさん
垢版 |
2013/07/17(水) NY:AN:NY.AN
listBox1->Items->Add("A");
これがOKで
std::string a = "A";
listBox1->Items->Add(a.c_str());
これだと'const char *' から 'System::Object ^' に変換できないって出るんだけどどういうこと?
最近CLIさわりはじめたんだけどわからん・・・
2013/07/17(水) NY:AN:NY.AN
リテラルの文字列は文脈によってString^として扱えるってだけ
char*やwchar_t*とString^は別物
char*からならgcnew Stringしたりとか
2013/07/18(木) NY:AN:NY.AN
>>694
とんくす
2013/07/22(月) NY:AN:NY.AN
>>679
これ自分も試してるんだがうまくいかん。
EndReceivedの第二引数の中みても"255.255.255.255"で見分けがつかない。

後でコード載せますん。
2013/07/22(月) NY:AN:NY.AN
コードっす(1/2)。"192.168.3.128"からのUDPブロードキャストのみを対象にしたいっす。
--------
#pragma endregion
private:
System::Void btnUdpRecv_Click(System::Object^ sender, System::EventArgs^ e)
{
String^ FilterIPAddress = L"255.255.255.255";
// Receive a message and write it to the console.
int portID = 3000;
IPEndPoint^ ipep = gcnew IPEndPoint(IPAddress::Any, portID);
UdpClient^ udpcli = gcnew UdpClient(ipep);

UdpState^ udpst = gcnew UdpState();
udpst->e = ipep;
udpst->u = udpcli;

udpst->u->Connect(FilterIPAddress, portID);
this->btnUdpRecv->Enabled = false;

Console::WriteLine("listening to RT");
udpcli->BeginReceive(gcnew AsyncCallback(this, &UDP_RECVTEST::Form1::ReceiveCallback), udpst);

// Do some work while we wait for a Packet. For this example,
// we'll just sleep
while (!messageReceived)
{
System::Threading::Thread::Sleep(100);
}

this->btnUdpRecv->Enabled = true;
}
2013/07/22(月) NY:AN:NY.AN
続きっす(2/2)。
--------
//Call back function for the read packet data
System::Void UDP_RECVTEST::Form1::ReceiveCallback(IAsyncResult^ ar)
{
String^ FilterIPAddress = "192.168.3.128";

UdpState^ state = (UdpState^)ar->AsyncState;
UdpClient^ udpcli = state->u;
IPEndPoint^ ipep = state->e;

EndPoint^ remoteep = udpcli->Client->RemoteEndPoint;

int len = udpcli->Client->EndReceive(ar);
String^ recvip = ipep->Address->Broadcast->ToString();

if(ipep->Address->Broadcast->ToString() == FilterIPAddress)
{
array<unsigned char>^ receiveBytes = udpcli->EndReceive(ar, ipep); //Packet received

Console::WriteLine("Received packet length {0}", receiveBytes->Length);
messageReceived = true;

return;
}

Console::WriteLine("listening to RT");
udpcli->BeginReceive(gcnew AsyncCallback(this, &UDP_RECVTEST::Form1::ReceiveCallback), state);
}
2013/07/22(月) NY:AN:NY.AN
以下、簡単に説明。

プロジェクトはWindowsフォームアプリケーションです。フォームにボタンを配置して
クリックしたら"btnUdpRecv_Click"がうごくという簡単なもの。

あと、UDPブロードキャスト送信側は、inet_addr("255.255.255.255")で送信しております
です。

なにかヒントでもありましたらご教示くださいませ。
2013/07/22(月) NY:AN:NY.AN
EndReceiveの第二引数かいてないのはいろいろ試してそれでもだめだったんで
一回もと(というか、チャレンジする前)に戻したためです。ご了承くだ。
2013/07/22(月) NY:AN:NY.AN
なんでEndReceive二回よんでんの?
2013/07/22(月) NY:AN:NY.AN
そう!すいませんアホなことしてましたアンド紛らわしい変数名つけてたんで違うほうみてた…
お騒がせしますた!
2013/07/24(水) NY:AN:NY.AN
スレッドを立てたいんだけど、
HANDLE ThreadHandle = (HANDLE)_beginthreadex(NULL, 0, ReadThread, NULL, 0, NULL);
unsigned __stdcall ReadThread(void *p){}
こうすると関数呼び出しには引数リストが無いからメンバーへのポインタを作成するために
&Namespace::ReadThreadって感じで指定しろって言われたからそうしたら今度は
delegate インスタンスを作成する場合以外に&Namespace::ReadThreadのアドレスを指定できないとか言われて八方塞なんだけどどうしたらええの・・・
2013/07/24(水) NY:AN:NY.AN
いっそ、CreateThread
2013/07/24(水) NY:AN:NY.AN
_biginthread ってなんで必要なんだ?
CreateThread で十分用がたりるのだが?
というか cygwin/gcc-3 なんでこれしか選択肢がない
2013/07/25(木) NY:AN:NY.AN
_beginthreadも結局は内部でCreateThreadを呼び出しているのではあるが
そのほかにランタイムが使う内部変数の初期化なども行っている

よっていきなりCreateThreadを呼び出すと
出所不明のメモリリークに悩まされたりすることになる

逆に言えばMSVCRTを使わないのであればCreateThreadをつかえば良い
2013/07/25(木) NY:AN:NY.AN
テンプレ類は覚えること少なくする目的で簡単にしようという理念からはじまり、
いろいろ隠ぺいすることで逆にめんどくさいものになってるよね
2013/07/25(木) NY:AN:NY.AN
>>703
warning C4441無視してね?
2013/07/26(金) NY:AN:NY.AN
Managed Threadは使わんの?.NETなんだし
2013/08/05(月) NY:AN:NY.AN
array<String^>^ txts = gcnew array<String^>{"りんご", "ごりら", "らっぱ"};
int index = 0;
String^ msg = txts[index ++] + txts[index ++] + txts[index ++];

とやった時にmsg = "りんごりんごりんご"になるのですが
msg = "りんごごりららっぱ"となるようなインクリメントの方法はないでしょうか
2013/08/05(月) NY:AN:NY.AN
3行にわければ?

sehermitage.web.fc2.com/program/c_lang.html
> インクリメント演算子++とデクリメント演算子--は,変数の値を変化させるが,
> その変数が同じ式の中で再び参照された場合,動作は未定義となり値は保証されない
2013/08/05(月) NY:AN:NY.AN
>>711
情報どうもです!式を分けるしかないですね。
713デフォルトの名無しさん
垢版 |
2013/08/11(日) NY:AN:NY.AN
32bitのネイティブのDLLを呼び出す.netのDLLがあります。
それを呼び出す.netのアプリの設定で、共通言語ランタイムサポートを/clr:safeでコンパイルすると、64bitOSで動かなくります。
共通言語ランタイムサポートを/clrにすると動きます。/clr:safeのままで動かすにはどうしたら良いでしょう。
2013/08/11(日) NY:AN:NY.AN
>>713
safeだとanycpu指定で作ったアセンブリとなるので、
64bitのWindowsだと64bitモードで動作する
手元にあるVS2010では適当なコンパイルオプションが見つからないので、
CorFlagsで32bitフラグをONにするとかかな
715713
垢版 |
2013/08/16(金) NY:AN:NY.AN
>>714
corflagsでいけました。ありがとうございます。
716デフォルトの名無しさん
垢版 |
2013/09/08(日) 19:50:17.03
MFCアプリを移行しようと/clrでビルドしたところ、LNK4248が大量に発生しました。
原因は使用しているdllで使う構造体の定義本体がなく事前宣言しかないための
ようですが、これは無視しても問題ないものでしょうか?
当然、この構造体のメンバにアクセスすることはなく、これまでは問題ありませんでした。
また、この警告の出力を抑制する方法はないでしょうか?環境はVS2008です。
2013/09/09(月) 01:05:58.58
数が少ないなら
struct nantoka { };
みたいなのを定義するとか。

あるいは大量にあって全部無視して安全だと分かっているなら link.exe にオプション /ignore:4248 をつけるとか。
(こっちは試したことないので動くかどうかはしらん)
2013/09/10(火) 01:04:26.29
前者の方法でうまくいきました。ありがとうございました。
2013/09/11(水) 18:19:50.17
PropertyGridで説明つけるとき

C#は、
[Description("説明領域に書き込めます。")]

VBは、
<Description("説明領域に書き込めます。")> _
とあるのですが

CLIではどのように記述すればよろしいのでしょうか?
2013/09/11(水) 18:22:25.98
そんなのはMSDN見ろよ
C++/CLIは今はまだサンプル表示できる言語に残ってるぜ
2013/09/11(水) 18:34:21.21
サンプル見てもCLIのPropertyGridのDescription見つからなかったのです。

で、解決しました。
Formと同じusing namespace書いたら
C#と同じ書式でいけました。
2013/09/11(水) 18:35:33.94
ComponentModelにおった
2013/09/23(月) 12:57:32.04
ドッキングウインドウとかできますか?
2013/09/27(金) 21:09:38.57
MDIとか、できない?
2013/09/29(日) 00:32:42.55
bulletを使いたいのですが
整列データ型はサポートされてないって言われ
通りません。
BT_MANAGED_CODE定義以外何か必要なのでしょうか?
教えてください
2013/09/29(日) 16:15:50.71
Imageクラスって各イメージファイル形式のフォーマット知らんでも勝手に保管してくれるんだっけ?
たとえば jpeg の 0xFFD9とか
2013/09/29(日) 16:21:06.24
ちょっと言ってる意味が分からない
2013/09/29(日) 17:39:33.10
あー、ごめん。
例えばBITMAP形式のファイルを読み込んでSaveメソッドでjpeg指定するだけで変換できるのかと。
2013/09/29(日) 17:41:13.27
というか、まぁ出来たは出来たんだけどね。
ただ、.Netのバージョンによって挙動が変わるっぽいね。
0xFFFEの部分が無視されちゃったりされなかったり。
730デフォルトの名無しさん
垢版 |
2013/10/02(水) 18:23:28.32
visual studio 2012は、新しい項目の追加で継承されたフォームが
出てこないんですか?
継承されたフォームを作成するにはどうすればいいのか教えてください。
2013/10/12(土) 15:02:58.87
for(int i=0;i<Hoge->Split(array<String^>{L"\r\n"},StringSplitOptions::None)->Length;i++){
...
}

array<String^ >^Hoge_Split = Hoge->Split(array<String^>{L"\r\n"},StringSplitOptions::None);
for(int i=0;i<Hoge_Split->Length;i++){
...
}

int i=0;
for each(String^ Hoge_Line in Hoge->Split(array<String^>{L"\r\n"},StringSplitOptions::None)){
...
i++;
}
のどれが処理が速いの?
「...」の部分が十分に長く要素の番号を参照することがあるとして
2013/10/12(土) 16:26:14.92
試せよ
733デフォルトの名無しさん
垢版 |
2013/10/12(土) 16:53:11.84
フォームアプリケーションでの質問だけど、
テキストボックス(名前:textBox1とする)を配置すると、
textBox1->Text
でString型の文字列がとれるんだけど、これをatoiしたいがためにchar型に変換しようとして、
atoi(textBox1->Text->c_str());
って書くと、「c_strはSystem::Stringのメンバではありません」って表示される。
c_strってメンバじゃないの?
2013/10/12(土) 17:06:19.97
じゃないよ
System::Stringとstd::stringは別物
2013/10/12(土) 17:12:51.52
VBじゃねえんだから大文字小文字の区別はつけよう
2013/10/12(土) 17:26:01.80
うおおまじか
紛らわしいな…ありがとう
2013/10/12(土) 23:00:26.48
C++/CLIでWPFをやろうとしていますが、XamlReader::Load()で自作クラスのインスタンス化に失敗します。
フレームワークに含まれるSystem.Windows.Applicationなら<Application>でのインスタンス化に成功するが、
その派生クラスMyApp.Appをインスタンス化しようとして<Application x:Class="MyApp.App" >としても、
クラス名を間違えたときと同じように下のような例外が出てしまいます。。

指定されたクラス名 'MyApp.App' は、実際のルート インスタンス型 'System.Windows.Application' と一致しません。

クラスを見つけられていないんだと思いますが、これはどこかで設定する必要があるんでしょうか?
プロジェクトの設定は「空のCLRプロジェクト」のサブシステムをWINDOWSにして、WPFに必要な
PresentationCore.dllなどの参照を追加した程度です。
2013/10/12(土) 23:10:16.98
Applicationを継承しろ
っていうか素直にC#を併用しろ時間の無駄だ
2013/10/12(土) 23:18:26.35
C#でデザイナ使ったときはXamlってコンパイル時に処理されるからなあ
clr-namespaceとか指定してみたら
2013/10/13(日) 00:20:33.93
<my:App x:Class="MyApp.App" xmlns:my="clr-namespace:MyApp">としてみると

不明な型 '{clr-namespace:MyApp}App' を作成できません。

というエラーになりますね。やっぱり何か認識できていないのかな。
2013/10/13(日) 00:25:09.93
ApplicationのXAMLいらなくね?
普通にコードからgcnew AppしてRunしてMainWIndowすればいいじゃん
アプリケーションリソース使うならリソースディクショナリをLoadXamlすればいいし
デザイナがないのにわざわざデザイナ向けの面倒な方法をとる意味がわからん
2013/10/13(日) 00:51:09.66
App.xamlに限れば省略する手もあるでしょうが、現象としてはMainWindow.xamlも同じなので。
クラスをインスタンス化するという意味においてはApp.xamlもMainWindow.xamlも違いは
ありませんので、例としてApp.xamlを挙げたに過ぎません。
2013/10/13(日) 08:31:38.34
>>733
やりたいなら、Convert::ToInt32(textBo1x->Text)
だな
2013/10/13(日) 08:32:40.33
ちとタイプミスったが許せ
2013/11/10(日) 04:03:56.73
C#のfixedとC++/CLIのpin_ptrって同じものですか?

C#で配列をfixedして処理するより,C++/CLIにマネージ配列で渡した後,C++/CLI内でpin_ptrして処理する方が速いのでしょうか?

初歩的な質問で申し訳ないです.
2013/11/10(日) 07:13:51.28
ネイティブコードに渡さないときはinterior_ptrで書くんじゃない。
パフォーマンスは大差ないかと…。
2013/11/10(日) 07:53:22.46
そもそも普通にマネージコードで処理するんならC#で普通にインデックス使って回せば最適化されるから十分速い
ヘタにポインタ使った方が遅くなることもある
2013/11/10(日) 12:45:13.44
パフォーマンス的には対して変わらない,下手な書き方をすればかえって遅くなるということでしょうか?

やりたかったのは,C#からBitmapとint配列を渡して,C++/CLI内でヒストグラムを作るとかそんなところです.
C#側からは,
MakeBrightnessHistogram(Bitmap^ bmp, array<int>^ histogram)
を呼び出して,この関数の内部でFormat32bppRgbのBitmapDataを取得し,histogramをpin_ptrで固定した後,
MakeBrightnessHistogram_Unmanaged(int* data, int size, int* p_histogram)
を呼び出すというような形になっています.(dataはBitmapData->Scan0をint*にキャストしたもの,sizeはbmpの画素数)
ちなみに,MakeBrightnessHistogram_Unmanaged内で,RGBの値をBrightnessに変換する変換テーブル(ネイティブ配列)にアクセスしています.

画像データやヒストグラム,変換テーブルといった配列にアクセスする命令が多いので,C++/CLIを使えば速くなるのかと思ってプログラムしてみたのですが,
こういった処理は,わざわざC++/CLIを使わなくても,C#で高速にできるものなのでしょうか?
最初から素直にこれを質問すれば良かったですね...
2013/11/10(日) 13:40:47.67
そういうコード書くならCかC++でDLL作って
それを呼び出すようにした方が手っ取り早い気がするのよ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況