2017-01-05 10 views
0

私はC++を学んでおり、戻り値の型として配列を持つことは不可能です。これは本当ですか?C++で戻り値の型として配列を持つことはできませんか?代替案?

int foo(){} 

正常に動作しますが、

int[] foo(){} 

はしていません。これには一般に認められている作業は何ですか?

私は現在、C#とC++の両方を使用するプロジェクトに取り組んでいます。 .cppファイルがあるの内側に

TEST_DLL BYTE[][] getBytes(std::string filePath, std::string dataGroup); 
/* This throws an error since I can't use an array as a return type. */ 

と私の実装:

TEST_DLL BYTE[][] getBytes(std::string filePath, std::string dataGroup) 
{ 
    printf("getBytes entered." 

    /* More code here...*/ 
} 

/* This also throws an error due to the array use. */ 

基本的には、

[DllImport("Test.dll")] 
public static extern byte[,] getBytes(
    [In] string filePath, 
    [In] string dataGroup); 

私のヘッダファイルがあります:私はいくつかのDLLのコードにアクセスするC#ファイルを持っています私は、DLLコードから2Dバイト配列を返すことを試みています。つまり、C#側で何かを変換する必要はありません。つまり、getBytesに関連するすべてのコード実行がC++コードで発生するはずです。

私は配列を使用せず、むしろvoid *を使用していますが、これは私が理解しているところから戻ってくる配列へのポインタです。次に、IntPtrとMarshal.Copyを使用してバイト配列を取得するC#関数があります。私は2つの方法のオーバーヘッドの違いを判断しようとしています。追加のC#変換コード(私が使用しているデータセットは巨大です - 500GBを超えるもので、最適化カウントを少しずつ)を使用するのではなく、C++コードから2Dバイト配列を直接返す方がはるかに速いと思います。

基本的に、私はC++でコードを変換せずに2Dバイト配列を純粋にC++コードから取得できますか?

+0

int * foo(){}は動作します – Steve

+0

C++では、* you *は配列を返すことができないので、 'std :: vector'を使用してください。 –

+0

それはC#と相互作用するつもりはないと思いますが、私は考えていませんか? –

答えて

2

次の2つの別々の問題を有する:C#の相互運用C/C++関数(メソッド)

  • から配列を返す

    1. を。

    #1を発行するソリューションは多数あります。おそらく最良の方法は、ベクトルを返すことです(データをコピーしたい場合)またはベクトルへの参照を返します(戻り値が "永遠"に残っている場合))ベクトルへの参照を渡すこともできますパラメータとして使用し、関数内のベクトルに値を設定します。

    問題#2:C#配列はC++のネイティブデータ型ではないため、データを適切なC#型に「マーシャリング」するための特別な目的のコードが必要です。詳細は、this questionを参照してください。

  • +0

    データをマーシャリングする必要性を排除する方法はありますか? – Roka545

    +1

    何かがC#配列であるために必要な基準があります。それらが満たされていない場合は、C#配列ではなく、本当に厄介なことが起きるように使用しようとすると起こります。明らかに、データを配列にマーシャリングすることを伴わないC++からC#に情報を渡す方法はあります。 IntPtrを使用すると、C#でC++スタイルの生データにアクセスできるようになります。ただし、どのアプローチをとっても、C++やC#で使用されるさまざまなメモリモデルに対応するには、インターフェイスの一方または他方にコードを書く(または既存のコードを使用する)必要があります。 –

    +2

    配列のサイズがわかっている場合は、1つの方法があります。次に、C#で作成し、パラメータとしてC++に送信することができます。さまざまな方法で[pinvokeを使ったマーシャリングアレイ](https://msdn.microsoft.com/en-us/library/bd99e6zt.aspx)も参照してください。 –

    関連する問題