Falsche Werte, die mit SWIG als Parameter an die C-Bibliothek übergeben wurden

Im Anschluss an meinedrei Bisherige BeiträgeKann ich jetzt ein verwaltetes Array von struct an meine umschlossene Methode übergeben. Hier ist ein Auszug aus den Dateien:

// packer.i
typedef struct {
  int width; // input
  int height; // input
  frame_t view; // output
  frame_t dest; // output
} image_t;

CSHARP_ARRAYS(image_t, image_t)
%apply image_t INOUT[] { image_t *images }

int pack(image_t *images, int nb_images, parameters_t params);

Was erzeugt eine Funktion mit dieser Signatur:

// packer_cs.cs
public static int pack(image_t[] images, int nb_images, parameters_t arg2)

Was ich so nenne:

// Program.cs
var files = Directory.GetFiles("./images");
var images = new image_t[files.Length];
for (var f = 0; f < files.Length; f++)
{
    using (var imgInfo = Image.FromFile(files[f]))
    {
        var imgStruct = new image_t()
                        {
                            width = imgInfo.Width,
                            height = imgInfo.Height,
                            dest = new frame_t(),
                            view = new frame_t()
                        };
        images[f] = imgStruct;
    }
}
var result = packer_cs.pack(images, images.Length, new parameters_t());

Alles ist gut und erledigt, aber wenn ich das laufen lassepack() habe ich ein Problem mit dem geschützten Speicherzugriff (System.AccessViolationException). Zum Glück habe ich Zugriff auf den Quellcode der C-Bibliothek und Visual Studio öffnet ihn automatisch zum Debuggen und Durchlaufen, sobald ich das Debuggen von nicht verwaltetem Code aktiviere.

Also, wenn ich zu Beginn der einen Haltepunkt hinzufügepack() Funktion, und ich benutze eine Uhr, um zu überprüfenimages[x]Ich kann sehen, dass die Werte für Breite und Höhe nichts mit den bereitgestellten Werten zu tun haben (manchmal ist es sogar 0 oder negativ). Was ist los ? Wenn ich mein verwaltetes Array auf der C # -Seite inspiziere, werden die Werte korrekt gespeichert und abgerufen. Warum erhält C nicht die richtigen Werte? Die anderen Parameter (nb_images und params) haben kein Problem.

Dankeschön !

Antworten auf die Frage(1)

Ihre Antwort auf die Frage