トップ回答者
Bitmap^ を引数で渡してもBitmapは定義されない。

質問
-
お世話になっております。
Vc++2012ExpressでVC++/CLIで以下のように作成したいのですが
Bitmap^の引数に値が入らなくて困っています。
どこが問題になっているかわかりません。ご教示お願いします。
Form1側で
private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) {
Bitmap^ bmp;
Camera^ c= gcnew Camera(0); (省略)
c->Capture(bmp);//←bmpが未定義となったまま。。。
//PictureBoxの大きさを画像の大きさに合わせる
pictureBox1->Width=bmp->Width; //←例外発生
pictureBox1->Height=bmp->Height;}
void CameraUnmanaged::capture(Bitmap^ cambmp)
{
IplImage* img_src;
//カメラ入力開始
//1フレーム取得
cv::Mat img_frame;
cap>>img_frame;
img_src=new IplImage(img_frame );
cambmp = gcnew Bitmap(
img_src->width,
img_src->height,
img_src->widthStep,
Imaging::PixelFormat::Format24bppRgb,
IntPtr(img_src->imageData));
cv::imshow(window_input, img_frame);
}
例外内容
型 'System.NullReferenceException' のハンドルされていない例外が System.Drawing.dll で発生しました
追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。となっています。
NativeとManagedの問題でしょうか??
理解できません。。。
よろしく御願いします。
回答
-
T^で表現される引数は、値渡しになります。
int x = 0; hoge(x); void hoge(int a) { a = 4; }
ってやってもxは0のままなのと同じです。
呼び出し先で書き換えるには参照渡しする必要があります。C++において、マネージオブジェクトの参照(トラッキング参照)は%で表現します。ネイティブなオブジェクト類では&で表現していたやつです。
つまり、
void hoge(Bitmap^% bmp)
です。ネイティブな表現では、(CBitmapクラスという型が定義されているとして)
void hoge(CBitmap*& bmp)
に相当します。
// 受け取るだけの参照であることを明示するためにOutAttribute属性をつけたりもします。
が、そもそも、返値でBitmap^を返せばいいだけでは?
- 回答としてマーク t_osk 2015年10月4日 4:19
すべての返信
-
T^で表現される引数は、値渡しになります。
int x = 0; hoge(x); void hoge(int a) { a = 4; }
ってやってもxは0のままなのと同じです。
呼び出し先で書き換えるには参照渡しする必要があります。C++において、マネージオブジェクトの参照(トラッキング参照)は%で表現します。ネイティブなオブジェクト類では&で表現していたやつです。
つまり、
void hoge(Bitmap^% bmp)
です。ネイティブな表現では、(CBitmapクラスという型が定義されているとして)
void hoge(CBitmap*& bmp)
に相当します。
// 受け取るだけの参照であることを明示するためにOutAttribute属性をつけたりもします。
が、そもそも、返値でBitmap^を返せばいいだけでは?
- 回答としてマーク t_osk 2015年10月4日 4:19