none
vbからbyte配列を受け取る RRS feed

  • 質問

  • VB2005 から VC++2005の関数の呼び出しについてです。

    簡単そうなのに、できません。

    CLRからクラスライブラリを選択してプロジェクトを作成しました。

    以下のように書くと(C++側)、コンパイルエラーがでて、

    サポートされていない戻り値の型か、またはサポートされていないパラメータ型が指定されています。

    と表示されます。

     

    unsigned charにしても同じエラーです。

    他の部分かも知れませんが、私にはわかりません。

    どうすればエラーがなくなるのか、教えてください。

    よろしくお願いします。

     

    Code Snippet
    System::Drawing::Point Test(double Thresh, int wid, int hgt,Byte bBuf[], int Tmpwid, int Tmphgt, Byte bTmp[], double Ret[], double maxv, int MaxI, int MaxJ)

     

    2008年3月27日 13:32

回答

  • array<Byte>^ bBuf

    とか。
    従来の構文で書くと、ネイティブ配列として扱われます。

    詳細につきましては、下記スレッドが参考になるかと思います。

    http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=2855091&SiteID=7
    2008年3月27日 14:09
  • 外池です・・・。

     

    うん? VC++2005は、CLIでいいんですか?

     

    ならば、array <char> ^bTmp とか・・・・。外してます?

     

    2008年3月27日 14:10
  • >C++/CLIになって、VBやC#と同様に、「参照」型の変数も扱えるようにしないといけ

    >なくなったわけで、^によって「参照」型を明記しているのだと・・・。(ツッコミ大歓迎)

     

    参照はC++では

    double a = 1.0;

    double& b = a;       // a の別名(=参照)としてbを宣言

     

    と言うようにC++/CLIでない純正のC++にも存在します。

     

    ^ハンドルはむしろC++の*ポインタに対応するもの

    %トラッキング参照がC++の&参照に対応している

     

    ^, %は*,&と異なりマネージドヒープを参照している点が異なる

    と理解しています。ただいま勉強中です。

     

    2008年3月29日 7:41

すべての返信

  • array<Byte>^ bBuf

    とか。
    従来の構文で書くと、ネイティブ配列として扱われます。

    詳細につきましては、下記スレッドが参考になるかと思います。

    http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=2855091&SiteID=7
    2008年3月27日 14:09
  • 外池です・・・。

     

    うん? VC++2005は、CLIでいいんですか?

     

    ならば、array <char> ^bTmp とか・・・・。外してます?

     

    2008年3月27日 14:10
  • ありがとうございます。

     

     Abstract さんからの引用

    array<Byte>^ bBuf

    とか。
    従来の構文で書くと、ネイティブ配列として扱われます。

    詳細につきましては、下記スレッドが参考になるかと思います。

    http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=2855091&SiteID=7

     

    これってこないだのだ!読んでないことがばればれ。w

    エラーはなくなりました。

    この、^って何だ?って感じですが、それは自分で調べることにします。

     

    外池さん、とりあえず、NETの流儀で書こうとしています。(という答えでよいのかな?w)

    VBからはずれると、とたんに息があがります。

     

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

    2008年3月27日 14:38
  • 外池です。

     

     はなはなはな さんからの引用

    この、^って何だ?って感じですが、それは自分で調べることにします。

     

    私も、例のスレッドから初めてC++/CLIに足を踏み入れたわけですが、以下は、私の現時点での理解です。

     

    従来のC++って、変数は基本的にすべて「値」型ですよね? ポインター型であっても、*演算子をつけなければ、基本的に、変数はメモリーのアドレスという値を持っているわけで・・・、

     

    ところが、C++/CLIになって、VBやC#と同様に、「参照」型の変数も扱えるようにしないといけなくなったわけで、^によって「参照」型を明記しているのだと・・・。(ツッコミ大歓迎)

    2008年3月28日 0:09
  • ありがとうございます。

     

    http://msdn2.microsoft.com/ja-jp/library/ms235236(VS.80).aspx

     

    2005になって書き方が変わった、ということなのかなぁ、と考えています。

    2008年3月28日 1:08
  • >C++/CLIになって、VBやC#と同様に、「参照」型の変数も扱えるようにしないといけ

    >なくなったわけで、^によって「参照」型を明記しているのだと・・・。(ツッコミ大歓迎)

     

    参照はC++では

    double a = 1.0;

    double& b = a;       // a の別名(=参照)としてbを宣言

     

    と言うようにC++/CLIでない純正のC++にも存在します。

     

    ^ハンドルはむしろC++の*ポインタに対応するもの

    %トラッキング参照がC++の&参照に対応している

     

    ^, %は*,&と異なりマネージドヒープを参照している点が異なる

    と理解しています。ただいま勉強中です。

     

    2008年3月29日 7:41
  •  Tomma さんからの引用

     

    ^ハンドルはむしろC++の*ポインタに対応するもの

    %トラッキング参照がC++の&参照に対応している

     

    ^, %は*,&と異なりマネージドヒープを参照している点が異なる

    と理解しています。ただいま勉強中です。

     

     

    その説明は私にはしっくりきます。

    今、C++/CLIの中でデリゲート呼び出しで、マルチスレッドをしてみていますが、

    参照渡しが、%でないとダメみたいです。

     

    で、配列を渡したいのですが、int* testとかして

    test=new int[wid*hgt]として渡そうとすると、

    Pointer 型をリモート呼び出しで渡すことはできません。

    の例外が発生します。

    int^ testとかしてやらないといけない気もするのですが、

    動的にnewするのがわからない状況です。

    もうすこし粘ってみます。

    2008年3月29日 9:00
  •  はなはなはな さんからの引用

    で、配列を渡したいのですが、int* testとかして

    test=new int[wid*hgt]として渡そうとすると、

    Pointer 型をリモート呼び出しで渡すことはできません。

    の例外が発生します。

    int^ testとかしてやらないといけない気もするのですが、

    動的にnewするのがわからない状況です。

    もうすこし粘ってみます。

     

    結局、

    array<int>^ test;

    test=gcnew array<int>(wid*hgt);

    で、やりました。

     

    別の問題が発生したので、別スレッドにて質問します。

    2008年3月29日 10:25