This is documentation for Mathematica 4, which was
based on an earlier version of the Wolfram Language.
View current documentation (Version 11.1)

 Documentation /  Mathematica /  Das Mathematica Buch /  Die Prinzipien von Mathematica /  MathLink und externe Programm-Kommunikation /

Spezialthema: Ausführen externer Programme unter einem DebuggerFortgeschrittenes Thema: Fehler- und Interrupt-Behandlung

2.12.12 Manipulieren von Ausdrücken in externen Programmen

Mathematica-Ausdrücke bieten eine sehr generelle Art und Weise, um alle Arten von Daten zu handhaben. Manchmal wollen Sie vielleicht solche Ausdrücke innerhalb Ihres externen Programms verwenden. Eine Programmiersprache wie C bietet jedoch keinen direkten Weg, um allgemeine Mathematica-Ausdrücke zu speichern. Dies wird aber dennoch möglich, wenn man die von der MathLink-Bibliothek zur Verfügung gestellten Loopback-Links einsetzt. Ein Loopback-Link ist eine lokale MathLink-Verbindung innerhalb Ihres externen Programms, in die Sie Ausdrücke hineinschreiben können, die später zurückgelesen werden können.

Funktionen zum Manipulieren von Loopback-Links

...

Dies öffnet einen Loopback-Link.

ml = MLLoopbackOpen(stdenv, &errno);

Dies bringt den Ausdruck Power[x, 3] zum Loopback-Link.

MLPutFunction(ml, "Power", 2);

MLPutSymbol(ml, "x");

MLPutInteger(ml, 3);

...

Dies holt einen Ausdruck vom Loopback-Link zurück.

MLGetFunction(ml, &head, &n);

MLGetSymbol(ml, &sname);

MLGetInteger(ml, &k);

...

Dies schließt den Loopback-Link wieder.

MLClose(ml);

Mit MLTransferExpression() läßt sich ein Ausdruck, den Sie von Mathematica über stdlink erhalten haben, in einem lokalen Loopback-Link für eine späteren Verarbeitung aufbewahren.

Mit MLTransferExpression() läßt sich auch ein Ausdruck, den Sie in einem lokalen Loopback-Link konstruiert haben, via stdlink zu Mathematica zurückübertragen.

...

Dies legt 21! in einem lokalen Loopback-Link ab.

MLPutFunction(ml, "Factorial", 1);

MLPutInteger(ml, 21);

Dies sendet den Kopf FactorInteger zu Mathematica.

MLPutFunction(stdlink, "FactorInteger", 1);

Dies überträgt 21! aus dem Loopback-Link zu stdlink.

MLTransferExpression(stdlink, ml);

Jede beliebige Folge von Ausdrücken läßt sich in einem Loopback-Link ablegen. Normalerweise erhalten Sie die Ausdrücke aus dem Link in der gleichen Reihenfolge, in der sie hineingelegt wurden.

Wenn erst einmal ein Ausdruck aus einem Link herausgenommen wurde, wird er normalerweise nicht mehr länger gespeichert. Mit MLCreateMark() können Sie aber eine bestimmte Position in einer Folge von Ausdrücken im Link markieren, und so MathLink zwingen, jeden Ausdruck hinter der Marke zu speichern, so daß Sie später auf ihn zurückgreifen können.

Erzeugen von Marken in MathLink-Links

...

Dies legt die ganze Zahl 45 in einem Loopback-Link ab.

MLPutInteger(ml, 45);

Dies legt 33 auf den Link.

MLPutInteger(ml, 33);

Und dies legt 76 ab.

MLPutInteger(ml, 76);

Dies liest 45 aus dem Link. Die 45 wird nicht länger gespeichert.

MLGetInteger(ml, &i);

Dies erzeugt eine Marke an der aktuellen Position im Link.

Marke = MLCreateMark(ml);

Dies wird jetzt 33 lesen.

MLGetInteger(ml, &i);

Und dies wird 76 lesen.

MLGetInteger(ml, &i);

Hiermit wird zur Position der Marke zurückgegangen.

MLSeekMark(ml, Marke, 0);

Dies liest noch einmal 33.

MLGetInteger(ml, &i);

Wenn Sie die Operation beendet haben, sollten Sie die Marken entfernen, damit keine unnötigen Ausdrücke gespeichert werden.

MLDestroyMark(ml, Marke);

Durch die Art der Implementierung der MathLink-Bibliothek kann man sehr wirkungsvoll Loopback-Links öffnen und schließen sowie in Ihnen Marken erzeugen und entfernen. Man sollte nur einen Punkt bedenken: Sobald man eine Marke in einem bestimmten Link erzeugt hat, wird MathLink die nachfolgenden im Link abgelegten Ausdrücke speichern, und dieses so lange, bis die Marke entfernt wird.

Funktionen zum Holen von Teilen von Ausdrücken aus einem Link

Konstanten, die von MLGetNext() zurückgegeben werden

switch(MLGetNext(ml)) {

Dies liest eine zusammengesetzte Funktion.

case MLTKFUNC:

MLGetArgCount(ml, &n);

Rekursion für den Kopf

for (i = 0; i < n; i++)

Rekursion für jedes Argument



...

Dies liest ein einzelnes Symbol.

case MLTKSYM:

MLGetSymbol(ml, &name);

...

Dies liest eine ganze Zahl in Maschinengröße.

case MLTKINT:

MLGetInteger(ml, &i);

...

}

Mit MLGetNext() lassen sich ohne weiteres Programme schreiben, die einen beliebigen Ausdruck lesen können. MathLink funktioniert so, daß der Kopf und die Argumente einer Funktion im Link als aufeinanderfolgende Ausdrücke erscheinen, die Sie nacheinander lesen.

Wenn man weiß, daß der Kopf einer Funktion ein Symbol sein wird, kann MLGetFunction() an Stelle von MLGetNext() verwendet werden. In diesem Fall müssen Sie jedoch noch MLDisownSymbol() aufrufen, um den Speicher freizugeben, der zum Speichern des Symbolnamens verwendet wurde.

Funktionen zum Ablegen von Teilen von Ausdrücken im Link

MLPutNext() spezifiziert, genauso wie MLGetNext(), Typen von Ausdrücken mit Konstanten, wie zum Beispiel MLTKFUNC aus der mathlink.h-Header-Datei.

Spezialthema: Ausführen externer Programme unter einem DebuggerFortgeschrittenes Thema: Fehler- und Interrupt-Behandlung