array<> Problem mit der Syntax
-
Jetzt ist er da, der Knoten im Hirn.
Hier ist ein Stück Code, bei dem ich langsam nicht mehr weiss, was wie geändert werden muss, damit ich nicht diesen Fehler bekomme:
IndexOutOfRangeException
array<Direct3D::CustomVertex::PositionNormalTextured, 1>^ myVertices = gcnew array<Direct3D::CustomVertex::PositionNormalTextured, 1> (myMesh->NumberVertices); myVertices = safe_cast<array<Direct3D::CustomVertex::PositionNormalTextured, 1>^> (myMesh->VertexBuffer->Lock(0, Direct3D::CustomVertex::PositionNormalTextured::typeid, Direct3D::LockFlags::None));
Ich weiss eines leider nicht:
Ob sich die Grösse des arrays wirklich aus myMesh->NumberVertices ergibt bzw. ob durch diese Initialisierung das array richtig befüllt wird. Wobei ich auf diese Art und Weise ein array mit 512 Elementen bekomme und auch ein Test mit einer Grösse von z.B. 10000 Elementen den selben Fehler erzeugt.Das Beispiel ist 1:1 von einem c# Beispiel übernommen. Dort sieht die Initialisierung so aus:
CustomVertex.PositionNormalTextured[] verts = (CustomVertex.PositionNormalTextured[])_mesh.VertexBuffer.Lock( 0, typeof( CustomVertex.PositionNormalTextured ), LockFlags.None, _mesh.NumberVertices );
Es sieht für mich so aus, als müsste ich obiges Befüllen mit gcnew vornehmen. Nur leider habe ich da (mit safe_cast dazu) ein Problem mit der Syntax und weiss nicht, wie diese Mammutzeile dann aussehen müsste.
Ich hoffe, jemand weiss Rat oder kann mir sagen, wie ich dem Problem auf die Spur kommen kann.
-
OK, erste Zeile legt eine Referenz an, der dann auch gleich ein Array zugewiesen wird. In er nächsten Zeile wird dann das gerade erst angelegte Array wieder verworfen und der Referenz statdessen etwas anders zugewiesen.
Das macht nciht wirklich Sinn.
Wieso bekommt die C#-Methode Lock ein Argument mehr übergeben, als die C++ Verion?
Funktioniert denn vielleicht:
array<Direct3D::CustomVertex::PositionNormalTextured>^ myVertices = safe_cast<array<Direct3D::CustomVertex::PositionNormalTextured>^> (myMesh->VertexBuffer->Lock(0, Direct3D::CustomVertex::PositionNormalTextured::typeid, Direct3D::LockFlags::None, myMesh->NumberVertices));
-
Ja - das funktioniert
Ich kam gerade zurück, weil ich zumindest einen Fehler bei mir entdeckt hatte:
array<..., 1>
war dumm, denn natürlich brauche ich dort mehrere Dimensionen. Namentlich ist sogar CharMesh->NumberVertices der Wert, denn die Länge einer Dimension ist dann eben schon ein Vektor.
Ohne diesen Wert hatte ich es versucht. Das gab natürlich den gleichen Fehler. Mit diesem Wert funktioniert es. Dieser steht in einer Überladung als
cli::array<int, 1>^ranks
Etwas verwirrend.
Danke Helium