5 Stimmen

Zeiger auf verwaltetes Array in C++/CLI

Also gut, ich weiß, wie man normalerweise einen Zeiger deklariert:

void SomeFunction(array<float> ^managedArray)
{
  pin_ptr<float> managedArrayPtr = &managedArray[0];
}

Dies funktioniert gut, außer wenn managedArray keine Elemente enthält. In diesem Fall wird eine IndexOutOfRangeException ausgelöst.

In C# können Sie dies tun:

void SomeFunction(float[] managedArray)
{
  fixed (float* managedArrayPtr = managedArray)
  {
  }
}

Dies erfordert keinen Speicherzugriff und funktioniert auch, wenn managedArray leer ist. Muss ich wirklich überall, wo ich Zeiger auf verwaltete Arrays verwende, die Anzahl der Elemente überprüfen, oder hat C++/CLI eine Möglichkeit, dies wie C# zu tun? Es sollte die 'lea'-Anweisung in ASM verwendet werden, die keinen Speicherzugriff erfordert.

Jede Hilfe ist sehr willkommen!

3voto

Hans Passant Punkte 894572

Der Versuch, aus dem Array zu lesen, wenn es leer ist, ist nicht sehr sinnvoll. Prüfen Sie einfach, ob das der Fall ist:

void SomeFunction(array<float> ^managedArray)
{
    if (managedArray->Length > 0) {
        pin_ptr<float> managedArrayPtr = managedArray;
        //etc...
    }
}

1voto

Brian Gideon Punkte 46450

Gute Frage. Leider bin ich nicht so vertraut mit C++/CLI. Ich weiß aber, dass man das Pinning manuell mit der GCHandle struct und funktioniert bei leeren Arrays. Es ist nicht so elegant wie die Verwendung von pin_ptr Allerdings.

void SomeFunction(array<float> ^managedArray) 
{ 
 GCHandle handle = GCHandle::Alloc(managedArray, GCHandleType::Pinned);
 try 
 {
  float* ptr = (float*)(void*)handle.AddrOfPinnedObject();
 }
 finally
 {
  handle.Free();
 }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X