C++/CLI, C# und die pointer
-
Hi, da ich in meinem C++/CLI & C# - Projekt oft irgendweclhe managed arrays (array<float>^ ) habe, die ich dann in ein Pointer umwandeln ( float* ) muss und umgekehrt, suche ich dazu eine geeignete methode, eine klasse, die das schnell und gut kann.
Gibts da was?
PS: wie das rumkopieren geht weiß ich
int* n2 = (int*)ilGetData(); array<int>^ out = gcnew array<int>(size); for(int i = 0; i < size; i++) { out[i] = n2[i]; }
-
Was genau ist deine Motivation dafür, array<float>^ als float* zu benutzen? Vielleicht bist du besser dran, wenn du gleich ein gewöhnliches Array benutzt. Oder vielleicht machst du etwas umständlich (beispielsweise kopieren mit memcpy), obwohl es mit dem managed array einfacher gehen würde.
-
Hie mal ein Beispiel. Es geht darum eine Textur mit DevIL zu laden.
void Load(Stream^ input, String^ fileName) { int imageID; // Erst mal IL initialisieren ilInit(); ilEnable(IL_FILE_OVERWRITE); ilGenImages(1, (ILuint*)&imageID); ilBindImage(imageID); // Dann lesen wir den Inhalt des Files in einen Buffer "in" ein. array<Byte>^ in = gcnew array<Byte>(input->Length); input->Read(in, 0, in->Length); // Müssen den nun dummerweise in einen unmanaged Buffer umwandeln int* n = new int( in->Length ); for(int i = 0; i < in->Length; i++) { n[i] = in[i]; } // Wir laden die Textur aus dem buffer. ilLoadL(IL_DDS, n, in->Length); delete n; // Lesen die Daten aus int bpp = ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL); int width = ilGetInteger(IL_IMAGE_WIDTH); int height = ilGetInteger(IL_IMAGE_HEIGHT); int size = bpp * width * height; // Und wandeln es zurück in managed Daten. int* n2 = (int*)ilGetData(); array<int>^ out = gcnew array<int>(size); for(int i = 0; i < size; i++) { out[i] = n2[i]; } ilDeleteImages(1, (ILuint*)&imageID); }
-
Ich weiss, dass das jetzt schon einige Zeit her ist, aber wenn du direkt auf verwalteten Speicher zugreifen willst, brauchst du cli::pin_ptr.
Byte *Unmanaged; cli::array<Byte> ^Managed = gcnew cli::array<Byte>(800); cli::pin_ptr<Byte> Pinned = &Managed[0]; Unmanaged = Pinned;
Einen cli::pin_ptr kannst du ohne hässliche Hacks nicht als Rückgabetyp einer Funktion benutzen, auch Zeiger darauf sind verboten.
-
User6457585668679987 schrieb:
Ich weiss, dass das jetzt schon einige Zeit her ist, aber wenn du direkt auf verwalteten Speicher zugreifen willst, brauchst du cli::pin_ptr.
Byte *Unmanaged; cli::array<Byte> ^Managed = gcnew cli::array<Byte>(800); cli::pin_ptr<Byte> Pinned = &Managed[0]; Unmanaged = Pinned;
Einen cli::pin_ptr kannst du ohne hässliche Hacks nicht als Rückgabetyp einer Funktion benutzen, auch Zeiger darauf sind verboten.
es geht doch hier um C# - nicht um C++
vielleicht hilft das:
http://www.mycsharp.de/wbb2/thread.php?threadid=11816&hilightuser=3001
-
Vertexwahn schrieb:
es geht doch hier um C# - nicht um C++
Wie kommst du darauf? Wenn du den Code auch nur ansatzweise angeschaut hättest, hättest du gesehen dass es C++ ist
. Die Möglichkeiten, die in der Hilfe beschrieben sind, beziehen sich auf C#, werden in C++ nicht benötigt oder sind veraltet.
-
@User6457585668679987
lesen muss geübt sein