none
Bitmap^ を引数で渡してもBitmapは定義されない。 RRS feed

  • 質問

  • お世話になっております。

    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の問題でしょうか??

    理解できません。。。

    よろしく御願いします。

    2015年10月4日 3:41

回答

  • 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
    2015年10月4日 3:55

すべての返信

  • 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
    2015年10月4日 3:55
  • Hongliang さま

    Bitmap^ ・・・^は参照だと勘違いしておりました。

    やっと呪縛から解き放たれました。。。

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

    2015年10月4日 4:40