Laden...

C++ DllImport 2D Array Daten nach C# 2D Array ?

Erstellt von ati_sah vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.305 Views
Thema geschlossen
A
ati_sah Themenstarter:in
8 Beiträge seit 2013
vor 10 Jahren
C++ DllImport 2D Array Daten nach C# 2D Array ?

Hallo,

ich habe ein my.dll (Borland C++), wo er ein 2D int iTMJ [5][12] Array mit Daten zurückliefert:

 extern "C" MP5 Berechne(int iM, int iJ);

 struct MP5
 {
    int iTMJ[5][12];
 };

 MP5 iTMJ;

 MP5 _export Berechne(int iM, int iJ)
 {
    ArrayFüllung...
    return(iTMJ);
 }

 public struct MP5 { public static int[,] iFelder = new int[5, 12];}

 MP5 iTMJ;

 [DllImport("my.dll", EntryPoint = "Berechne", CallingConvention = System.Runtime.InteropServices.CallingConvention.C decl, CharSet = CharSet.Auto, SetLastError = true)]
 public static extern MP5 Berechne(int iM, int iJ);

Am Ende rufe ich die im my.dll enthaltene Funktion auf und übergebe auch Daten:

 iTMJ = Berechne(12, 2013);

Bei der letzten Zeile, wo ich die Funktion aufgerufen wird, stürzt er ab und die 2D Daten werden nicht dem C# iTMJ zugewiesen warum ?

MFG

R
212 Beiträge seit 2012
vor 10 Jahren

ich würde mal grob sagen, dass das struct "MP5" nicht derselbe datentyp ist wie der den du zurück bekommst.

Tipp: speicher das ganze in ein object, setz ein Haltepunkt und schau die den Datentyp mal genauer an den du da zurück bekommst.

Edit:
Ich weiß jetz nich wie das in c++ is, aber schau dir mal den unterschied zwischen "Jagged Arrays" und "2D Arrays" an (Jagged[][];2D[,]).

W
872 Beiträge seit 2005
vor 10 Jahren

Auf jeden Fall muss das static bei MP5 beim c# struct weg.
Probier mal:


public struct MP5 {
[MarshalAs(UnmanagedType.LPArray, SizeConst=5*12)] 
public int[,] iFelder;
}

Oder ansonsten mal Default Marshaling for Arrays anschauen und probieren....

1.346 Beiträge seit 2008
vor 10 Jahren

Ansonsten sollte auch so etwas in der Art funktionieren wenn ich mich nicht irre:


struct MP5{
    public fixed int iFelder[5, 12];
}

A
ati_sah Themenstarter:in
8 Beiträge seit 2013
vor 10 Jahren

Hallo,

  1. bei dem Kollegen Pdelvo gibt ein Compilerfehler.

  2. beim Kollegen Weismat gibt's kein Absturz aber die Daten werden nicht in dem int [,] kopiert.

MFG

2.298 Beiträge seit 2010
vor 10 Jahren

Was sagt den der Compilerfehler? Kannst du dem Compilerfehler nicht entnehmen, wie du es richtig machst?

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

1.346 Beiträge seit 2008
vor 10 Jahren

Einmal kurz googeln und dann hättest du doch schon rausgefunden woran es liegt, und wie man es löst: Multidimensional Arrays in a struct in C#

A
ati_sah Themenstarter:in
8 Beiträge seit 2013
vor 10 Jahren

struct MP5{
     public fixed int iFelder[5, 12];
 }
 

Compilerfehler:
nach 5 beim ",": Syntaxfehler. ']' erwartet.
beim 12: Bezeichner erwartet.

MFG

16.834 Beiträge seit 2008
vor 10 Jahren

a) unsafe-Implementierungen gehen auch nur im unsafe-Context
b) mehrdimensional funktioniert bei fixed nicht. Dazu muss * verwendet werden (siehe auch Link von pdelvo)
c) Fehlermeldungen immer direkt posten [Hinweis] Wie poste ich richtig? Punkt 5
d) ein wenig mehr Eigeninitiative Default Marshaling for Arrays - gerade bei PInvoke + unsafe context solltest Du genau wissen, was Du tust und nicht "irgendwas" probieren

A
ati_sah Themenstarter:in
8 Beiträge seit 2013
vor 10 Jahren
public struct TMP5
    {
      [MarshalAs(UnmanagedType.LPArray, SizeConst = 5 * 12)]
      public int[,] iFelder;
    } 

    TMP5 iTMJ = new TMP5();

    [DllImport("my.dll", EntryPoint = "Berechne", CallingConvention = System.Runtime.InteropServices.CallingConvention.C decl, CharSet = CharSet.Auto, SetLastError = true)]
    public static extern MP5 Berechne(int iM, int iJ); 


    iTMJ = Berechne(1, 2014);

Mit Marshaling kenne ich mich leider nicht aus.

MFG

Hinweis von Coffeebean vor 10 Jahren

Entschuldige, aber mit "gibt einen Compilerfehler", "er stürzt ab" und "kenne ich mich nicht aus" hast du leider bewiesen, dass du die geforderte Eigeninitiative nicht an den Tag legst und auch den schon erwähnten [Hinweis] Wie poste ich richtig? Punkt 5 und gefühlt auch Punkt 4 nicht beachtest.

Du hast genug Stichworte um dich gezielt auf die Suche einer Lösung zu machen.

Daher ist hier erstmal zu.

Thema geschlossen