mit nur Teil eines Arrays
Ich habe einen dynamisch reservierten Arrays von float-und ich muss mich übergeben dieses array als argument zu drei verschiedene Funktionen, die aber jede Funktion benötigen, um einen anderen Bereich des Arrays. Gibt es eine Möglichkeit, die ich senden kann das array mit Elementen von 0 bis 23 an einer Funktion, die Elemente 24 bis 38 zum anderen, und Elemente 39 und 64, um eine Dritte Funktion.
In einigen Sprachen(wie python, denke ich), können Sie etwas wie das hier tun:
somefunction(my_array[0:23]);
somefunction(my_array[24:38]);
somefunction(my_array[39:64]);
Jedoch bin ich mit c++ und ich kenne keine Möglichkeit, dies zu tun in c++.
Weiß jemand, wie dies zu tun?
somefunction(); ist eine Funktion von einer API, also kann ich nicht ändern, die Argumente, die es braucht.
- Wie funktioniert
somefunction
wissen, wie groß das array ist? - somefunction(); ist glTexCoordPointer(); von OpenGL
- wenn Sie mit
glTexCoordPointer()
nur passmy_array + n
. - Nur bearbeitet meine Antwort nachdem ich es jetzt erwähnen
glTexCoordPointer()
. Wenn Sie alle anderen code für die Zeichnung etwas nach der Einstellung der textur, die Sie sollte hinzufügen, Sie zu Ihrer Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den python-Beispiel ist die Herstellung von Kopien. Wenn das in Ordnung für Ihren Fall, Sie könnte so etwas tun (ich tausche aus Ihrem Vanille-arrays für std::vector):
welche Ausgänge:
Aber es klingt wie Sie nicht verwenden können, std::vector, da somefunction() hat eine Signatur, die Sie nicht ändern können. Zum Glück, Sie tun können, ähnlich wie gymnastik nur manuell kopieren Teile der Reihe, wie unten:
die wieder-Ausgänge:
Wenn Sie schreiben, die Funktionen zum Betrieb auf einem paar von forward-Iteratoren statt ein array, Sie könnten nur pass es so:
Zeiger forward-Iteratoren, und dies würde es ermöglichen, die Funktionen verwendet werden, die über Teile von Vektoren, queues, oder anderen STL-Containern als gut.
end()
iterator, bist du nicht ausschalten, indem man?Ihre Funktion gehen zu müssen einige Weg, um zu bestimmen, die Größe des Arrays sowieso. Ich schlage vor, Sie machen die Funktion take begin-und end-Iteratoren, im Stil der standard-Bibliothek algorithmen, etwa so:
Dann rufen Sie es mit Ihrem array wie dieses:
Gibt es zwei Möglichkeiten, wie Sie es tun könnte:
ODER
Das erste ist eher ein C-Weg, die zweite eine mehr C++ Weg. Beachten Sie, dass mit dem zweiten Weg, der Bereich ist
[start, end)
-end
ist nicht im Lieferumfang enthalten, wie Sie sehen, eine Menge in C++.EDIT: Sie Ihren Beitrag bearbeitet zu erwähnen, dass Sie verwenden
glTexCoordPointer()
. In diesem Fall übergeben Sie den Anfang des Arrays zuglTexCoordPointer()
, die entwedermyArray
,myArray + 24
odermyArray + 39
.Die Größe des Arrays noch bekannt, obwohl, und ist an Funktionen wie
glDrawArrays
oderglDrawElements()
, die dann beginnen, Lesen aus dem array. Wenn Sie wurden mitglDrawArrays()
, die Länge des Arrays übergeben, als zweites argument. Daher könnte der code so etwas wie:use( myarray + 0, myarray + 23 )
my_array + 24
wird es scheinen, als ob der Anfang des Arrays.Gibt es keine Obere Grenze Bereich überprüfen, so müssen Sie aufpassen, dass Sie sich. Aber Sie können pass &my_array[0] zu einer Funktion, und &my_array[24] zu einem anderen. Vielleicht fügen Sie ein len-parameter an Ihre Funktion zu kümmern oberen Bereich.
Könnte man umgestalten Funktionen für die Verwendung von 'Iterationen': ein Zeiger auf den begin und das Ende des array-Bereichs, der Sie interessiert:
Bonus Punkte: wenn Sie Ihre Funktion eine Vorlage, die Sie verwenden können, es mit anderen Iteratoren zu:
...