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: Kommunikation mit Mathematica-BenutzeroberflächenSpezialthema: Ausführen von Programmen auf anderen Computern

2.12.9 Zweiweg-Kommunikation mit externen Programmen

Wenn Sie ein MathLink-kompatibles externes Programm mit Install installieren, wird das Programm so eingerichtet, daß es sich in etwa wie ein vereinfachter Mathematica-Kern verhält. Jedesmal, wenn Sie eine Funktion im externen Programm aufrufen, wird ein CallPacket zum Programm gesandt. Das Programm reagiert durch Zurücksenden eines Ergebnisses, das in ein ReturnPacket gehüllt ist.

Dies installiert ein externes Programm, wobei das LinkObject zurückgegeben wird, das für die Verbindung zu diesem Programm verwendet wird.

In[6]:= link = Install["bitsprog"]

Out[6]=

Die Funktion ExternalCall sendet ein CallPacket zum externen Programm.

In[7]:= ?bits

Sie können explizit das CallPacket mit LinkWrite senden. Das erste Argument des CallPacket spezifiziert, welche Funktion im externen Programm aufzurufen ist.

In[8]:= LinkWrite[link, CallPacket[0, {67}]]

Hier ist die Antwort des externen Programms auf das CallPacket.

In[9]:= LinkRead[link]

Out[9]=

Wenn Sie Install verschiedene Male auf ein einzelnes externes Programm anwenden, wird Mathematica verschiedene MathLink-Verbindungen zum Programm öffnen. Jede Verbindung wird jedoch immer einem unverwechselbaren LinkObject entsprechen. Beachten Sie, daß Sie auf einigen Computersystemen möglicherweise eine explizite Kopie der Datei erstellen müssen, die das externe Programm enthält, damit Sie es mehrere Male aufrufen können.

Identifizierung verschiedener Instanzen eines einzelnen externen Programms

:Begin:

:Function: addto

Dies gibt $CurrentLink als ein Argument für addto.

:Pattern: addto[$CurrentLink, n_Integer]

:Arguments: n

:ArgumentTypes: Integer

:ReturnType: Integer

:End:

Dies setzt die globale Variable counter jedesmal, wenn das Programm startet, auf Null.

int counter = 0;

int addto(int n)

counter += n;

return counter;

Dies installiert eine Instanz des externen Programms, das addto enthält.

In[10]:= ct1 = Install["addtoprog"]

Out[10]=

Dies installiert eine andere Instanz.

In[11]:= ct2 = Install["addtoprog"]

Out[11]=

Dies addiert 10 zum Zähler in der ersten Instanz des externen Programms.

In[12]:= addto[ct1, 10]

Out[12]=

Dies addiert 15 zum Zähler in der zweiten Instanz des externen Programms.

In[13]:= addto[ct2, 15]

Out[13]=

Dies führt die Operation nochmal in der ersten Instanz des Programms durch.

In[14]:= addto[ct1, 20]

Out[14]=

Wenn ein externes Programm Informationen über seinen Zustand aufbewahrt, dann kann man mit verschiedenen Instanzen eines Programms verschiedene Zustände darstellen. Mit $CurrentLink läßt sich dann auf jede Instanz eines Programms verweisen.

Der Wert von $CurrentLink wird jedesmal vorübergehend festgelegt, wenn eine bestimmte Programminstanz aufgerufen wird. Dies geschieht auch bei der Erstinstallation jeder Programminstanz.

Senden einer Zeichenkette zur Evaluierung durch Mathematica

Die Zweiweg-Natur der MathLink-Verbindungen ermöglicht nicht nur, daß Mathematica ein externes Programm aufruft, sondern auch, daß das externe Programm Mathematica wieder aufruft.

Im einfachsten Fall kann mit der MathLink-Funktion MLEvaluateString() eine Zeichenkette zu Mathematica gesendet werden. Mathematica wird diese Zeichenkette evaluieren und alle Effekte, die die Zeichenkette spezifiziert, erzeugen. Es wird aber kein Ergebnis der Evaluierung zurück zum externen Programm gegeben.

Um Ergebnisse zurück zu erhalten, müssen Sie explizit ein EvaluatePacket zu Mathematica senden und dann den Inhalt des zurückkommenden ReturnPacket lesen.

...

Dies startet ein EvaluatePacket.

MLPutFunction(stdlink, "EvaluatePacket", 1);

Dies konstruiert den Ausdruck Factorial[7] bzw. 7!.

MLPutFunction(stdlink, "Factorial", 1);

MLPutInteger(stdlink, 7);

Dies zeigt das Ende des Paketes, das Sie gerade konstruieren, an.

MLEndPacket(stdlink);

Dies überprüft das zurückkommende ReturnPacket.

MLCheckFunction(stdlink, "ReturnPacket", &n);

Dies extrahiert aus dem Paket das ganzzahlige Ergebnis für 7!.

MLGetInteger(stdlink, &ans);

...

Senden eines Pakets nach Mathematica

Wenn Sie EvaluatePacket[eingabe] nach Mathematica senden können, mag es im allgemeinen als Reaktion darauf mehrere Pakete erzeugen. Das Endpaket sollte aber ReturnPacket[ausgabe] sein. Im Abschnitt 2.12.12 wird erläutert, wie Folgen von Paketen und Ausdrücke, deren Struktur Sie nicht im voraus kennen, zu behandeln sind.

Spezialthema: Kommunikation mit Mathematica-BenutzeroberflächenSpezialthema: Ausführen von Programmen auf anderen Computern