none
古いCのコードで使っていた名前渡し呼び出し RRS feed

  • 質問

  • わかりやすく言い換えることが難しそうなので、具体的に書きます。

    クラス等を使ったC++ではないCの関数で、引数にunsigned char *を持つものがあります。
    引数は、ある程度の長さをメモリ領域で、呼び元で動的に確保済み。
    関数内では、それを前提として、処理結果をこの領域に格納して呼び元に返し、呼び元で使用します。
    関数のプロトタイプ宣言や内部処理等を変更せずに、この関数を使いたいのですが、呼ぶ側の作りがうまくいきません。
    領域の大きさは、完全固定ではないのですが、呼ぶ前には決定するものです。
    unsigned charなのでarray<Byte>で配列を作りましたが、unsigned char *でキャストして関数に渡すこともできませんし。。。
    仮に、領域の大きさがInt32型でSizeという変数に入っているものとして、関数に渡すための領域の確保と呼び方はどうすればいいでしょうか?
    それとも、古いものをそのまま使うことは無理なのでしょうか?
    2010年4月22日 12:25

回答

  • C++/CLI の話ですね。

    array<Byte>^ を使うなら、これをアンマネージコードに渡す際、ピン留めしてやる必要があります。

    pin_ptr<Byte> ptr = &bytes[0];
    Func(ptr); // ptr は Byte* として扱える

    また、普通の C++ のように、動的配列にしたり(new unsigned char[size];)とか std::vector<unsigned char> を使ったりも可能です。

    • 回答としてマーク K6963 2010年4月22日 18:16
    2010年4月22日 13:07

すべての返信

  • とりあえずその関数の宣言を見せた方が話が早いんですが、例えば、

    void Func(unsinged char* hoge);

    だとして、

    unsigned char buff[255];
    Func(buff);

    で駄目って事でしょうか?

    2010年4月22日 12:41
  • あ”、呼ぶ側のことをあまり書いてませんでしたね(^^;

    呼ぶ側では、array<Byte>やMemoryStreamを使いたいと思っているんです。

    使い勝手はそちらの方が良いので。

    長さが固定ではない(実行する度に変わる可能性があるが、実行中には変化しない)バイナリデータを処理する古い関数があって、上位では今時のクラス等で安全かつ容易に使いたいという次第です。

    2010年4月22日 13:03
  • C++/CLI の話ですね。

    array<Byte>^ を使うなら、これをアンマネージコードに渡す際、ピン留めしてやる必要があります。

    pin_ptr<Byte> ptr = &bytes[0];
    Func(ptr); // ptr は Byte* として扱える

    また、普通の C++ のように、動的配列にしたり(new unsigned char[size];)とか std::vector<unsigned char> を使ったりも可能です。

    • 回答としてマーク K6963 2010年4月22日 18:16
    2010年4月22日 13:07
  • できました!

    ありがとです(^^)

     

    ただ、マネージ拡張やpin_ptrについてのヘルプを呼んだのですが、しっかりと理解できたとまではいきませんでした(^^;

    とりあえず、やりたいことはできそうなので、やってみます(笑)

    2010年4月22日 18:15