Ich habe eine Funktion in C++ geschrieben, die ich in eine DLL einfügen und in C# mit DllImport verwenden. Funktioniert alles; Ich bin in der Lage, den Rückgabewert von C++ zu erhalten und es in meinem C# GUI anzuzeigen. Jetzt möchte ich zu dieser Funktion hinzufügen und es mehrere Werte zurückgeben (3 bisher). Ich habe die Methoden versucht, die in Return C++ array to C# und How to return two different variable in c++? gegeben werden, aber keiner funktioniert. Der Code aus dem ersten Post gibt mir einen Zugriffsverletzungsfehler und der Code aus dem zweiten gibt mir alle 0 Werte für die Struktur. Für den ersten kopierte ich sogar den gegebenen Code genau und versuchte, ihn auszuführen, aber ohne Erfolg. Was könnte die Fehler und falschen Werte verursachen, die durch diese Methoden gegeben werden? Wie kann ich sie zur Arbeit bringen?Rückgabe von Arrays und Strukturen aus einer C++ Funktion in C#
Nur für den Fall, dass es erforderlich ist, ist mein eigener Code mit der Umsetzung der zweiten Post unten.
bisection.h
struct Result
{
double root;
double relError;
double absError;
}result;
extern "C" {__declspec(dllexport) Result bisection(double l, double u, double stoppingError, int maxIter); }
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# -Code
[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);
Ihr Header hat 'Bisection' und gibt ein' double' zurück, während die Implementierung ein 'Result' zurückgibt. – PaulMcKenzie
Ah! Ein Fehler, als ich meinen Code bearbeitet habe, um ihn hier zu posten. Ich habe es behoben. – Aeleon
Vielleicht wäre es besser, das Ergebnis als out-Parameter zu übergeben, anstatt es zurückzugeben, und den C++ - Code mit dem 'Result' zu füllen. Dies würde im Modell folgen, wie Sie Windows-API-Funktionen aufrufen, die "eine Struktur zurückgeben müssen" (wie "GetMessage") – PaulMcKenzie