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 /

Behandlung von Listen, Arrays und anderen Ausdrü{ck}enKommunizieren zwischen Mathematica-Sessionen mit MathLink

2.12.5 Spezialthema: Portabilität von MathLink-Programmen

Die Mathematica-Seite einer MathLink-Verbindung ist so eingerichtet, daß sie auf allen Computersystemen genau gleich funktioniert. Zwischen externen Programmen auf verschiedenen Computersystemen gibt es aber zwangsläufig Unterschiede.

Verschiedene Computersysteme erfordern fast immer unterschiedliche ausführbare Binärprogramme. Wenn Sie Install["prog"] aufrufen, müssen Sie deshalb sicher sein, daß prog einem Programm entspricht, das auf Ihrem speziellen Computersystem ausgeführt werden kann.

Installieren von Programmen auf verschiedenen Computersystemen

Wenn prog eine gewöhnliche Datei ist, dann wird Install["prog"] versuchen, sie auszuführen. Wenn prog dagegen ein Verzeichnis ist, sucht Mathematica nach einem Unterverzeichnis dieses Verzeichnisses, dessen Name mit dem aktuellen Wert von $SystemID übereinstimmt, und versucht dann eine Datei mit Namen prog innerhalb dieses Unterverzeichnisses auszuführen.

Typische Unix-Anweisungen zum Kompilieren externer Programme

Selbst wenn die Binärprogramme eines externen Programms auf verschiedenen Computersystemen unterschiedlich sind, kann es trotzdem der Fall sein, daß der Quellcode in einer Programmiersprache, wie zum Beispiel C, aus dem diese Binärprogramme gewonnen wurden, im wesentlichen der gleiche ist.

Um aber den C-Quellcode portabel zu gestalten, müssen verschiedene Dinge beachtet werden.

Erstens sollten niemals zusätzliche Eigenschaften der Programmiersprache C oder von C-Laufzeit-Bibliotheken genutzt werden, die von einem speziellen System angeboten werden, aber nicht Bestandteil von Standard-C sind. Zusätzlich sollte möglichst vermieden werden, mit segmentierten oder anderen speziellen Speichermodellen zu arbeiten.

Die Include-Datei mathlink.h enthält Standard-C-Prototypen für alle Funktionen in der MathLink-Bibliothek. Unterstützt der Compiler solche Prototypen nicht, können sie ignoriert werden, indem vor #include "mathlink.h" die Vorschrift #define MLPROTOTYPES 0 gesetzt wird. Wenn er Prototypen unterstützt, wird der Compiler jederzeit überprüfen können, ob die Aufrufe an die Funktionen in der MathLink-Bibliothek Argumente geeigneter Typen haben.

MathLink-Funktionen, die spezielle C-Typen verwenden

Auf einigen Computersystemen und mit einigen Compilern kann das int der C-Sprache äquivalent zu einem long sein. Der Standard der Programmiersprache C erlaubt aber gleichermaßen auch, daß int äquivalent zu short sein kann. Wenn Sie vorhaben, MathLink-Bibliotheksfunktionen auf portable Art aufzurufen, ist es wichtig, daß Sie die gleichen Typen wie diese verwenden.

Sobald die Daten an die MathLink-Bibliotheksfunktionen weitergegeben worden sind, achten diese Funktionen auf alle weiteren Probleme, die mit den Unterschieden zwischen den Datendarstellungen auf verschiedenen Computersystemen zu tun haben. So vertauscht zum Beispiel MathLink automatisch Bytes, wenn es Daten zwischen Rechnern austauscht, welche Bytes in einem Wort in verschiedener Reihenfolge speichern, und konvertiert die Gleitpunktformate so, daß möglichst wenig an Genauigkeit verlorengeht.

Manipulieren allgemeiner Zeichenketten

In einfachen C-Programmen ist es üblich, Zeichenketten zu verwenden, die lediglich gewöhnliche ASCII-Zeichen enthalten. In Mathematica aber können Zeichenketten auftreten, die alle möglichen Sonderzeichen enthalten. Diese Zeichen werden in Mathematica mit Unicode-Zeichencodes spezifiziert, wie sie im Abschnitt 2.7.8 erläutert werden.

char *-Zeichenketten der C-Sprache verwenden üblicherweise 8 Bit, um den Code für jedes Zeichen zu speichern. Unicode-Zeichencodes jedoch erfordern 16 Bit. Deshalb arbeiten die Funktionen MLPutUnicodeString() und MLGetUnicodeString() mit Arrays mit unsigned short ganzen Zahlen.

Wenn Sie wissen, daß Ihr Programm nicht mit Sonderzeichen arbeiten muß, dann werden Sie es günstig finden, MLPutByteString() und MLGetByteString() zu verwenden. Diese Funktionen stellen alle Zeichen direkt mit 8-Bit-Zeichencodes dar. Wenn ein Sonderzeichen von Mathematica aus gesandt wird, dann wird es durch MLGetByteString() in einen festen von Ihnen spezifizierten Code konvertiert.

Ein Punkt, der bei der Erstellung von portablen MathLink-Programmen zu beachten ist

Computersysteme und Compiler mit C-Laufzeitbibliotheken, die auf dem Unix-Modell basieren, erlauben MathLink-Programmen, ein main-Programm der Form main(argc, argv) zu haben, welches einfach nur MLMain(argc, argv) aufruft.

Bei einigen Computersystemen müssen main-Programme möglicherweise eine andere Form haben. Man sollte sich bewußt machen, daß man in main() vor dem Aufruf von MLMain() eine beliebige Initialisierung durchführen kann. Sobald man jedoch erst einmal MLMain() aufgerufen hat, geht das Programm in eine unendliche Schleife, in der es auf Anfragen von Mathematica so lange reagiert, bis der Link geschlossen wird.

Behandlung von Listen, Arrays und anderen Ausdrü{ck}enKommunizieren zwischen Mathematica-Sessionen mit MathLink