c# und c++ -> problem mit zeiger
-
ich habe eine funktion in eine dll ausgelagert und zwar deshalb weil es in c++ schneller ist. Nun hab ich aber ein Problem ich kann die dll nicht verwenden. Ich habe einen verweis aber weiter komm ich nicht:
Image^ DrawImage(Complex data[1024]){ struct Complex{ float X; float Y; };
So das wäre der c++ teil. Nun habe ich einen Verweis erstellt. Und läuft alles wunderbar. Doch nun der c# code:
AudioVisuals.BarSpectrum vis; pictureBox1.Image = vis.DrawImage(hier sollte das Array kommen)
Also wie bekomm ich mein Array nun rein.
-
Hier noch ein screen vom Problem... Hier c#:
-
-
Hmm das ganze ist noch komplizierter ich habe nämlich keinen zugriff auf das im c++ code deklarierte struct. sprich
Complex com;
com.X << X gibts nicht. hab so in c++ deklariert:public struct Complex{ public: float X; public: float Y; };
Doch jetzt frag ich mich halt wie ich das machen soll. Ist es vll. doch nicht möglich das so zu machen wie ich das wollte sprich nen 1024 großes struct array übergeben und dann dort daraus ein bild berechnen und zurück geben. Und außerdem wieso muss c++ aus jedem array und allem nen pointer machen
-
c#Problems schrieb:
Doch jetzt frag ich mich halt wie ich das machen soll. Ist es vll. doch nicht möglich das so zu machen wie ich das wollte sprich nen 1024 großes struct array übergeben und dann dort daraus ein bild berechnen und zurück geben. Und außerdem wieso muss c++ aus jedem array und allem nen pointer machen
Du musst an zwei Sachen denken: Das struct muss in C# nachgebaut werden und zwar wäre das eine Möglichkeit:
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] struct Complex { public float x, y; }
Wenn du dann das Array übergibst solltest du überlegen, ob du das nicht in einen unsafe-Block packst und das Array im unsafe-Block deklarierst. Das sollte grundsätzlich nicht notwendig sein, aber wenn du noch iwas mit Zeigern in C# rumfrickeln willst, dann läuft's darauf hinaus.
Ach ja, bei einem struct in C++ sind die Member standardmäßig public
-
1. Ich würde gerne das struct aus meinem c# teil nehmen, da das in die ganze engine integriert ist und ich da nix verändern will. Also kann man das auch in c++ so lösen?
2. Wie soll es anders gehen als mit zeigern. Es macht ja aus dem Array als übergabeparameter automatisch nen zeiger
-
c#Problems schrieb:
1. Ich würde gerne das struct aus meinem c# teil nehmen, da das in die ganze engine integriert ist und ich da nix verändern will. Also kann man das auch in c++ so lösen?
Die Aussage widerspricht sich jetzt doch mit deinem Eingangspost... rephrase, please.
2. Wie soll es anders gehen als mit zeigern. Es macht ja aus dem Array als übergabeparameter automatisch nen zeiger
Na ja, wie willst du auch sonst Arrays an Methoden übergeben, ohne dass du dir 'n Wolf kopierst? Arrays sind in .NET nicht umsonst auch Referenztypen..
Dennoch, "C++ macht aus Arrays Zeiger" ist eine falsche Aussage.
-
ok danke trotzdem ich habs jetzt mit dem array<Complex> gelöst