.. highlightlang:: us .. _uniscript-r2011: UniScript R2011 =============== In UniScript wurde eine Reihe von Änderungen durchgeführt. * Auf Matrizen in Objekten kann nun zugegriffen werden, wie auf andere Matrizen auch. Sie brauchen nicht mehr zunächst in eine Variable kopiert werden. * Variant-Matrizen können nun einfacher verwendet werden, weil nun beim Zugriff eine Typumwandlung durchgeführt wird. Variant-Matrizen können auch UniScript-Objekte enthalten. Es gibt vier neue Funktionen für Variant-Matrizen: :ref:`vmatrix`, :ref:`vconvert`, :ref:`vtype`, :ref:`vcast`. * Arrays und Matrizen von COM-Objekten werden nun über Variant-Matrizen erzeugt. * Copy-on-write (COW) Optimierung. Matrizen in UniScript-Objekten ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Matrizen in UniScript-Objekten mussten in UniScript bisher in eine Variable kopiert werden. Nach der Bearbeitung mussten sie dann zurück kopiert werden. Der folgende Code war bisher nicht möglich:: a = [.]; a.val = rand(2,2); a.val[1] = 55; sondern man musste sich so behelfen:: a = [.]; val = rand(2,2); tmp = a.val; tmp[1] = 55; a.val = tmp; Variant-Matrizen ~~~~~~~~~~~~~~~~ In UniScript können Matrizen und Vektoren erzeugt werden, deren Elemente unterschiedliche Typen haben. Beispiel:: v = vmatrix(5,1) erzeugt eine Variant-Matrix mit 5 Zeilen und einer Spalte die Nullen enthält. In die Elemente können nun Werte unterschiedlichen Typs geschrieben werden:: v[1] = 123; v[2] = "Nm"; v[3] = 1+2i; v[4] = CreateObject("Excel.Application"); v[5] = [. a = 1:5]; Wird auf ein Element zugegriffen, wird es in den Basistyp umgewandelt:: print type(v[1]) == "real" // liefert TRUE (1) v[5].b = 1:3 // fügt dem Objekt v[5] die Variable "b" zu Wird auf mehrere Elemente der Variant-Matrix zugegriffen und die Elemente haben unterschiedliche Basistypen erhält man wieder eine Variant-Matrix:: v2 = v[1:3]; // v2 ist Variant-Matrix Sind die Basistypen gleich, erhält man eine Matrix des Basistyps:: v[2:3] = [11,12]; a = v[1:3]; // a ist der Zahlenvektor [123, 11, 12] Mit dem colon-Operator kann auf alle Elemente zugegriffen werden, die Anweisung :: v[:] = 0; setzt alle Elemente auf 0. Das Format und der Typ der Matrix wird nicht geändert. Mit :ref:`vconvert` kann eine vorhandene Matrix in eine Variant-Matrix umgewandelt werden. :ref:`vtype` liefert die Typen der Elemente der Variant-Matrix als Zahlenmatrix. .. list-table:: :header-rows: 1 * - Wert - Bedeutung * - 0 - Real-Zahl * - 1 - String * - 2 - Complex * - 4 - COM-Object-Pointer * - 5 - Pointer auf ein Uniscript-Object Mit :ref:`vcast` kann eine Variant-Matrix in einen anderen Typ umgewandelt werden. Die meisten Operatoren können auf Variant-Matrizen nicht angewendet werden. Dazu müssen bei Bedarf eigene Funktionen geschrieben werden. COM-Objekte ~~~~~~~~~~~ Bisher konnten Matrizen von COM-Objekten erzeugt werden. Matrizen von COM-Pointern können nun über Variant-Matrizen erzeugt werden:: xls = CreateObject("Excel.Application"); up = CreateObject("UniPlot.Application"); Die folgende Zeile erzeugt nicht mehr eine Matrix von COM-Pointern, sondern eine Variant-Matrix:: com = [xls, up]; Copy-on-write ~~~~~~~~~~~~~ Bei Zuweisungen von Matrizen an Variablen wird die Matrix nun nicht mehr kopiert, sondern es wird nur ein Zeiger auf die Matrix kopiert. Erst wenn die Matrix verändert wird, wird eine Kopie erzeugt. Dadurch wird eine höhere Performance erreicht, wenn nur lesend auf die Matrix zugegriffen wird:: a = rand(1000,1000); b = a; // Es wird keine Kopie von a erzeugt b[1] = 1; // Erst wenn b geändert wird, wird a nach b kopiert Mit der folgenden Anweisung kann das Kopieren erzwungen werden:: b = a; b[1] = b[1]; :sub:`id-102742`