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

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

Fortgeschrittenes Thema: Fehler- und Interrupt-BehandlungInhalt

2.12.14 Ausführen von Mathematica aus einem externen Programm heraus

Um Mathematica aus einem externen Programm heraus auszuführen, müssen mehrere allgemeine Eigenschaften von MathLink ausgenutzt werden. Zuerst muß geklärt werden, wie man eine MathLink-Verbindung zu Mathematica aufbaut.

Werden MathLink-Schablonen verwendet, um externe Programme zu erzeugen, die von Mathematica aus aufgerufen werden können, wird der Quellcode automatisch für den Aufbau einer MathLink-Verbindung erzeugt. Im externen Programm muß dann nur noch MLMain(argc, argv) aufgerufen werden. Im allgemeinen müssen jedoch diverse Funktionen aufgerufen werden, um eine MathLink-Verbindung aufzubauen.

Öffnen und Schließen von MathLink-Verbindungen

Schließe die Standard-MathLink-Header-Datei ein.

#include "mathlink.h"

int main(int argc, char *argv[]) {

MLENV env;

MLINK link;

long errno;

Dies initialisiert die MathLink-Bibliothek-Funktionen.

env = MLInitialize(0);

Dies öffnet eine MathLink-Verbindung unter Verwendung der gleichen Argumente, wie sie dem Hauptprogramm übergeben wurden.

link = MLOpenArgv(env, argv, argv+argc, &errno);

Dies aktiviert die Verbindung und wartet darauf, daß das andere Programm antwortet.

MLActivate(link);

...

}

Häufig stammen die argv, die MLOpenArgv() übergeben werden, direkt von den argv, die bei Programmstart an main() übergeben wurden. Merken Sie, daß MLOpenArgv() akzeptiert Zeiger zum Anfang und Ende des Arrays argv. Dadurch daß argc nicht direkt verwendet wird, wird vermieden, im voraus die Größe eines int wissen zu müssen.

Die Elemente im argv-Array sind Zeichenketten, die die Argumente und Optionen widerspiegeln, die in den Mathematica-Funktionen LinkLaunch, LinkCreate und LinkConnect verwendet werden.

Mögliche Elemente des argv-Arrays, das an MLOpenArgv() weitergegeben wird

Alternativ zur Funktion MLOpenArgv() kann MLOpenString() verwendet werden, bei der die Parameter in einer einzigen Zeichenkette mit dazwischenliegenden Leerzeichen übergeben werden können.

Sobald eine MathLink-Verbindung zum Mathematica-Kern erfolgreich geöffnet wurde, können anschließend mit den Standard-MathLink-Funktionen Daten mit ihm ausgetauscht werden.

Funktionen, die häufig bei der Kommunikation mit dem Mathematica-Kern verwendet werden

Nachdem alle Teile eines Paketes mit MLPutFunction() usw. gesendet worden sind, muß, so verlangt es MathLink, MLEndPacket() aufgerufen werden, um Synchronisation und Konsistenz sicherzustellen.

Eines der Hauptprobleme beim Schreiben eines externen Programmes, das direkt mit dem Mathematica-Kern kommuniziert, ist die Handhabung der vielen verschiedenen Paketarten, die der Kern erzeugen kann.

Die Funktion MLNextPacket() ermittelt den Kopf des nächsten Paketes, das vom Kern kommt, und liefert eine Konstante, die den Typ des Paketes kennzeichnet.

Einige Pakete, die von MLNextPacket() erkannt werden

Dies liest und verwirft so lange Daten aus dem Link, bis ein Fehler oder ein ReturnPacket gefunden wird.

while ((p = MLNextPacket(link)) && p != RETURNPKT)

MLNewPacket(link);

Wenn Sie für Mathematica eine vollständige Benutzeroberfläche schreiben wollen, müssen Sie mit allen möglichen Paket-Typen, die der Kern erzeugen kann, umgehen können. Dazu benutzt man in der Regel eine geeignete Switch-Konstruktion für den Wert, der von MLNextPacket() zurückgegeben wird.

Das MathLink-Developer's Kit enthält Beispiel-Quellcode für diverse einfache aber dennoch vollständige Benutzeroberflächen.

Datenfluß in Links

Eine Eigenschaft der etwas anspruchsvolleren externen Programme, wie zum Beispiel Benutzeroberflächen, besteht darin, daß sie möglicherweise Operationen durchführen müssen, während sie auf Daten warten, die von Mathematica zu ihnen gesandt werden. Wenn man eine Standard-MathLink-Bibliotheksfunktion, wie zum Beispiel MLNextPacket(), aufruft, wird das Programm normalerweise so lange blockieren, bis alle von der Funktion benötigten Daten verfügbar sind.

Ein Blockieren kann verhindert werden, indem man MLReady() wiederholt und Funktionen wie MLNextPacket() nur dann aufruft, wenn MLReady() nicht mehr länger den Wert 0 zurückgibt. MLReady() ist das Analogon der Mathematica-Funktion LinkReadyQ.

Beachten Sie, daß MathLink manchmal die Daten, die es senden soll, puffert. Um sicherzugehen, daß alle erforderlichen Daten gesendet worden sind, sollten Sie MLFlush() aufrufen. Nur danach ist es sinnvoll, MLReady() aufzurufen und auf Daten zu warten, die zurückgesandt werden.

Fortgeschrittenes Thema: Fehler- und Interrupt-BehandlungInhalt