2016-08-04 27 views
1

私は関数をC++で書いています。これはdllに入れて、C#でDllImportを使っています。すべてがうまくいく。私はC++から戻り値を取得し、それを私のC#GUIに表示することができます。今私はその関数に追加し、複数の値を返すようにしたい(3つまで)。私はReturn C++ array to C#How to return two different variable in c++?で与えられたメソッドを試しましたがどちらも動作しません。 最初の投稿のコードは私にアクセス違反エラーを与え、2番目のコードフォームは構造体のすべての0の値を返します。最初のコードでは、指定されたコードを正確にコピーして実行しようとしましたが、無駄にしました。これらのメソッドによって与えられたエラーと間違った値の原因は何ですか?どうすればそれらを働かせることができますか?配列と構造体をC++関数から返す#

場合によっては、2番目の投稿を実装した自分のコードは以下のとおりです。

bisection.cpp

Result bisection(double l, double u, double stoppingError, int maxIter) { 
//code for this function 
result.root = xr; 
result.relError = e; 
result.absError = 1;  
return result; 
} 

C#コード

[StructLayout(LayoutKind.Sequential)] 
    public struct Result 
    { 
     public double root; 
     public double relError; 
     public double absError;    
    } 
    [DllImport(dllPath)] 
    private static extern Result bisection(double l, double u, double stoppingError, int maxIter); 

Result result = bisection(data[0], data[1], 0.1, 100); 
+0

ヘッダーには 'bisection'が' double'を返しますが、実装は 'Result'を返します。 – PaulMcKenzie

+0

ああ!ここに投稿するコードを編集していたときの間違い。私はそれを修正しました。 – Aeleon

+0

Resultを返す代わりにoutパラメータとして渡し、渡されたC++コードに 'Result'を記入する方が良いかもしれません。これは、 "GetMessage'のように"構造体を返す "必要があるWindows API関数を呼び出す方法のモデルに従います。 – PaulMcKenzie

答えて

1

struct Result 
{ 
    double root; 
    double relError; 
    double absError; 
}result; 
extern "C" {__declspec(dllexport) Result bisection(double l, double u, double stoppingError, int maxIter); } 

bisection.hあなたのコードは、ほぼ正しいです。呼び出し規約の不一致があります。 C++コードはC#stdcallであるcdeclを使用します。一致するように1つを変更します。

+0

うん、そうだった。これがそれでした。私は、いくつかのオンラインソースからコードを貼り付けてコピーしています。私が自分のニーズに合わせて編集していた間に、私はそれを混乱させていたに違いありません。私は呼び出し規約とデフォルトのstdcallを読みました。あなたの指示に従って、コードを変更した後、コードが機能しました。ありがとう – Aeleon

関連する問題